sed 解决方案根据用户名从 /etc/passwd 中提取 gecos

sed 解决方案根据用户名从 /etc/passwd 中提取 gecos

我需要一个 sed 解决方案来完成我正在做的工作。我需要/etc/passwd根据 AIX 用户 ID(用户名)从文件中提取名称。到目前为止,我有这个,但它不起作用。任何可行的解决方案将不胜感激。

sed "/^Ravi02/s/\(^.\{21\}\).\([a-zA-Z]\{50\}\)/\1/p" /export/home/Ravi02/passwd

以下是 passwd 文件中的一些示例条目:

Jose01:!:49030:49082:Freeman, Joseph III:/export/home/p1jxf01:/bin/ksh
Ravi02:!:37242:1580:Dronavalli, Ravi:/export/home/j1rxd02:/bin/ksh
Beny01:!:49335:49040:Young, Ben:/export/home/p1bmy01:/bin/ksh

根据 id 我需要提取名称。如果 id 是“Jose01”,我应该得到“Freeman,Joseph III”,或者如果 id 是“Ravi02”,那么我应该得到“Dronavalli,Ravi”。

答案1

passwd文件是一个:分隔文件。因此第一个字段始终是用户名,依此类推。

(旁注:man 5 passwd描述字段)。

在这种情况下,给定一个用户名,您需要 GECOS 字段。

可以已经完成了sed,但其他工具可能会更好。 awk让它变得简单:

awk -F: '$1 == "Ravi02" { print $5 }' /etc/passwd

答案2

标准sed解决方案是

sed -n '/^Ravi02:/s/^[^:]*:[^:]*:[^:]*:[^:]*:\([^:]*\):[^:]*:[^:]*$/\1/p'

可以稍微简化为

sed -n 's/^Ravi02:[^:]*:[^:]*:[^:]*:\([^:]*\):[^:]*:[^:]*$/\1/p'

关键是你需要查看(计算)冒号(:) 和冒号以外的字符,而不是计算字符 ( .\{21\}) 和字母 ( [a-zA-Z]\{50\}) — 特别是因为您希望能够匹配,全名字段中的逗号 ( ) 和空格等字符。

在我的系统上,以下变体也适用:

  • sed -n '/^Ravi02:/s/^\([^:]*:\)\{4\}\([^:]*\)\(:[^:]*\)\{2\}$/\2/p'
  • sed -n 's/^Ravi02:\([^:]*:\)\{3\}\([^:]*\)\(:[^:]*\)\{2\}$/\2/p'
  • sed -nE '/^Ravi02:/s/^([^:]*:){4}([^:]*)(:[^:]*){2}$/\2/p'
  • sed -nE 's/^Ravi02:([^:]*:){3}([^:]*)(:[^:]*){2}$/\2/p'

但我不确定它们是否都适用于所有系统(例如 AIX)。

相关内容