有没有办法在 awk 中使用 Linux shell 命令?我需要从文本文件(给出)检查用户是否存在, 并将不存在的用户写入新的文本文件,如下所示username [email protected]
username password [email protected]
目前我有这个:
#!/bin/bash
awk '{
for(i=1; i<=NF; i+=2) {
pass='pwgen'
if(id -u $i | awk '{$1}' > 999) print $1;
else $i pass $i,'@email.com' >> newusers.txt
}
}' $*
我认为它应该有效,但显然不行。它应该使用别名 pwgen 创建一个新密码(每次使用创建 1 个密码),通过比较 id -u $i | 的输出来检查文本文件中的 $i 元素是否是现有用户。 awk '{$1}' 到 999,如果不超过 999,它应该附加到名为 newusers.txt 的文本文件中。username password [email protected]
答案1
你的 awk 脚本
{ for(i=1; i<=NF; i+=2) { 通过=pwgen if(id -u $i | awk {ARG1} > 999) 打印 1 美元; 否则 $i 传递 $i,@email.com >> newusers.txt } }
其中ARG1
是传递给 shell 脚本的第一个参数。 shell 脚本中的第一个单引号开始一个单引号文字,该文字以第二个单引号结束,即 after | awk {
。第三个单引号开始另一个单引号文字,该文字以第四个单引号结尾,依此类推。如果要包含单引号,则需要引用它。但在这里,您无论如何都不需要在 awk 脚本中使用单引号。 awk 中的字符串需要写在双引号之间。
pass=pwgen
这行 awk 代码将变量设置pass
为变量的值pwgen
。由于pwgen
未设置,pass
因此设置为空值。
您可能打算编写pass=`pwgen`
,这是 shell 语法,用于将 shell 变量设置pass
为命令的输出pwgen
。但这是 shell 语法,而不是 awk,所以毫不奇怪,它在 awk 中不起作用。您可以使用管道语法读取 awk 中命令的输出:
pwgen | getline pass;
close("pwgen");
您需要关闭管道,否则下次执行指令时将从同一管道读取而不是运行 的新实例pwgen
。
if(id -u $i | awk '{$1}' > 999) print $1;
您可以使用该system
函数来执行 shell 命令。您编写的嵌入式 awk 命令没有意义。我怀疑你想测试 的输出是否id -u
大于 999;那将是
if (system("id -u " $i "| awk \x27{exit(!($0 > 999))}\x27"))
\x27
是一种将单引号字符放入 awk 字符串中的方法。但这确实很复杂。相反,将id -u
awk 脚本的输出读入。
id_command = "id -u " $i;
id_command | getline id;
close(id_command);
if (id > 999) print id;
else $i pass $i,'@email.com' >> newusers.txt
我认为您的意思是向文件写入一行。所以你需要一个打印命令。要在元素之间添加空格,请将它们作为单独的参数传递给print
。要将两个字符串连接在一起且没有空格,请在 awk 脚本中将字符串彼此相邻放置,中间不使用任何运算符(在 awk 中,空二元运算符表示连接)。正如我们已经多次看到的,在字符串周围使用双引号。
else print $i, pass, $i "@email.com" >>"newusers.txt"
您的脚本可能还有其他问题,我还没有完全审查过。