【问题标题】:Find and print the biggest word with a pattern查找并打印带有图案的最大单词
【发布时间】:2019-01-19 10:14:20
【问题描述】:

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

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

我有以下文件:

XXXXXabc
YYabc
ZZZdef
XXabc

正确的输出应该是:

XXXXXabc

到目前为止,我已经尝试过以下方法:

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

但这会返回最大长度而不显示单词。 我怎样才能让这个词打印在屏幕上?

谢谢!

【问题讨论】:

标签: bash shell command-line grep


【解决方案1】:
grep -E \abc log.txt | awk '{print length($1) " " $1}' | sort -n |  tail -1 | awk '{print $2}'

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

【讨论】:

  • 如果您的代码反映您的描述会更好:将tail 放在awk 之前,这样awk 只需处理一行而不是整个文件。
【解决方案2】:

只需一条 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”结尾的每一行,获取长度并将其与最大全局长度进行比较。如果这更大,则用旧值替换新值。

最后,打印找到的单词。

【讨论】:

    【解决方案3】:

    使用sort 会运行得更慢(复杂度O(n log n))。您应该只访问每个元素一次,如下所示(complexity 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"
    

    【讨论】:

      【解决方案4】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-04-16
        • 2012-09-01
        • 2019-07-10
        • 1970-01-01
        • 1970-01-01
        • 2018-09-06
        • 2014-11-28
        • 2021-04-05
        相关资源
        最近更新 更多