我运行xargs命令,用多个命令调用bash shell。我无法弄清楚如何使用不同的分隔符打印两列。 命令运行在
之下cd /etc/yp
cat "$userlist" | xargs -I {} bash -c "echo -e 'For user {} \n'
grep -w {} auto_*home|sed 's/:/ /' | awk '{print \$1'\t'\$NF}'
grep -w {} passwd group netgroup |cut -f1 -d ':'|sort|uniq;echo -e '\n'"
我得到的输出是
For user xyz
auto_homeabc.jkl.com:/rtw2kop/xyz
group
netgroup
passwd
我在auto_home之后需要一个标签(因为它是文件名),如
auto_home abc.jkl.com:/rtw2kop/xyz
auto_home文件中的条目位于
之下xyz -rw,intr,hard,rsize=32768,wsize=32768 abc.jkl.com:/rtw2kop/xyz
如何获取第一个字段(auto_home)和最后一个字段abc.jkl.com:/rtw2kop/xyz
?因为我把一个从grep命令输入到awk的管道。' \ t'不是在上面的awk命令中工作。
答案 0 :(得分:1)
如果我理解你正在尝试的是什么,那么我建议采用这种方法:
while read user; do
echo "For user $user"
awk -v user="$user" '$1 == user { print FILENAME "\t" $NF }' auto_home
awk -F: -v user="$user" '$1 == user { print FILENAME; exit }' passwd group netgroup | sort -u
done < "$userlist"
基本技巧是read
循环,它将从$user
中命名的文件中读取变量$userlist
的一行;在那之后,这一切都很简单。
我冒昧地稍微改变了选择标准;它看起来好像你想要选择用户名,而不是字符串中的任何字符串。这样,只选择第一个令牌等于当前被检查用户的行,并且丢弃其他令牌等于用户名而不是第一个令牌的行。我相信这就是你想要的;如果不是,请发表评论,我们可以解决。
答案 1 :(得分:0)
在第一个awk命令中,将\t
双重转义为\\t
。 (您可能还需要双倍转义\n
。)