我有这个脚本,我要求4种模式,然后在grep
命令中使用它们。也就是说,我想看看一条线是否与任何模式匹配。
echo -n "Enter pattern1"
read pat1
echo -n "Enter pattern2"
read pat2
echo -n "Enter pattern3"
read pat3
echo -n "Enter pattern4"
read pat4
cat somefile.txt | grep $pat1 | grep $pat2 | grep $pat3 | grep $pat4
我遇到的问题是,如果用户没有提供其中一种模式(我想要允许),那么grep命令就不起作用了。
那么,有没有办法让grep忽略其中一个模式,如果它返回为空?
答案 0 :(得分:3)
您的代码存在很多问题:
echo -n
不可移植这是我写的更接近您应该使用的内容:
i=1
printf %s "Enter pattern $i: "
read -r input
while [[ $input ]]; do
pattern+=(-e "$input")
let i++
printf %s "Enter pattern $i (Enter or Ctrl+D to stop entering patterns): "
read -r input
done
echo
grep "${pattern[@]}" somefile.txt
编辑:这不符合OP的问题,这会搜索OR
而不是AND
的多种模式......
这是一个有效的AND
解决方案(它将停止提示第一个空模式或第四个模式之后的模式):
pattern=
for i in {1..4}; do
printf %s "Enter pattern $i: "
read -r input
[[ $input ]] || break
pattern="${pattern:+"$pattern && "}/${input//\//\\/}/"
done
echo # skip a line
awk "$pattern" somefile.txt
以下是一些链接,您可以从中学习如何使用bash进行编程: