2

現在、シェル変数の awk の使用に問題があります。以下を実行すると、これが私の問題です。

awk -F: '$1=="marco" {print $7}' /etc/passwd

すべてがうまく機能します。ただし、「marco」の代わりに $user シェル変数を渡せるようにしたいので、次のことを試します (-v フラグについて読んだ後):

awk -F: -v awkvar=$user '$1=="$awkvar" {print $7}' /etc/passwd

そしてそれはうまくいかないようです。誰でも私を助けることができますか?

ありがとう!

4

3 に答える 3

3

$シェル側では引用符を使用し、awk 変数には使用しないでください。

awk -F: -v awkvar="$user" '$1==awkvar {print $7}' /etc/passwd

awkのは$、それが位置パラメータ (つまり、フィールド番号) であることを示します。そのため、フィールド「marco」を探していました。これは、$0行全体に還元されます。したがって、フィールドが 1 つだけの行が検索されます。

于 2012-04-18T17:46:46.790 に答える
2

いくつかのこと:

  1. awkでは、変数は印章なしで置換され$ます。$「位置のフィールド」を意味するので、 「 awkvarの$awkvar位置の値のフィールド」を意味します。の場合、はと同じで、$0に相当します。awkvar=marco$awkvar$"marco"
  2. シェル変数とは異なり、awk変数を引用することはできません。引用しないと、文字列として扱われます。

    sh$ awk -v awkvar=foo 'BEGIN{print "awkvar",awkvar}'
    awkvar foo
    sh$ 
    
  3. ユーザー名を含む標準のシェル変数は$USER、ではありません$user

結論として、あなたが望むのはこれです:

awk -F: -v awkvar=$user '$1==awkvar {print $7}' /etc/passwd

または、を使用してgetent

getent passwd $USER | awk -F: '{print $7}'
于 2012-04-18T17:53:26.953 に答える
0

それawkはシェルの問題ではありません。

これは機能します($user変数がシェル環境で設定されている場合)。

awk -F: '$1=="'"$user"'" {print $7}' /etc/passwd
于 2012-04-18T18:03:42.627 に答える