将grep用于行

时间:2015-10-24 08:44:16

标签: regex bash grep

说明

我的代码要求一个可能包含多个单词的参数。我有一个包含多行的文件。我需要将此文件作为固定字符串模式搜索此文件;单词必须按参数中给出的顺序排列,并且必须完全出现在文件的一行中。我还需要计算参数的数量,作为一个整体和完整的字符串,在文件中找到。

我不可能事先知道这个论点,所以我不能像grep -i 'first\|second\|third' /file/name那样对单个单词进行硬编码,也不能像grep -i first /file/name | grep -i second | grep -i third那样使用管道。我不知道论证中有多少单词,它可以是1到5之间的任意数量的单词。

我已尝试fgrep "$@" /file/namefgrep -fgrep -Fgrep -w,但我的输出显示

grep: second: No such file or directory
grep: third: No such file or directory

示例文件和代码:

我的文件类似

Apple → Amy Lee Brown
Orange → Amy Lee Sandborn
Pinapple → Amy Vasluk
Watermelon → Amy
Zuchinni → Lee

有人要求输入名称,代码会返回水果。

我的代码就像这样

if [ $(grep -ic "$@" $temp/log) -gt 1 ]; then
    echo "$(grep -ic "$@" $temp/log) entries found, please be more specific."
    exit
elif [ $(grep -ic "$@" $temp/log) -eq 0 ]; then
    echo "None found, please check name and try again."
    exit
fi

echo $(cat $temp/log | grep -i "$@" | awk '{print $1}')

目的:

  • 我需要检查计数,所以如果此人输入Amy Lee,输出应该说有两个条目,然后要求该人更具体。

  • 我还需要Amy Lee Lee匹配,这是我遇到的另一个问题,无法修复。

  • 如果此人输入Amy,我需要输出返回1个条目并返回Watermelon,但我无法将输入Amy识别为完整和完整,因此代码当前输出4个条目并要求用户更具体 - 但我不能更具体,因为“Amy”存在于该文件中并且具有水果分配。

  • 现在,当我输入这个样本时,我意识到我可能会陷入两难境地,因为如果我需要我的代码完全匹配“Amy”,那么对于“Amy Lee”也会做同样的事情,代码就会简单返回0计数,甚至不要求该人更具体。

唉!

对此有任何帮助或亮点将非常感谢!提前谢谢。

修改

Walter A提供的工作解决方案:

count=$(grep -ic "$*" $temp/log)
case $count in
    0) echo "No entries found, please check input and try again.";;
    1) echo $(cat $temp/log | grep -i "$*" | awk '{print $1}');;
    *) echo -e "Multiple entries found, please be more specific.\nEnd your search term with '$' for an exact match.";;
esac
exit

1 个答案:

答案 0 :(得分:1)

使用$*而不是$@

num=$(grep -c "$*" /file/name)
case $num in
   0) echo "Not found";;
   1) grep "$*" /file/name
      echo "now use something like cut on the result"
      ;;
   *) echo "Too much";;
esac