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
进行两次转义。)
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
进行两次转义。)