2016-09-28 15 views
0

以下のようなJavaコードでログファイルを作成しました。ファイルをUNIXで1行ずつ読み込んでファイル内の行を更新するシェルスクリプト

<date>|<command>|<Error> 
<date>|<command>|<Error> 
<date>|<command>|<Error> 
<date>|<command>|<Error> 

私はラインからラインでラインにループにスクリプトを記述し、コマンドを実行し、=同じファイルに行に「処理済み」のステータスを更新する必要があります。

AutoTrigger() 
{ 

echo "`date`: Checking the status of the files . Please wait..." 

if [[ -s /tmp/samplefilelog.log ]] ; then 

cat /tmp/samplefilelog.log | while read LINE 
do 
echo "LINE:" $LINE 
LINE1=`echo $LINE | grep -v Processed` 
echo "LINE1:" $LINE1 
Command=`echo $LINE1 | cut -d "|" -f3` 
echo "command:" $Command 
$Command >> /tmp/Processinglogs.txt 
printf $LINE | awk 'BEGIN{FS=OFS="|"}{$4="Processed";print}' 

cat /tmp/samplefilelog.log 
done 
fi 

} 

おかげ

+2

「処理済」に変更する前に、古い値「」は何ですか?少なくとも新しいステータス(例えば、「未処理」)と同じくらい長くならない限り、その場で変更を行うことはできません。より長いステータスは、ファイルの次の行のマテリアルを上書きします。さらに、行の読み込み、行の検索、およびシェルへの行の書き込みが非常に難しい。したがって、「同じファイル」に書き込むアウトラインアプローチは、本質的にシェルで致命的な欠陥があります。それはC言語やそれに類する言語では難しいでしょう。それは長さの条件が満たされている場合に行うことができますが、おそらく良い考えではありません。情報を新しいファイルにコピーする必要があります。 –

+2

ようこそスタックオーバーフロー!質問を編集して[これまでに試したこと](http://whathaveyoutried.com)を表示してください。問題のあるコードの[mcve]を含める必要があります。次に、特定の問題を解決するために役立つことができます。 [ask]も読んでください。 –

+0

| | | | | | ここで私は行ごとにコマンドを取得し、同じログファイル内でエラー処理済みの更新を実行する必要があります。 –

答えて

2

あなたはこれを試すことができます。awk

#!/bin/bash 
awk -F"|" 'BEGIN{ OFS="|"}{ 
    if ($3 ~ "Error"){ 
    system($2); 
    $3="Processed"; 
    } 
    print $0 > "/tmp/logfile.new"; 
}' logfile 
mv /tmp/logfile.new logfile 
  • system()は、3番目のフィールドは、「エラーを持っている場合(|で区切られた)第二 フィールドでコマンドを実行します"状態で。
  • 次に、3番目のフィールドに「処理済み」とマークされます。
  • mvコマンドの最後の行は、作成された新しいファイルを元の入力ファイル に移動します。
  • 私の投稿へのコメントで指摘したように、system()の出力がコンソールに出力され、ファイルの変更内容がファイルにリダイレクトされることに注意してください。
+1

'print'ステートメントのリダイレクトは、' system'によって実行されたコマンドの標準出力が(awkの)標準出力に行くことを意味することに注意する価値があります。なぜなら、出力ログファイルのレベルリダイレクションそれはあなたがコーディングするのにはうまくやった微妙な点ですが、呼び出す必要があります。あなたはおそらく、その場でファイルを変更できない/できないと述べるべきです。 –

+0

私はファイルを1行ずつループする必要があります。コマンドを実行して、のステータスをに置き換えてください。私の疑問はここでは、どのようにlooopの行ごとに文字列を一つずつ置き換えることができるかということです。 –

+0

私のポストに表示された 'awk'コマンドはファイルを1行ずつ読み込み、' system() 'コールを使ってコマンドを実行し、3番目のフィールドを" Processeded "に変更します。 – Fazlin

関連する問題