首页 文章

如何在按最大长度排序后回显字符串

提问于
浏览
3

所以我只是在学习bash而且现在我正在尝试编写一个代码来解决一些问题 . 所以现在写我正在列出踩踏事件中的所有用户,并试图获取最长字符串的长度和名称 . 所以这就是我所处的位置

getent passwd | cut -f 1 -d: | wc -L

getent passwd - (也得到用户ID列表),cut命令获取第一个用户ID,然后wc -L获得最长的长度 . 现在我想弄清楚我该如何回应呢?所以对此的任何意见都会很棒,谢谢!

3 回答

  • 1

    另一种方法:

    getent passwd | cut -f 1 -d: | perl -ne 'print length($_).":$_"'| sort -n| cut -f 2 -d:
    

    我们使用perl创建一个列表 <length>:<username> ,按长度排序并仅打印用户名 .

  • 0

    执行此操作的一种方法是,使用sed仅输出至少与上面命令获得的长度相同的行:

    getent passwd | cut -f 1 -d: | sed -n /^.\\{`getent passwd | cut -f 1 -d: | wc -L`\\}/p
    

    这将输出所有绑定最长长度的用户 .

    你可以通过在变量中存储名称列表来使它更好一些:

    u=`getent passwd | cut -f 1 -d:`; sed -n /^.\\{`wc -L <<< "$u"`\\}/p <<< "$u"
    
  • 0

    要获取名称最长的用户的名称,请使用:

    getent passwd | awk -F: '{longest=length($1)>length(longest)?$1:longest} END{print longest}'
    

    它是如何工作的

    • -F:

    告诉 awk 使用冒号作为字段分隔符 .

    • longest=length($1)>length(longest)?$1:longest

    对于每一行输入,都会执行此语句 . 它将变量 longest 分配给三元语句的结果:

    length($1)>length(longest)?$1:longest
    

    该语句测试条件 length($1)>length(longest) . 这里, length($1) 是当前用户名称的长度, length(longest) 是之前看到的最长名称的长度 . 如果当前名称较长,则三元表达式返回当前名称 $1 . 否则,它返回先前的最长名称 longest .

    • END{print longest}

    读完文件后,会打印出最长的名称 .

相关问题