查找并打印带有图案的最大单词

时间:2019-01-19 10:14:21

标签: bash shell command-line grep

我目前有一个日志文件,我必须使用“ grep”命令过滤信息以获取以几个字符结尾的最长单词。

例如,我必须找到以“ abc”结尾的单词。

我有以下文件:

XXXXXabc
YYabc
ZZZdef
XXabc

正确的输出应为:

XXXXXabc

直到现在我已经尝试了以下方法:

grep -E '\abc' log.txt | wc -L

但是这将返回最大长度而未显示单词。 如何在屏幕上显示单词?

谢谢!

4 个答案:

答案 0 :(得分:1)

grep -E \abc log.txt | awk '{print length($1) " " $1}' | sort -n |  tail -1 | awk '{print $2}'

这个想法:找到长度,按数字排序,然后从最后一行仅打印第二个元素。

答案 1 :(得分:0)

使用单个awk命令即可获取:

awk 'BEGIN {global_max = 0} /abc$/ {cur_max=length($0); if (cur_max > global_max) {global_max=cur_max; word=$0}} END {print word}' log.txt

使用变量global_max来跟踪最长的单词(在BEGIN块中初始化为零)。

然后,对于以“ abc”结尾的每一行,获取长度并将其与最大全局长度进行比较。如果更大,请用旧值替换新值。

最后,打印找到的单词。

答案 2 :(得分:0)

使用sort的速度会变慢(复杂度O(n log n))。您只应按如下所示访问每个元素一次(复杂性O(n)

maxSize=0; maxWord=""; while read -r LINE; do if [[ ${#LINE} -gt $maxSize ]]; then maxSize=${#LINE}; maxWord="${LINE}"; fi; done < input.txt; echo "$maxWord"

答案 3 :(得分:0)

Grep不能单独使用awk来做到这一点:

awk '/abc$/{m=length($0)>length(m)?$0:m}END{print m}' infile