Como grep específica uma palavra no bash

0

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 " ".

    
por Idan 20.09.2015 / 17:34

3 respostas

3

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
por 20.09.2015 / 17:43
1

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.

    
por 21.09.2015 / 03:47
1

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
    
por 20.09.2015 / 18:04

Tags