awk用于从xargs命令管道输出的不同分隔符

时间:2015-01-21 12:49:04

标签: bash awk

我运行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命令中工作。

2 个答案:

答案 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。)