Grep - Linhas de saída contendo cadeia na coluna 3

0

Estou tentando enviar linhas que contenham uma string específica

exemplo de linhas:

Column1:Column2:Column3 + ID
Column1:Column2:Column3 - ID
Column1:Column2:Column3

resultado desejado:

Column1:Column2:Column3 + ID

Tentativas -

awk -F: '$3 == + ID' < file.txt > out.txt

que não retorna nenhuma saída, pois está procurando EXATAMENTE "+ ID" sem nenhuma outra entrada na coluna3

Agora eu sei que posso fazer

grep -f " + ID" <file.txt >out.txt

mas se o + ID não estiver dentro de column3, ele exibirá qualquer linha contendo + ID, exemplo disso seria

saída:

Column1:Column2 + ID:Column3

observe como o + ID está na coluna 2 e não na 3

agora eu também gostaria de fazer isso dentro de um diretório pesquisando todos os arquivos e não apenas um .txt específico

    
por user3255841 09.03.2018 / 02:26

4 respostas

3

Você pode usar uma correspondência de expressão regular, ancorada no final do campo, no lugar de uma correspondência de sequência de caracteres:

awk -F: '$3 ~ /+ ID$/' < file.txt
Column1:Column2:Column3 + ID

ou ancorado no final da linha, com grep :

grep '+ ID$' < file.txt
Column1:Column2:Column3 + ID
    
por 09.03.2018 / 02:31
0
grep -Pie '(Column\d:?){3} + ID$' file.txt > out.txt

se, por exemplo, Coluna1: repetição de padrão maior que 3, então modifique {3,} acima

    
por 11.03.2018 / 01:27
0

Isso pode ser feito através de

find dir -type f -exec grep -H '+ ID$' {} +

Isso localizará todos os arquivos regulares dentro ou abaixo do diretório dir e, em seguida, executará grep -H '+ ID$' em lotes do maior número possível deles. O resultado conterá o nome do arquivo correspondente à expressão regular e as linhas do arquivo correspondente.

Para obter apenas os nomes dos arquivos, use -l no lugar de -H com grep e, para obter apenas as linhas correspondentes, use -L .

A expressão regular + ID$ corresponderá a qualquer linha em um arquivo que contenha a string exata + ID no final da linha.

Ou, sem find , mas com um grep que pode recorrer a subdiretórios:

grep -R '+ ID$' dir

Em sistemas com grep que não faz -H (essa é uma opção não padrão), você pode usar

find dir -type f -exec grep '+ ID$' /dev/null {} +

Se você quiser apenas as linhas correspondentes (e nenhum nome de arquivo) em um sistema como este, cat os arquivos juntos e grep:

find dir -type f -exec cat {} + | grep '+ ID$'
    
por 11.03.2018 / 08:28
-1

Você pode usar substr assim:

awk '{ if (substr($0,position,length)=="+  ID" { print $0 } }' myfile.txt
    
por 09.03.2018 / 16:47

Tags