6

いずれかのプロセスがポート 80 でリッスンしている場合に bash を使用して grep したいのですが、他のポート番号に出くわして困っています。これをgrepでフィルタリングするにはどうすればよいですか?

netstat -ant|grep LISTEN|grep 80|wc -l

また、8080 8088 などの他のレコードも出力します。

4

6 に答える 6

8

私は自分のnetstatコマンドの出力を見ています、そしてこれを見ています:

tcp4       0      0  10.0.1.10.56941        64.34.119.101.80       ESTABLISHED
tcp4       0      0  10.0.1.10.56936        64.34.119.101.80       ESTABLISHED
tcp4       0      0  10.0.1.10.56932        64.34.119.101.80       ESTABLISHED
tcp4       0      0  10.0.1.10.56929        64.34.119.101.80       ESTABLISHED
tcp4       0      0  10.0.1.10.56922        64.34.119.101.80       ESTABLISHED
tcp4       0      0  10.0.1.10.56914        64.34.119.101.80       ESTABLISHED
tcp4       0      0  *.*                    *.*                    CLOSED     
tcp46      0      0  *.80                   *.*                    LISTEN     
tcp4       0      0  127.0.0.1.49153        *.*                    LISTEN     
tcp4       0      0  127.0.0.1.49152        *.*                    LISTEN     
tcp4       0      0  *.631                  *.*                    LISTEN     
tcp6       0      0  *.631                  *.*                    LISTEN     

ポートは、5つの部分からなる点線の出力の最後の番号であると思います。つまり、

grep "\.80 " 

ポート80のみ\.をピックアップします。期間をピックアップするように言います。(通常、ピリオドは正規表現の任意の文字を意味します)。また、の後にスペースを入れることで80、ポート8080を取得しないことが保証されます。実際、ポート8080に含まれるIPアドレスを取得しないことが保証され.80ます。

awk実際、の代わりに使用することをお勧めしますgrep。を使用awkすると、フィールドを指定して、もう少し処理を行うことができます。

$ netstat -ant | awk '$6 == "LISTEN" && $4 ~ /\.80$/' | wc -l

awk各列で自動的に個別のフィールドになります。フィールド#6(awkで$ 6)は、その中に、、と書かESTABLISHEDCLOSEDているフィールドLISTENです。フィールド$4は最初の列のIPアドレスです。

上記では、6番目のフィールドにLISTENという単語があり、フィールド#4が正規表現と一致する行を探しています\.80$。は$文字列の末尾へのアンカーであり、\.は小数点を取得しており、文字を表していません。このawkコマンドは、一致する各行を自動的に出力するため、指定する必要はありません。

Awkは本当にプログラミング言語です。これは、ファイルの各行の読み取りループを想定しています。BEGINファイルが読み取られる前に実行される句と、ファイルが読み取られた後に実行される句を含めることができENDます。さまざまなフィールドに番号が付けられ、ドル記号で表されます。特別な$0変数は行全体を表します。NFのような特別な変数は、1行のフィールド数を示し、NRは、読み込まれた行数を示します。また、テキストの解析などに役立つ多数の関数があります。これは、awk基本的にスクリプトの本格的なバージョンです。はすべてをレイアウトし、独自の行カウントを行うため、にパイプする必要はありませんwc -l

$ netstat -ant | awk '
      BEGIN {total = 0}
      END {print "There are " total " lines I found"}
      {
          if ($6 == "LISTEN" && $4 ~ /\.80$/) {
              total = total + 1
          }
      }'

付属物

OPは次の出力を取得します。

tcp       0      0  0.0.0.0:8080        0.0.0.0:*       LISTEN

この場合、次のいずれかを試してください。

$ netstat -ant | awk '$6 == "LISTEN" && $4 ~ /:80$/' | wc -l

\.がまたはに置き換えられた場合:...

$ netstat -ant | awk '$6 == "LISTEN" && $4 ~ /[\.:]80$/' | wc -l

[\.:]コロンであろうとピリオドであろうと、どちらがそれを取得するのかを使用します。一体、ずっと行くのもいいかもしれない...

$ netstat -ant | awk '$6 == "LISTEN" && $4 ~ /[^0-9]80$/' | wc -l

[^0-9]数字ではないことを意味します。あなたはそれを間違えることはできません。このように、ピリオド、コロン、セミコロン、コンマ、またはバージョンでnetstat使用されている区切り文字のいずれであっても、機能します。

于 2012-05-17T02:54:42.140 に答える
4

の出力を grep する代わりに (netstat必要以上の情報を要求してから、その大部分を破棄します) fuser、気になるポートが開いているプロセスを単純に尋ねます。

$ fuser -n tcp 4005
4005/tcp:            19339

-qプロセスが問題のポートを開いているかどうかだけを知りたい場合は、引数を使用して fuser を使用し、その終了ステータスを操作することで、出力をまったく処理する必要なく、さらに迅速かつ効率的にこれを行うことができます。

if fuser -q -n tcp 4005 ; then
    echo "port is in use"
else
    echo "port not in use"
fi

リモートポートへの接続数を知りたい場合は、フューザーもそれを行うことができます:

fuser -n tcp ,,80

...または特定のホストのリモートポートへの接続:

fuser -n tcp ,1.2.3.4,80

要するに、ジョブに適したツールを使用して必要なパラメーターを直接クエリすることで、そもそもテキストベースのフィルタリングを行う必要がなくなります。

于 2012-05-17T03:03:07.283 に答える
3

grep ":80 "の代わりに使用grep 80

于 2012-05-17T02:03:11.037 に答える
2

ポートの前にコロン ( など) があるという事実を利用できます:80。断食は次のようになります。

netstat -ant | grep ':80\b.*LISTEN'

grepそうすれば、 2回呼び出すことはありません。また、grep には との一致をカウントする機能がある-cため、代わりにそれを使用できますwc

netstat -ant | grep -c ':80\b.*LISTEN'
于 2012-05-17T02:11:50.830 に答える
0

より堅牢にしたい場合は、次のことができます

netstat -ant |egrep  "^tcp +[[:digit:]]+ +[[:digit:]]+ +[[:digit:]\.]+\:80 +.*LISTEN *$"
于 2012-05-17T06:50:23.017 に答える