Как настроить ширину столбца в выводе команды 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

Вы можете объединить каждое совпадение в одну строку, передав его через sedкоманду:

ss -i | grep <IP ADDRESS> -A1 | sed '/^--$/d;N;s/\n/ /g'

Связанный контент