所以我只是在学习bash而且现在我正在尝试编写一个代码来解决一些问题 . 所以现在写我正在列出踩踏事件中的所有用户,并试图获取最长字符串的长度和名称 . 所以这就是我所处的位置
getent passwd | cut -f 1 -d: | wc -L
getent passwd - (也得到用户ID列表),cut命令获取第一个用户ID,然后wc -L获得最长的长度 . 现在我想弄清楚我该如何回应呢?所以对此的任何意见都会很棒,谢谢!
另一种方法:
getent passwd | cut -f 1 -d: | perl -ne 'print length($_).":$_"'| sort -n| cut -f 2 -d:
我们使用perl创建一个列表 <length>:<username> ,按长度排序并仅打印用户名 .
<length>:<username>
执行此操作的一种方法是,使用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"
要获取名称最长的用户的名称,请使用:
getent passwd | awk -F: '{longest=length($1)>length(longest)?$1:longest} END{print longest}'
-F:
告诉 awk 使用冒号作为字段分隔符 .
awk
longest=length($1)>length(longest)?$1:longest
对于每一行输入,都会执行此语句 . 它将变量 longest 分配给三元语句的结果:
longest
length($1)>length(longest)?$1:longest
该语句测试条件 length($1)>length(longest) . 这里, length($1) 是当前用户名称的长度, length(longest) 是之前看到的最长名称的长度 . 如果当前名称较长,则三元表达式返回当前名称 $1 . 否则,它返回先前的最长名称 longest .
length($1)>length(longest)
length($1)
length(longest)
$1
END{print longest}
读完文件后,会打印出最长的名称 .
3 回答
另一种方法:
我们使用perl创建一个列表
<length>:<username>
,按长度排序并仅打印用户名 .执行此操作的一种方法是,使用sed仅输出至少与上面命令获得的长度相同的行:
这将输出所有绑定最长长度的用户 .
你可以通过在变量中存储名称列表来使它更好一些:
要获取名称最长的用户的名称,请使用:
它是如何工作的
-F:
告诉
awk
使用冒号作为字段分隔符 .longest=length($1)>length(longest)?$1:longest
对于每一行输入,都会执行此语句 . 它将变量
longest
分配给三元语句的结果:该语句测试条件
length($1)>length(longest)
. 这里,length($1)
是当前用户名称的长度,length(longest)
是之前看到的最长名称的长度 . 如果当前名称较长,则三元表达式返回当前名称$1
. 否则,它返回先前的最长名称longest
.END{print longest}
读完文件后,会打印出最长的名称 .