Usando awk
, preciso encontrar uma palavra em um arquivo que corresponda a um padrão regex.
Desejo apenas imprimir a palavra que corresponde ao padrão.
Então, se estiver na linha, tenho:
xxx yyy zzz
E padrão:
/yyy/
Eu quero apenas obter:
yyy
EDIT: graças ao kurumi consegui escrever algo assim:
awk '{
for(i=1; i<=NF; i++) {
tmp=match($i, /[0-9]..?.?[^A-Za-z0-9]/)
if(tmp) {
print $i
}
}
}' $1
e isso é o que eu precisava :) muito obrigado!
tmp=match($i, /regexp);if(tmp){}
, você só deve ser capaz de fazerif(tmp ~ $i){}
porque~
significa "corresponde ao regexp".Respostas:
Este é o básico
peça
awk
para pesquisarpattern
usando e//
, em seguida, imprima a linha, que por padrão é chamada de registro, denotada por $ 0. Pelo menos leia a documentação .Se você deseja apenas imprimir a palavra correspondente.
fonte
print
é a ação padrão:awk '/pattern/' file
será suficiente.for
loop funcionar se (a) "yyy" for uma expressão regular e não uma string reta e (b) se "yyy" não corresponder a um campo inteiro dentro uma gravação.$i=="yyy"
; seria$i ~ /yyy/
para uma expressão regular.Parece que você está tentando emular o
grep -o
comportamento do GNU . Isso fará isso, desde que você queira apenas a primeira correspondência em cada linha:Aqui está um exemplo, usando a
awk
implementação GNU (pasmo):Leia sobre
match
,substr
,RSTART
eRLENGTH
noawk
manual.Depois disso, você pode desejar estender isso para lidar com várias correspondências na mesma linha.
fonte
gawk pode obter a parte correspondente de cada linha usando isso como ação:
fonte
Se você está interessado apenas na última linha de entrada e espera encontrar apenas uma correspondência (por exemplo, uma parte da linha de resumo de um comando shell), você também pode tentar este código muito compacto, adotado de Como imprimir correspondências de regexp usando `awk`? :
Ou a versão mais complexa com um resultado parcial:
Aviso: a
awk
match()
função com três argumentos só existe emgawk
, não emmawk
Aqui está outra boa solução usando um regex lookbehind em
grep
vez deawk
. Esta solução tem requisitos mais baixos para sua instalação:fonte
Se Perl for uma opção, você pode tentar o seguinte:
Para implementar a correspondência que não diferencia maiúsculas de minúsculas, adicione o
i
modificadorPara imprimir tudo APÓS a partida:
Para imprimir a partida e tudo depois da partida:
fonte
Usar o sed também pode ser elegante nessa situação. Exemplo (substitua a linha pelo grupo correspondente "yyy" da linha):
Página do manual relevante: https://www.gnu.org/software/sed/manual/sed.html#Back_002dreferences-and-Subexpressions
fonte
sed -n 's/^.*\(yyy\).*$/\1/gp' < testfile
Fora do tópico, isso também pode ser feito usando o grep, apenas postando aqui caso alguém esteja procurando por uma solução grep
fonte
Se você souber em qual coluna está o texto / padrão que está procurando (por exemplo, "yyy"), você pode apenas verificar essa coluna específica para ver se corresponde e imprimi-la.
Por exemplo, dado um arquivo com o seguinte conteúdo, (chamado asdf.txt )
para imprimir apenas a segunda coluna se ela corresponder ao padrão "yyy", você pode fazer algo assim:
Observe que isso também corresponderá basicamente a qualquer linha em que a segunda coluna contenha um "yyy", como estes:
fonte