我需要一个 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)。