我想在文件中搜索特定单词,然后只显示未找到的单词。到目前为止,由于我在这方面的技能有限,我可以找到找到的单词:
egrep -w "^bower_components|^npm-debug.log" .gitignore
如果我的 .gitignore 文件包含 bower_components 但不包含 npm-debug.log ,则会返回 bower_components 。我想知道如何要求它只返回未找到的模式部分。也就是说,我希望它只返回 npm-debug.log 。我不希望看到文件中与搜索不匹配的所有文本,只查看未找到的文件中的单个单词。我该怎么做?
答案 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 -v
中words
为他们。同时在中间添加uniq
以删除任何重复项。
所以最后我们得到的words
中的模式与file
中没有匹配:
> grep -owf words file | uniq | grep -vf - words
row
other
^another