2

プロセス ステータス (ps) コマンドからパイプされた特定のポート番号を抽出する必要がありますが、その取得方法がよくわかりません。

たとえば、次の行があるとします (ps -ef | grep "blahblahblah"):

xxremote -xcom.xx.management.xremote.port=9999 -xcom.xx.management.xxxremote.ssl=false 

数字「9999」を抽出するにはどうすればよいですか? 注: これは非常に長い行の一部であり、たとえば awk を使用して "=" 記号の後のフィールド数を数えることはできません。=記号の数が変わります。

cut コマンドを使用してみましたが、必要なものではない単一文字の区切り記号で使用する方法しか知りません。私はおそらく awk または sed がうまくいくと思っていましたか?私は彼らに精通していません。助けてくれてどうもありがとう

ps -ef | grep "blahblahblah" " | awk .... (または sed)

更新:ポート番号は単一の長いテキスト行から抽出する必要があること、および awk コマンドを使用する必要がないことを明確にしました。

4

3 に答える 3

3
ps -ef | sed -n '/blahblahblah/s/^.*port=\([[:digit:]]\+) .*/\1/p'
于 2012-07-11T17:43:29.087 に答える
1

これはそれを行います:

(データがまだフィルタリングされていない場合に備えて、含む行のみをフィルタリングするように更新されました)xremote.port=

ps -elf | awk -F= '/xremote.port=/{print $2}' | awk '{print $1}'

最初のawkコマンドは行を分割=し、2 番目のフィールドは次のようになります。

9999 -xcom.xx.management.xxxremote.ssl

2 番目のawkコマンドは、あなたの番号である this の最初のフィールドを取得します。

9999
于 2012-07-11T17:43:11.310 に答える
1

Awk を使用する必要がありますか? sedより良い選択でしょう...

しかたがない...

ps -ef | awk '/blahblahblah/ {
    sub(".*port=", "")
    sub(" .*", "")
    print $0
}'

sub(a, b)awkのコマンドは、正規表現aを文字列に置き換えますb(私の場合はたまたま空白です。返される行を表す $0 を取ります。

私が言ったように、sedより簡単になります:

ps -ef | sed -n '/blahblahblah/s/^.*port=\([^ ]*\).*/\1/p'

sedblahblahblahを選択し、置換を行うために使用していることに注意してください。

于 2012-07-11T19:39:45.740 に答える