ログ出力を「line」に割り当てたいです。以下を試しました。
line=tail -1000 /var/log/syslog
しかし、うまくいきません。
myscriptは次のとおりです
#!/bin/bash
line=`tail -1000 /var/log/syslog`
d1=$(date --date="-10 min" "+%b %_d %H:%M")
d2=$(date "+%b %_d %H:%M")
while read line; do
[[ $line > $d1 && $line < $d2 || $line =~ $d2 ]] && echo $line
done
答え1
この変更を試してください。
fd=""
tmplog="/tmp/temp_${$$}_${RANDOM}"
tail -1000 /var/log/syslog > "$tmplog"
exec {fd}<"$tmplog"
while IFS='' read -r -u $fd line || [[ -n $line ]]; do
#your commands here
done
exec {fd}>&-
rm "$tmplog"
仕組み:fd
変数に割り当てられます。スクリプトPIDと組み込みの「ランダム」番号を使用して一時ファイルを生成します(代わりにmktempコマンドを使用することもできます)。fd
一時ファイルを読み取るためにファイル記述子を開きます。 whileループを使用してIFS
Noneに設定し、-u
読み取りオプションを使用して読み取りコマンドを実行しますfd
。同じ変数を使用してループ内にコマンドを配置しますline
。ファイル記述子を閉じます。一時ファイルを削除します。
答え2
$( ... )
バックティックよりも強力でスタイルが良いですが、割り当てはうまく機能します。しかしread line
読まない~から行、stdinから読み込みます(リダイレクトしていないので端末)。入力するいいですね。古いコンテンツを破棄します。次のいずれかを試してください。
data=$(tail -1000 /file)
while read line; do echo "$line"; done <<<"$data"
# bash ksh zsh but maybe not older shells
# or
while read line; do echo "$line"; done < <(tail -1000 file)
# ditto
data=$(tail -1000 /file)
echo "$data" | while read line; do echo "$line"; done
# or
tail -1000 file | while read line; do echo "$line"; done
# most shells, but any var set (or other shell change made) within the loop
# will disappear on _some_ shells because pipelines are run in subshells
ループに適切なコマンドを追加します。
read
通常、EnterUserNameHereに示されているようにデータが破損するのを防ぎたいのですが、-r
syslogエントリは非常によく構造化されており、どのような場合でもそうする必要はありません。 OTOHは病気ではなく、良い習慣だと付け加えました。
たとえば、now-10minが「11月31日23:55」で、今が「12月01日00:05」の場合、実際にはこの日付間のすべての日付文字列は日付文字列比較では機能しません。二度はなるだろう失敗するテストを受ける$line > $d1 && $line < $d2