Como buscar uma palavra em particular a partir de um arquivo txt usando grep no terminal do Ubuntu

4

Eu tenho um arquivo txt . Nesse arquivo, quero filtrar uma palavra específica.

Exemplo:

$PILOT_FIRSTNAME $PILOT_LASTNAME. This is the final confirmation for this flight.

Eu quero saída como:

PILOT_FIRSTNAME

PILOT_LASTNAME

Quais são as palavras com $ , que a palavra só busca?

    
por hikoo 23.08.2016 / 15:30

2 respostas

5

Usando o modo PCRE (expressão regular compatível com perl) do grep:

$ grep -Po '$\K\w*' yourfile
PILOT_FIRSTNAME
PILOT_LASTNAME
  • $ : correspondência literal $
  • \K : (ignore-o)
  • \w : seguido por zero ou mais caracteres de palavras

Se você quiser combinar e manter o caractere literal $ , então você não precisa do modificador \K - e na verdade você não precisa do PCRE, você pode simplesmente use

$ grep -o '$\w*' yourfile
$PILOT_FIRSTNAME
$PILOT_LASTNAME

ou (talvez mais portável)

grep -o '$[_[:alnum:]]*' yourfile
$PILOT_FIRSTNAME
$PILOT_LASTNAME
    
por steeldriver 23.08.2016 / 15:41
5

Portanto, se você quiser imprimir campos do arquivo como separados por nova linha, se começar com $ , poderá fazer:

awk '{for(i=1;i<=NF;i++){if($i~/^$/){printf "%s\n",substr($i,2)}}}' file.txt

Formulário expandido:

awk '{
    for (i=1;i<=NF;i++)
        { if($i~/^$/)
                { printf "%s\n",substr($i,2) }
        }
     }' file.txt

Aqui estamos iterando sobre os campos ( for (i=1;i<=NF;i++) ), se o campo começar com $ ( if($i~/^$/) ), depois imprimindo com uma nova linha inicial a partir do segundo caractere ( printf "%s\n",substr($i,2) ).

Por outro lado, se o número de campos for fixo e não muitos, então sed também é uma opção viável, assumindo aqui dois campos:

sed -nr 's/^$([^[:blank:]]+)[[:blank:]]+$([^[:blank:]]+)$/\n/p' file.txt

Correspondendo $ no início de cada campo separado de espaço em branco, capturando o campo ( ([^[:blank:]]+) ), em seguida, na substituição, defina os campos como separados por nova linha ( 1\n ).

Exemplo:

$ cat file.txt
$PILOT_FIRSTNAME $PILOT_LASTNAME
$FOO $BAR
PILOT_FOO PILOT_BAR

$ awk '{for(i=1;i<=NF;i++){if($i~/^$/){printf "%s\n",substr($i,2)}}}' file.txt
PILOT_FIRSTNAME
PILOT_LASTNAME
FOO
BAR

$ sed -nr 's/^$([^[:blank:]]+)[[:blank:]]+$([^[:blank:]]+)$/\n/p' file.txt
PILOT_FIRSTNAME
PILOT_LASTNAME
FOO
BAR
    
por heemayl 23.08.2016 / 15:40