从输出中提取用户 ID 和第一个首字母姓氏

从输出中提取用户 ID 和第一个首字母姓氏

使用 getent passwd 获取用户身份的输出。

我怎样才能改变输出

u12345:John Doeu12345,jdoe

我用 sed 得到它,但它删除了 u12345 但确实给了我 jdoe

答案1

对于awk,假设:和空格可以可靠地用作字段分隔符:

$ echo 'u12345:John Doe' | awk -F'[: ]' '{print $1 "," tolower(substr($2, 1, 1) $3)}'
u12345,jdoe

答案2

Perl

perl -lne 'print "$1," . lc $2 . $3 if /^([^:]+):(\w)\S+\s+(\S+)/' file

u12345,jdoe

答案3

使用 GNU sed

sed -nE 's/^([^:]*):([^:[:space:]])[^[:space:]]*[[:space:]]+([^:[:space:]]+).*$/\1,\L\2\3/p'

或者使用perl

perl -C -F: -lae 'print "$F[0]," . lc("$1$2") if $F[1] =~ /^(\S)\S*\s+(\S+)/'

答案4

使用(以前称为 Perl_6)

~$ raku -ne 'put "$0,{($1,$2).join.lc}" if m/^ (<-[:]>+) \: (\S) \S* \s (\S+)/;' <<< 'u12345:John Doe'

示例输出:

u12345,jdoe

Raku 是 Perl 家族的一种编程语言。上面,Raku 代码是使用-ne非自动打印逐行标志运行的。正则表达式匹配器m/ ... /用于识别感兴趣的行。如果 ( if) 存在匹配,则用( ... )括号捕获的零索引组将被排除put。大括号表示 Raku 代码在 (tojoinlc小写字母)内运行。

捕获$0包含从​​行开头开始的字符不要包含一个:冒号。换句话说,两个连续的正则表达式原子<-[:]> \:意味着“创建一个不包含冒号的自定义字符类,并查找一个或多个此类字符,后跟\:冒号。

正则表达式原子的(\S) \S+ \s (\S+)意思是_“将\S非空白字符捕获到$1(即名字首字母);识别一个或多个非空白字符后跟\s空白,然后将后面的(\S+)一个或多个非空白字符捕获到$2(即请注意,这里仅处理单一名字(或初始)名字和单一姓氏的最简单情况。


注意:上面的代码消除了不匹配的行。如果要保留不匹配的行,请使用以下代码:

~$ raku -ne 'if m/^ (<-[:]>+) \: (\S) \S* \s (\S+)/ {put "$0,{($1,$2).join.lc}"} else {put $_};'  file

#OR 

~$ raku -ne 'm/^ (<-[:]>+) \: (\S) \S* \s (\S+)/ ?? put "$0,{($1,$2).join.lc}" !! put $_;'  file

如果不匹配,则逐字显示上面的put $_行(该行存储在$_Perl/Raku 的“主题变量”中)。如果您想清空这些行,请使用"".putput ""

https://raku.org

相关内容