同一个管道中有两个 awk 命令?

同一个管道中有两个 awk 命令?

你好,我正在尝试做这样的事情,但没有成功,你们能帮我一下吗?

/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 都已创建,但只有 file1 包含数据。所以基本上我想要做的是将相同的变量用于两个命令

答案1

尝试这个:

/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" }'

答案2

当你想对同一个传​​入管道数据运行两个不同的命令时,你需要使用中间文件:

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"

但作为量子写作,您可以要求单个awk实例执行这两项操作。

答案3

你把事情弄得一团糟,从你的问题的格式开始(看看我上面所做的,这应该会让下面的事情变得更清楚)。

第一个问题:
如果您有分号 ( ;) 或“continue-on-success ( &&),则您正在运行两组单独的命令。
完全分开。就像您运行了一个,按回车键,然后运行另一个。
这意味着您的第二个awk正在 stdin 上寻找输入,但没有找到任何内容,因此没有输出(这就是为什么file2是空的)

第二个问题:
单独的实例awk不能共享变量。要么你想让第二个实例awk处理 MySQL 查询的输出,要么你想让它处理第一个实例的输出awk
由于你的第二个实例中有 5 个变量,所以awk我假设后者。

解决方案
运行命令列表的前半部分(直到分号的所有内容)。
现在运行第二个 awk,并指定输入文件(awk '{print $1":"$5":13753:0:99999:7:::"}' /tmp/file1 >> /tmp/file2)。

答案4

您显示的命令永远不会起作用,因为处理是完全连续的,并且 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")

未经测试,请访问伍利奇 维基比你所知道的更多的 bash 魔法 :)

相关内容