
Red Hat Linuxでこのコマンドを使用したとき
/usr/sbin/ss -i
以下のような出力が得られます。
State Recv-Q Send-Q Local Address:Port Peer Address:Port
ESTAB 0 0 <IP_ADD:PORT> <IP_ADD:PORT>
ts sack wscale:2,2 rto:204 rtt:4.5/6.5 ato:40 cwnd:3
ESTAB 0 0 <IP_ADD:PORT> <IP_ADD:PORT>
ts sack wscale:2,2 rto:213 rtt:13.875/18.5 ato:40
ESTAB 0 0 <IP_ADD:PORT> <IP_ADD:PORT>
ts sack wscale:2,2 rto:201 rtt:1.875/0.75 ato:40
ESTAB 0 0 <IP_ADD:PORT> <IP_ADD:PORT>
ts sack wscale:9,2 rto:201 rtt:1.875/0.75 ato:40
grep
そのコマンドにパイプしようとするたびにex
:
/usr/sbin/ss -i | grep <SOME_IP_ADD>
この出力があります
ESTAB 0 0 <IP_ADD:PORT> <IP_ADD:PORT>
ESTAB 0 0 <IP_ADD:PORT> <IP_ADD:PORT>
ESTAB 0 0 <IP_ADD:PORT> <IP_ADD:PORT>
grep にはこれが含まれていないことに注意してください:
ts sack wscale:2,2 rto:204 rtt:4.5/6.5 ato:40 cwnd:3
別の行にあるためです。では、このコマンドや他の Linux コマンドを使用するときに、出力が折り返されたり次の行に移動したりしないようにするには、列幅をどのように調整すればよいでしょうか。これを行うより良い方法はありますか?
答え1
grep に-A1
オプションがある場合は、試してください。
折り返しではなく、エントリが別の行にあるようです。
/usr/sbin/ss -i | grep -A1 <SOME_IP_ADD>
Context Line Control
を見てくださいman grep
。
代替案としては、
-P Perl-regex
-z suppress-newline
-o print only matching
例えば:
ss -i | grep -Pzo '.*IPADDRESS.*\n.*'
そうすると、コンテキストによって提供される周囲のダッシュは表示されなくなります。
代わりに sed を使用することもできます:
sed -n '/IPADDRESS/{N;p}'
# Or joining the two lines by:
ss -i | sed -n '/IPADDRESS/N;s/\n/ /p'
awk:
awk '/IPADDRESS/{print; getline; print}'
# Or as joined lines:
awk '/IPADDRESS/{printf "%s ", $0; getline; print}'
答え2
行が 行ts sack ...
の下に置かれるのは、この種類の情報は常にESTAB ...
このようにss
フォーマットされるためです。行は折り返されていません。フラグgrep
を使用して両方の行を含めることができます-A1
。
ss -i | grep <IP ADDRESS> -A1
各一致をコマンドに渡すことで、1 行にまとめることができますsed
。
ss -i | grep <IP ADDRESS> -A1 | sed '/^--$/d;N;s/\n/ /g'