修改grep输出以包含字段描述

时间:2013-12-10 09:52:02

标签: bash sed awk grep cut

我正在尝试编写一个简短的脚本来搜索名字与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}'

我似乎离这里的答案还很远,并完全坚持我应该使用哪些命令。任何帮助都会受到大力赞赏!

3 个答案:

答案 0 :(得分:2)

你根本不是很远,只需要做一些修改就可以了:

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

不确定它是否处理了角落案例(没有设置名称的人等),但是对于快速破解它可能就足够了。

答案 1 :(得分:2)

实际上,如果使用,我可能不想使用实用程序。这减少了启动不必要进程的开销,并使脚本变得更复杂。

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

我的 - 解决方案是:

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

我希望这可以提供帮助!

答案 2 :(得分:1)

您可以使用以下内容跳过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::设置为字段分隔符,然后打印所需的文本和数据。