Extraindo usando o awk em uma coluna específica

2

Eu tenho 4 campos e quero começar da última coluna e ignorar as 3 primeiras colunas. Como posso usar o NF no awk para fazer isso?

root     pts/0        192.168.108.1    Mon Mar 19 08:45   still logged in
root     tty1                          Mon Mar 19 08:45   still logged in
reboot   system boot  3.10.0-693.el7.x Mon Mar 19 08:44 - 08:49  (00:04)
root     pts/0        192.168.108.1    Sun Mar 18 13:06 - crash  (19:37)
root     tty1                          Sun Mar 18 13:06 - crash  (19:38)
reboot   system boot  3.10.0-693.el7.x Sun Mar 18 13:01 - 08:49  (19:47)
root     pts/2        192.168.108.1    Sat Mar 17 12:38 - 13:09  (00:31)
root     pts/1        192.168.108.1    Sat Mar 17 10:49 - down   (02:20)
root     pts/1        192.168.108.1    Fri Mar 16 23:17 - 00:30  (01:13)
root     pts/0        192.168.108.1    Fri Mar 16 21:25 - 12:56  (15:31)
root     tty1                          Fri Mar 16 21:25 - 13:09  (15:44)
reboot   system boot  3.10.0-693.el7.x Fri Mar 16 21:04 - 13:09  (16:05)
root     pts/2        192.168.108.1    Fri Mar 16 08:45 - crash  (12:18)
root     tty1                          Fri Mar 16 08:45 - 17:25  (08:40)
syslog                                          **Never logged in**

Eu quero mostrar apenas:

Sun Jan 19 13:52:08 -0800 2018
**Never logged in**
Fri Mar 16 08:45 - 17:25  (08:40)
Mon Mar 19 08:45   still logged in
    
por Cell-o 18.03.2018 / 10:36

2 respostas

5

Você poderia fazer isso com um simples comando awk para imprimir o último conteúdo da coluna e usar vários espaços como o separador de campo. Como o separador padrão em awk é um único espaço em branco, usá-lo diretamente na última coluna dividiria o conteúdo da última coluna. A condição NR> cuida de pular a primeira linha ao aplicar as ações reais definidas para awk .

awk -F '[[:space:]][[:space:]]+' 'NR>1{print $NF}' file

ou usando sed também, assumindo vários espaços entre colunas e palavras separadas por colunas somente na última coluna.

sed '1d;s/^.*  //' file

OP aparentemente reescreveu a pergunta para descarregar a saída do comando last column do qual eles queriam a saída da última coluna. Como as próprias colunas intermediárias podem ter espaços, fazemos uma correspondência da coluna que contém o nome do dia e imprimimos a partir daí até o final da linha, ou seja,

last | awk ' {
     for( i=1;i<=NF;i++ ) {
         if ( $i ~ /Mon|Tue|Wed|Thu|Fri|Sat|Sun/ ) {
             j = 0
             str = ""
             for ( j=i; j<=NF;j++ ) {
                 str = ( str ? (str FS $j):$j )
             }
             print str
             break
         }
     }
 }'
    
por 18.03.2018 / 10:39
0

Para a versão original da pergunta, eu gostei e votei a resposta de Inian, e deletei esta, mas agora que a pergunta mudou ...

awk 'NR>1{if ($2~/^\*\*/) $2=foo;if ($3!~/^[[:digit:].]+$/) $3=foo; $1=$2=$3="";print}' file

As declarações if devem colocar valores fictícios na segunda e na terceira colunas se a segunda for **Never ou se a terceira não for um endereço IP, mas fará com que a resposta falhe se existirem outras possibilidades funky. .

Por questões de legibilidade, vamos postar novamente o one-liner, já que é um pouco longo ...

awk 'NR > 1 {
  if ( $2 ~ /^\*\*/ ) $2=foo
  if ( $3 !~ /^[[:digit:].]+$/ ) $3=foo
  $1=$2=$3=""
  print }' file
    
por 18.03.2018 / 12:14

Tags