xargs -I {}で改行を維持する方法

xargs -I {}で改行を維持する方法

以下は数十行を変数として抽出しますが、何らかの方法ですべて1行に配置します。つまり、元の改行が失われます。

ALL_FOUND_LINES=$(find "$TEMP" -type f -name "debug.log*" | xargs -I {} grep -F "STARTING HOST " {})

上記の文で改行文字を保存する方法はありますか?

ベストアンサー1

これをテストする場合

echo $ALL_FOUND_LINES

$ALL_FOUND_LINESさて、シェルは空白、タブ、および改行(デフォルト)の値を単語に分割し、ファイル名を生成する(ワイルドカード)単語にそれぞれをさらに拡張するため、すべての改行が消えたことに驚くことはありません。これは拡張が参照されないために行われます。その後、ユーティリティはecho1行に印刷された単語のリストを取得します。

より良いテストは

printf '%s\n' "$ALL_FOUND_LINES"

変数の拡張に関する注意事項を参照してください。printf以上のオプションについては、以下echoを参照してください。なぜprintfがechoより優れているのですか?


あなたのコマンドは次のように改善することができます。

find "$TEMP" -type f -name 'debug.log*' -exec grep -h -F 'STARTING HOST ' {} +

xargsここでは、ファイル名をに渡すのではなく、findできるだけ多くのファイルを一度に直接実行します。これを削除しても改行の問題は解決されません。改行問題とは何の関係もないからです。これにより作業速度が向上します。 。grepdebug.log*xargsxargsgrep

また、見ることができます「find」の-execオプションについて

見つかった各行に対していくつかの操作を実行する必要がある場合は、次のように繰り返すことができます。

find "$TEMP" -type f -name 'debug.log*' -exec grep -h -F 'STARTING HOST ' {} + |
while IFS= read -r line; do
    # use "$line" here (with quotes)
done

(または実行する必要がある他の処理ステップでwhileループを置き換えます。)したがって、すべてのデータを変数に改行区切り文字列として保存する必要はありません。

また、見ることができます「IFS=read-r-line」を理解する

おすすめ記事