Como ajustar a largura da coluna na saída do comando do Linux

4

Quando eu usei este comando no Red Hat Linux

/usr/sbin/ss -i

Eu recebo a seguinte saída abaixo:

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

Sempre que eu tento canalizar grep para esse comando ex :

/usr/sbin/ss -i | grep <SOME_IP_ADD>

Eu tenho esta saída

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>

Observe que o grep não incluiu isto:

ts sack wscale:2,2 rto:204 rtt:4.5/6.5 ato:40 cwnd:3

porque está em outra linha. Então, como faço para ajustar a largura da coluna sempre que eu uso este comando ou outros comandos do Linux para esse assunto. De modo que a saída não vai quebrar a palavra ou ir para a próxima linha? São suas melhores maneiras de fazer isso?

    
por dimas 24.04.2013 / 02:32

2 respostas

5

Se o seu grep o tiver, tente a opção -A1 .

Parece que não é um caso de quebra automática, mas que a entrada está em uma linha separada.

/usr/sbin/ss -i | grep -A1 <SOME_IP_ADD>

Veja Context Line Control em man grep .

Uma alternativa seria usar

-P Perl-regex 
-z suppress-newline
-o print only matching

como em:

ss -i | grep -Pzo '.*IPADDRESS.*\n.*'

Então você não verá os traços ao redor que o contexto fornece.

Uma alternativa pode ser 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}'
    
por 24.04.2013 / 03:00
3

A linha ts sack ... é colocada abaixo da linha ESTAB ... porque é assim que ss formata sempre esse tipo de informação. Não está sendo embrulhado em linha. Você pode incluir as duas linhas em grep usando o sinalizador -A1 :

ss -i | grep <IP ADDRESS> -A1

Você pode combinar cada correspondência em uma linha passando-a por um comando sed :

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