我想计算单词数并打印与以下模式完全匹配的匹配模式行:
abc-ERROR:
输入文件包含:
# abc-ERROR: xyxxkkfgfr
# def-Error: aaaaaa
# abc-ERROR.cpp
输出应该是:
1 (count)
# abc-ERROR: xyxxkkfgfr (line)
答案1
您可以使用grep
来获取行数和grep -c
行数。如果你不喜欢运行grep
两次,你可以使用tee
and进程替换(以下是bash语法):
grep abc-ERROR: input.txt | tee >( wc -l )
答案2
这怎么样:
$ cat file
# abc-ERROR: xyxxkkfgfr
# abc-ERROR: xyxxkkfgfr
# abc-ERROR: xyxxkkfgfr
# def-Error: aaaaaa
# abc-ERROR.cp
# abc-ERROR: asdgsdgaaf
# abc-ERROR: asdgsdgaaf
# abc-ERROR: tttttttttq
$ awk '/abc-ERROR: /{a[$0]++}END{for(k in a) printf "%d\t(count)\n%s\t(line)\n",a[k],k}' file
1 (count)
# abc-ERROR: tttttttttq (line)
2 (count)
# abc-ERROR: asdgsdgaaf (line)
3 (count)
# abc-ERROR: xyxxkkfgfr (line)
答案3
我建议采用两种方法来解决这个问题。
1)在 bashrc / bash_profile 中放置一个函数并创建一个别名来调用该函数(这将在全局范围内使用该函数)
2)创建一个shell脚本文件,也可以创建该文件的别名。
#!/bin/bash
function matchString(){
REGEX="$1"
FILE="$2"
RESULTS=$(grep -n "$REGEX" $FILE | awk -F ":" '{print $2 "\tLine: " $1}')
COUNT=$(echo $RESULTS | wc -l)
echo "Count: $COUNT"
echo $RESULTS
}
matchString $1 $2
根据您的文本文件调用此文件(即 bash matchString.sh "abc-ERROR:" test.txt)将输出如下:
数量:1
abc-错误行:1
--此函数将第一个参数作为正则表达式模式(因此可以在任何类似的场景中重复使用)并在第二个参数调用的文件中搜索该模式。
输出的第一行是所有匹配行的总数,后面的每一行是匹配项,后跟一个制表符,表示该匹配项的行号。