grep -A1 'blah' logfile
Graças a esse comando para cada linha que contém 'blá', recebo a saída da linha que contém 'blá' e a próxima linha que segue no arquivo de log. Pode ser simples, mas não consigo encontrar uma maneira de omitir a linha que tem 'blá' e mostrar apenas a próxima linha na saída.
-A1
opçãocurl whatismyip.org | grep -A1 'Your IP Address'
-A1
. Obrigado!Respostas:
você pode tentar com o awk:
fonte
awk '/blah/{getline; getline; print}' logfile
se você deseja manter o grep:
ou
fonte
Piping é seu amigo ...
Use
grep -A1
para mostrar a próxima linha após uma partida e, em seguida, canalize o resultadotail
e pegue apenas 1 linha,fonte
Ótima resposta do raim, foi muito útil para mim. É trivial estender isso para imprimir, por exemplo, a linha 7 após o padrão
fonte
Se as próximas linhas nunca contiverem 'blá', você poderá filtrá-las com:
O uso de
cat logfile | ...
não é necessário.fonte
Em geral, concordo que você esteja solicitando muito grep aqui e que outra ferramenta pode ser a melhor solução. Mas em um ambiente incorporado, talvez eu não queira ter
sed
ouawk
apenas fazer isso. Descobri que a seguinte solução funciona (desde que não sejam correspondências contíguas):Basicamente, combine-os, acrescentando 1 linha de contexto para cada correspondência e, em seguida, passe-a através de uma correspondência inversa do seu padrão original para removê-las. É claro que isso significa que você pode assumir que seu padrão não aparece na linha "próxima".
fonte
Muitas boas respostas foram dadas a essa pergunta até agora, mas ainda sinto falta de uma por
awk
não usargetline
. Desde que, em geral , não é necessário usargetline
, eu iria para:ou
A lógica sempre consiste em armazenar a linha onde "blá" é encontrado e, em seguida, imprimir as linhas que são uma linha depois.
Teste
Arquivo de exemplo:
Obter todas as linhas depois de "blá". Isso imprime outro "blá" se aparecer após o primeiro.
Obtenha todas as linhas após "blá" se elas não contiverem "blá".
fonte
Não conheço nenhuma maneira de fazer isso com o grep, mas é possível usar o awk para obter o mesmo resultado:
fonte
alerta one-liner perl
só por diversão ... imprima apenas uma linha após a partida
ainda mais divertido ... imprima as próximas dez linhas após a partida
meio que trapaceando, já que na verdade existem dois comandos
fonte
$. == $next && print
é o mesmo queprint if $. == $next
grep -A1
). Se você deseja imprimir apenas as próximas linhas, mas nunca uma linha com uma correspondência, mantenha-a nessa ordem. (apenas observando como $ next seria derrotado por partidas consecutivas) #Parece que você está usando a ferramenta errada lá. O Grep não é tão sofisticado, acho que você deseja aumentar o awk como a ferramenta para o trabalho:
awk '/blah/ { getline; print $0 }' logfile
Se você tiver algum problema, avise-me, acho que vale a pena aprender um pouco do awk, é uma ótima ferramenta :)
ps Este exemplo não ganha um 'prêmio de uso inútil de gato';) http://porkmail.org/era/unix/award.html
fonte
grep / Padrão / | cauda -n 2 | cabeça -n 1
Cauda primeiro 2 e depois cabeça última para obter exatamente a primeira linha após a partida.
fonte