我是Linux的新手,在尝试使用管道grep或查找命令时陷入困境。我需要找到一个文件:
我尝试使用管道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)
答案 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