Bashでログを変数に割り当てる方法

Bashでログを変数に割り当てる方法

ログ出力を「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ループを使用してIFSNoneに設定し、-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に示されているようにデータが破損するのを防ぎたいのですが、-rsyslogエントリは非常によく構造化されており、どのような場合でもそうする必要はありません。 OTOHは病気ではなく、良い習慣だと付け加えました。

たとえば、now-10minが「11月31日23:55」で、今が「12月01日00:05」の場合、実際にはこの日付間のすべての日付文字列は日付文字列比較では機能しません。二度はなるだろう失敗するテストを受ける$line > $d1 && $line < $d2

関連情報