este é o trabalho do awk.
linha com
awk '$3 == "on" '
a palavra que você está procurando
awk '$3 == "on" { print $4 ;}'
-
$3 == "on"
irá obter a linha com "on" como terceira palavra -
{ print $4 ;}
imprimirá a quarta palavra
Eu quero pegar a palavra que está depois de "on" em várias linhas em um arquivo, e se a palavra já aparecer no arquivo, eu quero ignorá-lo. Eu tentei fazer isso:
#!/bin/bash
echo "" > missig_packages.txt
cat log_file.txt | grep depends > dependsLog.txt
function createListOfPackages {
if grep "$1" missig_packages.txt; then
continue
else
echo "$1" >> missig_packages.txt
fi
}
while read line; do
package='cat dependsLog.txt | cut -d" " -f5'
createListOfPackages $package
done < dependsLog.txt
O arquivo dependsLog.txt contém linhas como esta:
libgcc1:amd64 depends on **gcc-4.9-base** (= 4.9.1-0ubuntu1); however:
cinder-volume depends on **cinder-common** (= 1:2015.1.1-0ubuntu2~cloud2);
python-cryptography depends on **python-cffi**.
python-pycadf depends on **python-netaddr**.
Como posso grep
as palavras entre **
e **
(que não estão no texto)? Cada linha começa com " ".
este é o trabalho do awk.
linha com
awk '$3 == "on" '
a palavra que você está procurando
awk '$3 == "on" { print $4 ;}'
$3 == "on"
irá obter a linha com "on" como terceira palavra { print $4 ;}
imprimirá a quarta palavra Seu fragmento de script de shell inteiro pode ser substituído por:
awk '/depends on/ { print $4}' log_file.txt | sed -e 's/\.$//' | sort -u > missing_packages.txt
O script sed retira o .
dos nomes dos pacotes, em que a linha de entrada não possui informações de versão.
Tente o seguinte comando, que irá chamar a palavra após 'on' de dependLogs.txt e, em seguida, irá inserir "" no início da linha.
cat dependsLog.txt | grep -oP "(?<=on )[^ ]+" | sed 's/^/\"\"/' >> missig_packages.txt
Para garantir que as linhas não sejam duplicadas, você pode classificar e uniq seguindo o comando.
cat dependsLog.txt | grep -oP "(?<=on )[^ ]+" | sed 's/^/\"\"/' | sort | uniq >> missig_packages.txt
Tags bash