シェル変数で awk -v を使用すると正常に動作し、端末に印刷されますが、ファイルにリダイレクトされると、最初のレコードだけがファイルに印刷されます。

シェル変数で awk -v を使用すると正常に動作し、端末に印刷されますが、ファイルにリダイレクトされると、最初のレコードだけがファイルに印刷されます。

一致するパターンを持つファイルを読み取り、パターンを一致させてから最初の5行を取得します。パターンの数値順が正確ではないため、パターンの数値変数を使用して各レコードセットを数値順に繰り返します。 9つのレコードをすべて数値順に端末に印刷しますが、ファイルにリダイレクトすると、端末には何も印刷されず、ファイルの最初のレコードのみが印刷されます。変数を増やすのではなく、一致するパターンに数値を挿入すると、端末に印刷され、パターン1〜9のみが一致します。問題を引き起こす行です。

awk -v data="$devnum" '$0~data{print $0
 for (i=1; i<=5; i++) {getline; print}}' $data > $devicedata

rm は端末に印刷し、一致するパターンに置き換える> $devicedataと、3 番目のレコードと次の 4 行を端末に印刷してファイルに出力します。間違った形式があればお詫び申し上げます。どんな助けをありがとう!アップデートの場合、問題を「あいまいなリダイレクト」として扱う必要があると思います。私はteeコマンドにパイプを接続して>>を追加しようとしましたが、リダイレクトに2>&1を使用して忘れていた「あいまいなリダイレクト」を削除しました。 $data=devices.txt と $devicedata=devicedata.txt."$devnum"/device 3/

ベストアンサー1

リダイレクトに関連する問題が何であれ、-vとは何の関係もありません。スクリプトを実行してくださいhttp://shellcheck.netそしてそれが言う問題を解決してください。

現在の症状は、devicedataに格納されている値に空白が含まれているため、ほぼ確実であるため、複数のリダイレクトターゲットに引用されていない> $devicedata拡張であるため、引用するとあいまいな> "$devicedata"リダイレクトが解決されますが、これは唯一の問題ではない可能性があります.

以下は、bashであいまいなリダイレクトエラーを取得する方法の例です。

$ devicedata='foo'
$ echo 'hi' > $devicedata

$ devicedata='foo bar'
$ echo 'hi' > $devicedata
-bash: $devicedata: ambiguous redirect

そのエラーメッセージを削除する方法は次のとおりです。

$ echo 'hi' > "$devicedata"
$

今、あなたが見つけなければならない残りの部分は、変数にdevicedataスペースが含まれている理由と、これが望む/期待するものかどうかです。

シェルの引用符は、必要に応じて追加するのではなく、デフォルトで設定して必要に応じて削除することです。そうしないように特別な理由がなく、これらの引用符の削除の意味を完全に理解していない限り、シェルは常に二重引用符で囲まれた変数を使用する必要があります。https://mywiki.wooledge.org/Quotes

shellcheckなどを実行しても問題が解決しない場合は、最小限の完全なシェルスクリプトを公開してください。これにより、問題がawkスクリプトに関連していないため、デバッグに役立ちます。しかし、あなたがやりたいことはgetl​​ineを使うべきではありません。https://stackoverflow.com/questions/17908555/printing-with-sed-or-awk-a-line-following-a-matching-pattern/17914105#17914105、それを呼び出すべきではない場合は、awk.freeshell.org/AllAboutGetlineをご覧ください。

FWIW 私は(テストされていない)スクリプトを次のように書いています。

awk -v devnum="$devnum" '$0~devnum{c=5} c&&c--' "$data" > "$devicedata"

data1つの目的でawk変数名として使用し、dataまったく別の目的でシェル変数名として使用するのは混乱していたので、そのうちの1つの名前を変更しました。

おすすめ記事