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

awk for different delimiters piped from xargs command

I 运行 一个 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

如何使用 awk 获取第一个字段 (auto_home) 和最后一个字段 abc.jkl.com:/rtw2kop/xyz?因为我已经将 grep 命令的管道连接到 awk。'\t' 在上面的 awk 命令中不起作用。

如果我正确理解您的尝试,那么我建议采用这种方法:

while read user; do
    echo "For user $user"
    awk     -v user="$user" ' == user { print FILENAME "\t" $NF }' auto_home
    awk -F: -v user="$user" ' == user { print FILENAME; exit }' passwd group netgroup | sort -u
done < "$userlist"

基本技巧是 read 循环,它将从 $userlist 中命名的文件中读取一行到变量 $user 中;之后就直接awk了。

我冒昧地稍微更改了 selection 标准;看起来你想 select 用于用户名,而不是行中任何位置的字符串。这样,只有第一个标记等于当前检查的用户的行将被 selected,其他标记等于用户名但不是第一个标记的行将被丢弃。我相信这就是你想要的;如果不是,请评论,我们可以解决。

在第一个 awk 命令中,将 \t 两次转义为 \t。 (您可能还需要对 \n 进行两次转义。)