当我在 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
您可以通过命令传递每个匹配项并将其合并到一行sed
:
ss -i | grep <IP ADDRESS> -A1 | sed '/^--$/d;N;s/\n/ /g'