
以下は数十行を変数として抽出しますが、何らかの方法ですべて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
さて、シェルは空白、タブ、および改行(デフォルト)の値を単語に分割し、ファイル名を生成する(ワイルドカード)単語にそれぞれをさらに拡張するため、すべての改行が消えたことに驚くことはありません。これは拡張が参照されないために行われます。その後、ユーティリティはecho
1行に印刷された単語のリストを取得します。
より良いテストは
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
できるだけ多くのファイルを一度に直接実行します。これを削除しても改行の問題は解決されません。改行問題とは何の関係もないからです。これにより作業速度が向上します。 。grep
debug.log*
xargs
xargs
grep
また、見ることができます「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」を理解する
答え2
manxargs
-L max-lines Use at most max-lines nonblank input lines per command line. Trailing blanks cause an input line to be logically continued on the next input line. Implies -x. -l[max-lines], --max-lines[=max-lines] Synonym for the -L option. Unlike -L, the max-lines argument is optional. If max-lines is not specified, it defaults to one. The -l option is deprecated since the POSIX standard specifies -L instead.