如何在 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

文件dependsLog.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"将得到第三个单词为“on”的行
  • { print $4 ;}将打印第四个单词

答案2

您的整个 shell 脚本片段可以替换为:

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

.sed 脚本会删除输入行没有版本信息的包名称的尾部。

答案3

尝试以下命令,该命令将从 dependentLogs.txt 中的“on”之后 grep 单词,然后在行首插入“”。

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

为了确保行不重复,您可以通过以下命令进行排序和 uniq。

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

相关内容