2016-09-28 179 views
0

我有一個由下面的java代碼編寫的日誌文件。shell腳本在unix中逐行讀取文件並更新文件中的行

<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

把''變成'Processed'之前,它的舊值是多少?除非它至少與新狀態一樣長(例如「未處理」),否則你不能在原地進行更改;較長的狀態會覆蓋文件下一行的內容。另外,讀取一條線,尋找一條線,並在shell中寫一行是非常困難的。所以,你寫給'同一個文件'的大綱方法在shell中基本上是有致命缺陷的。這在C語言或類似的語言中會很棘手;如果長度條件滿足,它可以完成,但它可能不是一個好主意。您應該將信息複製到新文件。 –

+2

歡迎來到Stack Overflow!請[編輯]你的問題,以顯示[你迄今爲止所嘗試的](http://whathaveyoutried.com)。您應該包含您遇到問題的代碼[mcve],然後我們可以嘗試幫助解決特定問題。你還應該閱讀[問]。 –

+0

| | | | | | 在這裏,我需要逐行閱讀獲取命令並執行更新錯誤 - 在同一個日誌文件中處理。 –

回答

2

你可以試試這個:

#!/bin/bash 
awk -F"|" 'BEGIN{ OFS="|"}{ 
    if ($3 ~ "Error"){ 
    system($2); 
    $3="Processed"; 
    } 
    print $0 > "/tmp/logfile.new"; 
}' logfile 
mv /tmp/logfile.new logfile 
  • awksystem()將執行這是第二 場(由|分隔),如果第三場有「錯誤的命令「狀態。
  • 然後第三欄被標記爲「已處理」。
  • 最後一行mv命令將創建的新文件移動到原始輸入文件 。
  • 正如我在文章的評論中指出的那樣,應該注意的是system()的輸出將被打印在控制檯上,並且文件的修改內容將被重定向到文件。
+1

值得注意的是,'print'語句中的重定向意味着由'system'執行的命令的標準輸出轉到標準輸出('awk') - 這就是爲什麼你不執行shell-輸出日誌文件的級別重定向。這是你很好地編碼的一個微妙點,但應該呼籲。您應該也可以聲明,您不能/不要現場修改文件。 –

+0

我需要在文件中逐行循環,我必須執行命令並將狀態替換爲。我的疑問是,我們怎樣才能在循環中逐行替換字符串。 –

+0

我的帖子中顯示的'awk'命令逐行讀取文件,並使用'system()'調用執行命令,然後將第三個字段更改爲「Processsed」。 – Fazlin