将空字符串传递给grep命令

时间:2016-06-22 12:33:47

标签: bash grep

我有这个脚本,我要求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忽略其中一个模式,如果它返回为空?

1 个答案:

答案 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进行编程: