2014-11-21 59 views
2

在排除重新引導崩潰的故障時,我需要將文件中的每一行都打印到輸出控制檯。我想要做的是運行Linux命令行或腳本採取在一個文件中的每一行,並把打印語句後,包含該行,因此,例如:向前一行輸出的文件中的每一行添加一條打印語句作爲輸出

while x<100 
    x=x+1 
end while 

將成爲

while x<100 
print "while x<100" 
    x=x+1 
    print "x=x+1" 
end while 
print "end while" 

更妙的是如果打印語句可能包括行號:

while x<100 
print "Line 50: while x<100" 
    x=x+1 
    print "Line 52:x=x+1" 
end while 
print "Line 54: end while" 

這裏的想法是找到執行因爲這將是可能CAU行腳本中的最後一行sed設備重啓。目前我手動執行此操作,添加所有這些行相當耗時。

我知道SED和AWK的存在,但從來沒有使用過它們,我經常使用ex/vi/grep/ls/wc來排序文本文件,並且有基本的shell腳本經驗。

編輯:請注意,我的問題中的代碼都不是shell腳本。我正在尋找幫助來創建shell腳本或命令行來處理文件,以便文件中的每一行都跟着包含上一行的打印語句。

+0

知道用什麼語言你的代碼中,要知道如何逃生的數據是非常重要的當你的代碼行已經包含引號時的打印語句。 – 2014-12-21 02:47:37

+0

閱讀你的目的與答案,對我來說,似乎你試圖測試你的腳本,而不是正確地調試它。一種方法喜歡[this](http://stackoverflow.com/questions/21190771/how-to-properly-debug-a-bash-script)使用'set -xv'或'extdebug',看起來更可行。 – 2014-12-21 10:43:35

回答

2
awk '{printf("%s\nprint \"Line %s : %s\"\n",$0,++NR, $0)}' infile > outfile 

while x<100 
print "Line 2 : while x<100" 
    x=x+1 
print "Line 4 :  x=x+1" 
end while 
print "Line 6 : end while" 

$0是每行的內容,NR是行/記錄號。


對於已經有報價和報表打印的線條,使用下面的修改awk命令:

awk '{printf("%s\nprint \"Line %s : ",$0,++NR)} {gsub(/\"/,"\\\"");printf $0"\"\n"}' infile > outfile 
+0

謝謝,你的答案在我的想法中也暴露了一些缺陷,現在我需要弄清楚如何處理已經有引號和打印語句的行,可能只需添加一個「前面的內容:可能會工作 – alphablender 2014-12-22 20:24:04

+1

@alphablender更新了處理行的答案有引號。 – 2014-12-23 11:47:22

1

那麼,一個基本的擊外殼腳本將是

while read -r line 
do 
    echo "$line" 
    printf "print \"%q\"\n" "$line" 
done 

此僅使用bash的內建並且意味着被放置在腳本文件中(在該終端輸入它可能會混淆read命令)。它目前需要從stdin輸入,但重定向操作符(如command < file.txt)將解決該問題。

還要注意在調用printf時使用%q格式說明符,它確保可以將返回的結果傳回到shell中以獲取相同的文本。

+0

輸出不乾淨,似乎是相反的順序,並且線條被一起沖洗,而且每條輸出線都有一個打印語句,而不是每隔一行 – alphablender 2014-12-22 20:17:09

+0

@alphablender請參閱我的編輯,我添加了一個換行符''printf''函數來解決它。 – randomusername 2014-12-23 04:01:17

+0

您還需要在'echo「$ line」'中加雙引號,否則'line'中的任何元字符將被shell解釋(重定向,通配符,變量擴展...浩浩蕩蕩)。同樣,你應該使用'read -r'來爲'read'提供更少的「有用」語義。 – tripleee 2014-12-23 04:56:18