我想检查bash中是否存在文件中的多行。
所以我使用grep -q
只使用一行:
if grep -q string1 "/path/to/file";then
echo 'exists'
else
echo 'does not exist'
fi
我尝试了各种组合的很多东西,例如:
if grep -q [ string1 ] && grep -q [ string2 ] "path/to/file";then
我也尝试了-E
:
grep -E 'pattern1' filename | grep -E 'pattern2'
但似乎没有任何效果。有什么想法吗?
答案 0 :(得分:3)
您可以使用此grep
命令断言文件中存在多个字符串,而不是运行多个gnu-awk
命令:
awk -v RS='\\Z' '/string1/ && /string2/ && /string3/{e=1} END{exit !e}' file &&
echo 'exists' || echo 'does not exist'
RS=\Z
将使awk读取单个记录分隔符中的所有输入&&
将确保输入文件中存在所有搜索字词exists
。答案 1 :(得分:1)
你可以这样做:
if grep -q 'string1' /path/to/file; then
if grep -q 'string2' /path/to/file; then
echo exists
else
echo 'does not exist'
else
echo 'does not exist'
fi
或者:
grep -q 'string1' /path/to/file &&
grep -q 'string2' /path/to/file &&
echo exists ||
echo 'does not exist'
答案 2 :(得分:1)
您的问题中存在一些含糊之处,但假设您希望pattern_1和pattern_2存在于文件中(不在同一行),那么您可以执行此操作。
for file in *; do
egrep -q pattern_1 $file && egrep -q pattern_2 $file && echo $file
done
答案 3 :(得分:1)
使用grep -p
,您可以匹配同一行中的多个模式:
grep -P '(?=.*string1)(?=.*string2)' file
以上内容将打印与string1
和string2
匹配的行。
(?=...)
是一个positive lookaheads,它匹配模式而不会使其成为匹配的一部分。
而-z
会淹没整个文件:
% seq 1 100 | grep -qzP '(?=.*1)(?=.*5)'; echo $?
0
% seq 1 100 | grep -qzP '(?=.*1)(?=.*a)'; echo $?
1
答案 4 :(得分:1)
由于@iruvar没有将他的评论作为答案发布,我将把它放在这里:
grep -q string_1 file && grep -q string_2 file
现在,这是我的贡献。 @ anubhava是一个计算复杂度更高的awk
答案,它只读取文件一次,比@ iruvar更简单的答案更快,它读取文件三次?
awk 11.730 s
grep && grep 0.258 s
没有
这肯定取决于文件系统与cpu的速度,以及缓存的持续时间,但在我的系统上,这可能是一个典型的B + / A-工作站,grep kw1 file && grep kw2 file && grep kw3 file
是〜50x快速@ anubhava的awk
解决方案。这在ssd和主轴突袭中都是正确的。 (详情:测试文件为5,000,000行,160M,第一行为kw1
,第250万为kw2
,第500万为kw3
。
可以进行一些简单的优化,例如,如果您可以通过匹配整行来解决问题,那么(使用grep -x
);在这种情况下,它的速度提高了一倍。
对于许多(例如,> 1,000)个文件,使用grep -l
和xargs
的速度更快:
grep -l kw1 *.txt | xargs grep -l kw2 | xargs grep -q kw3
而不是循环:
for f in *.txt; do
grep -q kw1 $f && grep -q kw2 $f && grep -q kw3 $f
done
使用相同的测试文件,grep -l | xargs grep
花了0.258秒,就像grep && grep
一样。有两个测试文件,它仍然不比grep && grep
快。 2000个测试文件各有5,000行,其中没有一个包含任何匹配项,grep -l | xargs grep
比grep && grep
快〜10倍。
答案 5 :(得分:0)
你可以使用“-q”来搜索grep
if grep -q string1 "/path/to/file" && grep -q string2 "/path/to/file";then
echo 'exists'
else
echo 'does not exist'
fi