双awk命令在同一个pipe道中?

你好我试图做这样的事情,但它不会工作,你们可以告诉我帮我吗?

/usr/bin/mysql -B -r -h ******** -u******* -p****** -D***** \ -e'SELECT `username`, `uid`, `gid`, `homedir` FROM `some_table`)' | \ awk '{print $1":x:"$2":"$3"::"$4":/usr/sbin/nologin"}' >> /tmp/file1 ; awk '{print $1":"$5":13753:0:99999:7:::"}'>>/tmp/file2 

改变“;” 到“&&”也不起作用。 file1和file2都被创build,但只有file1包含数据。 所以基本上我想要做的是使用两个命令相同的variables

尝试这个:

 /usr/bin/mysql -B -r -h ******** -u******* -p****** -D***** \ -e'SELECT `username`, `uid`, `gid`, `homedir` FROM `some_table`)' | \ awk '{ print $1":x:"$2":"$3"::"$4":/usr/sbin/nologin" >> "/tmp/file1"; print $1":"$5":13753:0:99999:7:::" >> "/tmp/file2" }' 

当你想在同一个inputpipe道数据上运行两个不同的命令时,你需要使用一个中间文件:

 TMPFILE="$(mktemp)" /usr/bin/mysql -B -r -h ******** -u******* -p****** -D***** \ -e'SELECT `username`, `uid`, `gid`, `homedir` FROM `some_table`)' >"$TMPFILE" awk '{print $1":x:"$2":"$3"::"$4":/usr/sbin/nologin"}' <"$TMPFILE" >>/tmp/file1 awk '{print $1":"$5":13753:0:99999:7:::"}' <"$TMPFILE" >>/tmp/file2 rm -f "$TMPFILE" 

但是作为quanta写道 ,你可以要求一个awk实例来执行这两个操作。

从问题的格式化开始,你已经弄得一团糟了(看看我上面做了什么,应该让事情更清楚)。

第一个问题:
如果你有一个分号( ; )或者一个“继续成功( && )”,你正在运行两套独立的命令。
完全分开。 这就像你跑了一个,打进去,然后跑另一个。
这意味着你的第二个awk正在寻找stdin的input,并没有发现任何东西给你没有输出(这就是为什么file2是空的)

第二个问题:
单独的awk实例不能共享variables。 要么你想让第二个awk咀嚼MySQL查询的输出,要么你想要咀嚼第一个awk的输出。
既然你在第二个awk有5个variables,我假设后者。


运行命令列表的前半部分(一切都以分号)。
现在运行第二个awk,并指定一个input文件( awk '{print $1":"$5":13753:0:99999:7:::"}' /tmp/file1 >> /tmp/file2 )。

你所看到的命令将不会工作,因为处理是完全顺序的,并且mysql的输出已经被第一个awk语句用完了。

我只是把所有的东西都移到一个小小的bash脚本中:

 #!/bin/bash mycmd="SELECT `username`, `uid`, `gid`, `homedir` FROM `some_table`" while read -r username, uid, gid, homedir; do printf "%s:x:%s:%s::%s:/usr/sbin/nologin" "$username" "$uid" "$gid" "$homedir" >> /tmp/file1 printf "%s:%s:13753:0:99999:7:::" "$username" "missing variable" >>/tmp/file2 done <(/usr/bin/mysql -B -r -h * -u* -p* -D* -e "$mycmd") 

未经testing,请访问Wooledge Wiki ,了解更多bash魔法,而不是您知道的:)