我目前有一个日志文件,我必须使用“ grep”命令过滤信息以获取以几个字符结尾的最长单词。
例如,我必须找到以“ abc”结尾的单词。
我有以下文件:
XXXXXabc
YYabc
ZZZdef
XXabc
正确的输出应为:
XXXXXabc
直到现在我已经尝试了以下方法:
grep -E '\abc' log.txt | wc -L
但是这将返回最大长度而未显示单词。 如何在屏幕上显示单词?
谢谢!
答案 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