Linux コマンド出力の列幅を調整する方法

Linux コマンド出力の列幅を調整する方法

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'

関連情報