grep 变量

grep 变量

假设我有一个变量

line="This is where we select from a table."

现在我想知道 select 在句子中出现了多少次。

grep -ci "select" $line

我尝试过,但没有成功。我也尝试过

grep -ci "select" "$line"

它仍然不起作用。我收到以下错误。

grep: This is where we select from a table.: No such file or directory

答案1

grep阅读其标准输入。就这样,使用管道...

$ echo "$line" | grep select

... 或者这里的字符串...

$ grep select <<< "$line"

另外,您可能想在 grep 之前用换行符替换空格:

$ echo "$line" | tr ' ' '\n' | grep select

...或者您可以要求grep仅打印匹配项:

$ echo "$line" | grep -o select

这将允许您在匹配时删除该行的其余部分。

编辑:哎呀,读得太快了,谢谢马可。为了计算发生次数,只需将其中任何一个通过管道传输到wc(1);)

之后进行的另一次编辑伊兹卡塔的评论,$line使用时引用echo

答案2

test=$line i=0
while case "$test" in (*select*)
test=${test#*select};;(*) ! :;;
esac; do i=$(($i+1)); done

grep这么简单的事根本不需要打电话。

或者作为一个函数:

occur() while case "$1" in (*"$2"*) set -- \
        "${1#*"$2"}" "$2" "${3:-0}" "$((${4:-0}+1))";;
        (*) return "$((${4:-0}<${3:-1}))";;esac
        do : "${_occur:+$((_occur=$4))}";done

它需要 2 或 3 个参数。提供超过这个数量将会扭曲其结果。您可以像这样使用它:

_occur=0; occur ... . 2 && echo "count: $_occur"

....如果in...至少出现 2 次,则打印它的出现次数。像这样:

count: 3

如果$_occur为空或者unset当它被调用时,则它根本不会影响任何 shell 变量,return如果"$2"出现的次数"$1"少于 1 ,则为 1 "$3"。或者,如果仅使用两个参数调用,则return仅当"$2"不在 中时它才会为 1 "$1"。否则返回 0。

因此,以最简单的形式,您可以执行以下操作:

occur '' . && echo yay || echo shite

...打印...

shite

...但...

occur . . && echo yay || echo shite

...将打印...

yay

$2您也可以稍微不同地编写它,并省略(*"$2"*)和语句中的引号"${1#*"$2"}"。如果这样做,那么您可以使用 shell glob 进行匹配,例如sh[io]te匹配测试。

答案3

我只是使用 sed 为我分解句子,然后比较循环中的每一行,因为这对我来说似乎是最简单的方法(无意冒犯这里的任何人,而且我也不是专家,所以人们可能有一个原因不要这样做,不确定)

string="a a a a a asd gsam en"
count=$(echo $string | sed 's/ /\n/g' | grep -w 'a' | wc -l)
echo $count

当我运行它时

mark@gamerblock:~$ string="a a a a a asd gsam en"
mark@gamerblock:~$ count=$(echo $string | sed 's/ /\n/g' | grep -w 'a' | wc -l)
mark@gamerblock:~$ echo $count
5

作为带有输入参数的脚本

#!/bin/bash
echo "Enter your string"
read string
echo "Enter what you want substring counted"
read substring
count=$(echo $string | sed 's/ /\n/g' | grep $substring | wc -l)
echo $count

当跑的时候

mark@gamerblock:~$ ./substring.sh
Enter your string
peter piper picked a pack of pickled peppers. a pack of pickled peppers peter piper did pick.
Enter what you want substring counted
peter
2
mark@gamerblock:~$ ./substring.sh
Enter your string
peter piper picked a pack of pickled peppers. a pack of pickled peppers peter piper did pick.
Enter what you want substring counted
p
0

如果您不需要精确匹配,请从 grep 中删除 -w 参数

mark@gamerblock:~$ ./substring.sh
Enter your string
peter piper picked a pack of pickled peppers. a pack of pickled peppers peter piper did pick.
Enter what you want substring counted
p
12
mark@gamerblock:~$

相关内容