复制包含单词但不包含其他单词的文件。 / grep无法使用for循环

时间:2018-07-31 05:34:49

标签: linux bash for-loop grep

我是Linux的新手,在尝试使用管道grep或查找命令时陷入困境。我需要找到一个文件:

  • 名称模式request_q _t .xml
  • 包含“短语1”
  • 不包含“单词2”,请将其复制到特定位置。

我尝试使用管道grep命令来定位文件,而不是复制。

for filename in $(grep --include=request_q*_t*.xml -li '"phrase 1"' $d/ | xargs grep -L '"word 2"')
do
    echo "coping file: '$filename'"
    cp $filename $outputpath
    filefound=true
done

当我在命令行中尝试此grep命令时,它的工作正常

grep --include=request_q*_t*.xml -li '"phrase 1"' $d/ | xargs grep -L '"word 2"'

但是在for循环中出现错误。由于某种原因,grep命令的输出为

(Standard Input)
(Standard Input)
(Standard Input)
(Standard Input)
  1. 我不确定自己在做什么错。
  2. 什么是有效的方法。.它是我必须搜索的巨大文件系统。

3 个答案:

答案 0 :(得分:1)

find . -name "request_q*_t*.xml" -exec sh -c "if grep -q phrase\ 1 {} && ! grep -q word\ 2 {} ;then cp {} /path/to/somewhere/;fi;" \;

答案 1 :(得分:1)

您可以将AWK与xargs结合使用。问题是您必须完全读取所有文件,因为它们不能包含单个字符串,但是如果找到该字符串,您也可以提早终止:

awk '(FNR==1){if(a) print fname; fname=FILENAME; a=0}
     /Phrase 1/{a=1}
     /Word 2/{a=0;nextfile}
     END{if(a) print fname}' request_q*_t*.xml \
    | xargs -I{} cp "{}" "$outputpath"

如果要将"Phrase 1""Word 2"存储在变量中,可以使用:

awk -v include="Phrase 1" -v exclude="Word 2"             \
     '(FNR==1){if(a) print fname; fname=FILENAME; a=0}
      ($0~include){a=1}
      ($0~exclude){a=0;nextfile}
      END{if(a) print fname}' request_q*_t*.xml           \
 | xargs -I{} cp "{}" "$outputpath"

答案 2 :(得分:-1)

您可以嵌套$()构造:

for filename in $( grep -L '"word 2"' $(grep --include=request_q*_t*.xml -li '"phrase 1"' $d/ ))
do
    echo "coping file: '$filename'"
    cp $filename $outputpath
    filefound=true
done