Assumindo que seu arquivo é delimitado por tabulação (tsv)
cut -f 2 abcd.txt | egrep '[13579]$'
deve fazer o truque.
Se você estiver trabalhando com diferentes delimitadores ou mesmo com largura fixa, consulte man cut
(especificamente, as opções -d
e -c
)
Bônus: adicione | uniq
para remover duplicatas
edit: omita a parte cut
se não quiser remover os endereços IP: egrep '[13579]$' abcd.txt
edit: adicione algumas explicações
cut
é um utilitário que opera linha por linha e permite selecionar quais partes da linha você deseja gerar.
Você pode especificar isso por posição de caractere com a opção -c
(útil com campos de comprimento fixo) ou por campo com o -f
(se seus dados forem separados por campos).
Se você usa -f
, o delimitador de campo é assumido como sendo o caractere, ou você pode especificar um diferente com -d
.
echo -e 'abcdefghij\nabcdefghij' # two lines
echo -e 'abcdefghij\nabcdefghij' | cut -c 2-4,7 # selects characters from position 2 to 4 and 7
echo -e 'aa,bb,cc,dd\nAA,BB,CC,DD' # space-delimited fields
echo -e 'aa,bb,cc,dd\nAA,BB,CC,DD' | cut -d , -f 3 # prints only the 3rd field
egrep
(que é o mesmo que grep -e
) seleciona linhas que correspondem à expressão regular dada . A expressão [13579]$
significa que tem um dígito ímpar no final da linha , então egrep
mostra apenas a linha que termina em dígitos ímpares.
Expressões regulares são super engenhosas e úteis ao manipular texto, e assim você as encontrará em muitos utilitários de linha de comando, editores de texto e linguagens de programação - elas podem parecer enigmáticas no início, mas não precisam ser um especialista para a maioria das tarefas e se você ler um pouco sobre o tópico (e experimentar!), você vai rapidamente entender a essência dele.
edit: substituiu (1|3|5|7|9)$
por [13579]$
de acordo com a sugestão @HaukeLaging