我正在尝试制作一个 bash 脚本来 grep 值并将计数和值一起输出
像这样的东西
grep -c 'Thenis' example.txt > example.lst
但在该列表文件中不仅显示计数,还显示我输入的值,如下所示
Thenis: 123
答案1
您可以启动一个子 shell 并使用$0
变量来执行此操作。
bash -c 'echo "$0: $(grep -c $0 example.txt)"' 'Thenis' > example.lst
答案2
由于grep -c
仅打印数字,因此我们需要使用给定的模式作为前缀。这可以通过使用内置的 shellprintf
打印模式来完成,而无需跟随换行符。然后我们让 grep 打印计数(在同一行)。
使用括号将两个语句放置在子 shell 中允许所有输出仅重定向一次。
我会这样做:
(printf '%s: ' Thenis; grep -c Thenis example.txt) > example.lst
如果您想制作一个简单的脚本来执行此操作:
#!/bin/sh
if [ "$#" -ne 2 ]
then
echo >&2 "Usage: $0 pattern file"
exit 1
fi
printf '%s: ' "$1"
grep -c "$1" "$2"
答案3
还没人尝试过使用 sed 吗?
grep -c Thenis example.txt|sed s/^/Thenis:\ / > example.lst
或者如果您想要一个更通用的解决方案并且有 gnu sed
echo Thenis -- example.txt | \
sed -re 's/^(.*) -- (.*)$/echo -n \1:;grep -c \1 \2/e'
最后一个警告是:威力足以搬起石头砸自己的脚。
答案4
尝试写script.sh
:
#!/bin/bash
echo $1: $(grep -c "$1" "$2")
因此,如果example.txt
:
Then is, Then-is, Then's, Thenis, Thins,
Thesis, Thanes, Thence, Things,
Thenis, Thorns, Thane's
script.sh
在命令提示符下运行,将其输出保存到example.lst
:
$ ./script.sh 'Thenis' example.txt > example.lst
searchword: count
然后可以在以下位置找到所需的结果example.lst
:
$ cat example.lst
Thenis: 2
细节
- 与所有脚本一样,确保脚本可执行,例如通过发出命令
sudo chmod +x script.sh
- bash 位置参数:
$1
第一个参数传递给script.sh
,$2
第二个参数,依此类推 $(
...)
是命令替换,以获取所包含命令的结果,以供使用echo