AWKの外部コマンド

AWKの外部コマンド

awkでLinuxシェルコマンドを使用する方法はありますか? (与えられた)テキストファイルにユーザーが存在することを確認し、以下のように存在しないユーザーを新しいテキストファイルに書き込む必要があります。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シェルスクリプトに渡された最初の引数はどこにありますか?シェルスクリプトの最初の一重引用符は一重引用符リテラルを開始し、その後2番目の一重引用符で終わります| awk {。 3番目の一重引用符は、別の一重引用符リテラルを開始し、4番目の一重引用符で終わる式です。一重引用符を含めるには、引用符を付ける必要があります。しかし、ここではとにかくawkスクリプトで一重引用符を使用する必要はありません。 awkの文字列は二重引用符で囲む必要があります。

pass=pwgen

このawkコード行は、変数をpass変数の値に設定しますpwgenpwgen設定されていないため、nullpass値に設定されます。

作成したい場合がありますpass=`pwgen`。これはシェル変数をpassコマンドの出力に設定するシェル構文ですpwgen。しかし、これはawkではなくシェル構文なので、awkでは機能しないのは当然です。パイプ構文を使用して、awkからコマンドの出力を読み取ることができます。

pwgen | getline pass;
close("pwgen");

パイプを閉じる必要があります。それ以外の場合は、次にコマンドが実行されたときに実行されている新しいインスタンスの代わりに同じパイプから読み込まれますpwgen

    if(id -u $i | awk '{$1}' > 999) print $1;

このsystem関数を使用してシェルコマンドを実行できます。あなたが書いた組み込みawkコマンドは意味がありません。出力がid -u999より大きいかどうかをテストしたいようです。

if (system("id -u " $i "| awk \x27{exit(!($0 > 999))}\x27"))

\x27awk文字列に一重引用符文字を入れる方法。しかし、本当に複雑です。代わりに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

ファイルに1行を書くことを意味すると思います。したがって、印刷コマンドが必要です。要素間にスペースを追加するには、スペースを別の引数として渡しますprint。空白なしで2つの文字列を連結するには、awkスクリプトの間に演算子なしで文字列を互いに隣に配置します(awkでは、空のバイナリ演算子は接続を意味します)。私たちが何度も見てきたように、文字列の周りに二重引用符を使用してください。

    else print $i, pass, $i "@email.com" >>"newusers.txt"

あなたのスクリプトに私が完全にレビューしていない他の問題があるかもしれません。

おすすめ記事