processamento de log / exclusão de entrada, multi-pipe (grep sed grep), log percorrido duas vezes. esta solução pode ser melhorada?

0

Existe uma maneira mais limpa? Uma única passagem do arquivo grande input.txt seria preferida. Solução até agora:

grep -e "\[.*fred" input.txt |sed 's/.*\[\([^]]*\)\].*//g' |grep -vf /dev/stdin input.txt

Explicação:

grep -e "\[.*fred" input.txt |

Encontre as linhas marcadas com "fred" que têm um colchete esquerdo antes de "fred" na linha. enviar para

sed 's/.*\[\([^]]*\)\].*//g' |

Encontre os IDs entre os colchetes, identificando todas as entradas "fred" no arquivo. O número das mesmas entradas de ID por tag "fred" não é fixo, o exemplo mostra 2 linhas por "fred", mas pode ser qualquer número. enviar para

grep -vf /dev/stdin input.txt

remova todas as linhas com esses IDs do arquivo. (substitua / dev / stdin por '-', por exemplo, entrada canalizada, conforme necessário)

input.txt:

Jan  2 10:45:01 TecMint CRON[3383]: pam_unix(cron:session): session opened for user root by (fred)
Jan  2 10:45:01 TecMint CRON[3383]: pam_unix(cron:session): session closed for user root
Jan  2 10:51:34 TecMint sudo:  tecmint : TTY=unknown ; PWD=/home/tecmint ; USER=root ; COMMAND=/usr/lib/linuxmint/mintUpdate/checkAPT.py
Jan  2 10:51:34 TecMint sudo: pam_unix(sudo:session): session opened for user root by (fred)
Jan  2 10:51:39 TecMint sudo: pam_unix(sudo:session): session closed for user root
Jan  2 10:55:01 TecMint CRON[4099]: pam_unix(cron:session): session opened for user root by (fred)
Jan  2 10:55:01 TecMint CRON[4099]: pam_unix(cron:session): session closed for user root
Jan  2 11:05:01 TecMint CRON[4138]: pam_unix(cron:session): session opened for user root by (fred)
Jan  2 11:05:01 TecMint CRON[4138]: pam_unix(cron:session): session closed for user root
Jan  2 11:09:01 TecMint CRON[4146]: pam_unix(cron:session): session opened for user root by (fred)
Jan  2 11:05:01 TecMint CRON[4199]: pam_unix(cron:session): session opened for user root by (bill)
Jan  2 11:05:01 TecMint CRON[4199]: pam_unix(cron:session): session closed for user root

Saída desejada:

Jan  2 10:51:34 TecMint sudo:  tecmint : TTY=unknown ; PWD=/home/tecmint ; USER=root ; COMMAND=/usr/lib/linuxmint/mintUpdate/checkAPT.py
Jan  2 10:51:34 TecMint sudo: pam_unix(sudo:session): session opened for user root by (fred)
Jan  2 10:51:39 TecMint sudo: pam_unix(sudo:session): session closed for user root
Jan  2 11:05:01 TecMint CRON[4199]: pam_unix(cron:session): session opened for user root by (bill)
Jan  2 11:05:01 TecMint CRON[4199]: pam_unix(cron:session): session closed for user root
    
por BillDoor 06.10.2018 / 09:31

1 resposta

0

Eu acho que se você quiser excluir em qualquer lugar do arquivo linhas que correspondam aos IDs extraídos de qualquer lugar no arquivo, então não há como fazer isso em uma única passagem.

No entanto, se você precisar excluir apenas as linhas da partida mais recente, poderá fazer algo como:

$ perl -lne '$pid = $1 if /(\[.*?\]).*fred/; print unless index($_,$pid) > -1' input.txt 
Jan  2 10:51:34 TecMint sudo:  tecmint : TTY=unknown ; PWD=/home/tecmint ; USER=root ; COMMAND=/usr/lib/linuxmint/mintUpdate/checkAPT.py
Jan  2 10:51:34 TecMint sudo: pam_unix(sudo:session): session opened for user root by (fred)
Jan  2 10:51:39 TecMint sudo: pam_unix(sudo:session): session closed for user root
Jan  2 11:05:01 TecMint CRON[4199]: pam_unix(cron:session): session opened for user root by (bill)
Jan  2 11:05:01 TecMint CRON[4199]: pam_unix(cron:session): session closed for user root
    
por 06.10.2018 / 09:44