Bashで特定の単語をgrepする方法

Bashで特定の単語をgrepする方法

ファイルの複数行で「on」の後に続く単語をキャプチャしたいと思います。その単語がすでにファイルにある場合はスキップしたいと思います。私はこれを試みます:

#!/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

dependencyLog.txt ファイルには、次の行が含まれています。

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

grep(テキスト自体にはない)との間の単語をどのように見つけることができますか?各行は ""で始まります。****

答え1

これがawkの仕事です。

そしてオンラインにアクセスする

awk '$3 == "on" '

あなたが探している言葉

awk '$3 == "on" { print $4 ;}'
  • $3 == "on"3番目の単語「on」を含む行を取得します。
  • { print $4 ;}4番目の単語を印刷します

答え2

完全なシェルスクリプトの断片は、次のように置き換えることができます。

awk '/depends on/ { print $4}' log_file.txt | sed -e 's/\.$//' | sort -u > missing_packages.txt

.sedスクリプトは、バージョン情報のない入力行からパッケージ名の尾を削除します。

答え3

dependentLogs.txtで、「on」の後に続く単語を見つけて、先頭に「」を挿入する次のコマンドを試してください。

cat dependsLog.txt | grep -oP "(?<=on )[^ ]+" | sed 's/^/\"\"/' >> missig_packages.txt

行が重複しないようにするには、次のコマンドで並べ替えて一意にすることができます。

cat dependsLog.txt | grep -oP "(?<=on )[^ ]+" | sed 's/^/\"\"/' | sort | uniq >> missig_packages.txt

関連情報