AWK 中的外部命令

AWK 中的外部命令

有没有办法在 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 -uawk 脚本的输出读入。

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"

您的脚本可能还有其他问题,我还没有完全审查过。

相关内容