いずれかのプロセスがポート 80 でリッスンしている場合に bash を使用して grep したいのですが、他のポート番号に出くわして困っています。これをgrepでフィルタリングするにはどうすればよいですか?
netstat -ant|grep LISTEN|grep 80|wc -l
また、8080 8088 などの他のレコードも出力します。
私は自分の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)は、その中に、、と書かESTABLISHED
れCLOSED
ているフィールド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
使用されている区切り文字のいずれであっても、機能します。
の出力を 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
要するに、ジョブに適したツールを使用して必要なパラメーターを直接クエリすることで、そもそもテキストベースのフィルタリングを行う必要がなくなります。
grep ":80 "
の代わりに使用grep 80
ポートの前にコロン ( など) があるという事実を利用できます:80
。断食は次のようになります。
netstat -ant | grep ':80\b.*LISTEN'
grep
そうすれば、 2回呼び出すことはありません。また、grep には との一致をカウントする機能がある-c
ため、代わりにそれを使用できますwc
。
netstat -ant | grep -c ':80\b.*LISTEN'
より堅牢にしたい場合は、次のことができます
netstat -ant |egrep "^tcp +[[:digit:]]+ +[[:digit:]]+ +[[:digit:]\.]+\:80 +.*LISTEN *$"