一致するパターンを持つファイルを読み取り、パターンを一致させてから最初の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スクリプトに関連していないため、デバッグに役立ちます。しかし、あなたがやりたいことはgetlineを使うべきではありません。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"
data
1つの目的でawk変数名として使用し、data
まったく別の目的でシェル変数名として使用するのは混乱していたので、そのうちの1つの名前を変更しました。