修改grep输出以具有字段描述



我正试图写一个简短的脚本来搜索所有名字与names.txt 中的任何名字匹配的用户

结果应采用以下示例格式:

用户名:tom01,全名:Tom Bennett,主目录:/Home/users/tom01

grep -f name.txt /etc/passwd | cut -d: -f1,5,6 | awk '{print '{"Username: "$1", Full Name: "$2", Home Directory: "$3}'

我似乎离答案很远,完全不知道应该使用哪些命令。任何帮助都将不胜感激!

您根本就不远,只需进行一些小的修改即可工作:

grep -f name.txt /etc/passwd | cut -d: -f1,5,6 | awk --field-separator : '{print "Username: "$1", Full Name: "$2", Home Directory: "$3}'

不确定它是否能处理角落案件(没有名字集的人等),但对于快速破解来说,它可能已经足够了。

实际上,如果使用awk,我可能不喜欢使用grep或cut实用程序。这减少了启动不必要进程的开销,并使awk脚本稍微复杂一点。

我的假设是,第5个字段包含用户的全名,name.txt包含您要查找的名字。

我的无grep解决方案是:

awk -F: 'NR==FNR { fn = fn ? $0"|"fn : $0; next }
$5 ~ "(^| )("fn") " { print "User name: "$1", Full name: "$5", Home directory: "$6}
' name.txt /etc/passwd

该脚本首先读取第一个文件,并创建一个由名字组成的管道分隔字符串,以形成ERE。然后读取第二个文件,并尝试将第一个名称与用户的全名相匹配。它只匹配确切的名字。与其他解决方案相比,这有改进。即使姓氏包含(或等于)一个教名,这也能正常工作。参见示例:

输入文件:

cat <<XXX >name.txt
Joe
Thomas
XXX
cat <<XXX >passwd
user01:*:500:501:Joan Thomasson:/home/user01
user02:*:500:501:Thomas Joanson:/home/user02
user03:*:500:501:Joan Thomas Joanson:/home/user03
user04:*:500:501:Joan Thomas:/home/user04
Thomas:*:500:501:Joan Thomas:/home/Thomas
XXX

输出:

User name: user02, Full name: Thomas Joanson, Home directory: /home/user02
User name: user03, Full name: Joan Thomas Joanson, Home directory: /home/user03

我希望这能有所帮助!

您可以使用以下内容跳过管道连接到cut

grep -f name.txt /etc/passwd | awk -F: '{print "User name", $1, "Full name", $5, "Home directory", $6}'

请注意,awk -F: '{print "User name", $1, "Full name", $5, "Home directory", $6}'使用-F::设置为字段分隔符,然后打印所需的文本和数据。

最新更新