列出grep

时间:2017-11-10 16:39:59

标签: linux ubuntu grep

我想在文件中搜索特定单词,然后只显示未找到的单词。到目前为止,由于我在这方面的技能有限,我可以找到找到的单词:

egrep -w "^bower_components|^npm-debug.log" .gitignore

如果我的 .gitignore 文件包含 bower_components 但不包含 npm-debug.log ,则会返回 bower_components 。我想知道如何要求它只返回未找到的模式部分。也就是说,我希望它只返回 npm-debug.log 。我不希望看到文件中与搜索不匹配的所有文本,只查看未找到的文件中的单个单词。我该怎么做?

3 个答案:

答案 0 :(得分:2)

我没有为你准备一个班轮,但是一个简短的脚本适用于你的用例。

file=$1
shift
for var in "$@"
do
  found=`grep "^$var" $file`
  if [[ -z $found ]]
  then
   echo $var
  fi
done

解释,将第一个参数作为文件名,将任何后续参数作为要在文件中测试的字符串。循环遍历这些参数并测试grep命令的结果,看它是否返回空。如果确实如此,则找不到该字符串,我们将其打印到控制台。 用法:[script name] .gitignore bower_components npm-debug.log

答案 1 :(得分:2)

我不认为只用grep可以做到这一点;这是一个笨拙的单行:

awk -v p1="npm-debug.log" -v p2="bower-component" 'BEGIN{a[p1]=0;a[p2]=0} $0 ~ p1 {a[p1]+=1}; $0 ~ p2 {a[p2]+=1}; END{for(i in a){if( a[i]==0){print i}}}' .gitignore

我将搜索模式作为变量传递给awk,使用模式作为索引预先填充数组,如果它们匹配则递增它们,并且仅打印没有匹配的数据(仍为0)

答案 2 :(得分:0)

如果您的示例中只有简单的单词,则可以在单行中使用两个grep命令执行此操作。例如:

文件:

first line
_another line
just another line
STRANGE LINE
last line

<强>词:

first
last
row
other
^another
LINE$

我们可以先得到匹配的模式

> grep -owf words file
first
LINE
last

然后我们在grep -vwords为他们。同时在中间添加uniq以删除任何重复项。

所以最后我们得到的words中的模式与file中没有匹配:

> grep -owf words file | uniq | grep -vf - words
row
other
^another