2017-06-21 101 views
1

我試圖內聯修改文件,例如使用sed替換內聯,但也打印輸出

sed -i -e 's/^bantime = 600/bantime = 86400/' /etc/fail2ban/jail.conf 

我也想把這個改變的結果輸出到日誌文件中。結果可能是任何事情,但理想情況下,我希望得到一些積極的肯定,說明已做出改變。

+0

您的單行顯示只顯示更改,不修改文件。 – mikep

回答

2

這裏是如何得到sed -i(內嵌SED)打印其標準輸出的進步,一個變化是否是由:

$ echo 'bantime = 600' > jail.conf 
$ sed -i -e 's/^bantime = 300/bantime = 86400/g; w /dev/stdout' jail.conf 
bantime = 86400 
$ cat jail.conf 
bantime = 86400 

如果反覆運行上面的命令,而不重置jail.conf,則沒有將進行更改,但sed仍將打印相同的輸出。

僅打印已更改行,請刪除上面行中的分號。例如:

$ echo 'asdf\nbantime = 600' > jail.conf 
$ echo 'a second line of text' >> jail.conf 
$ sed -i -e 's/^bantime = 600/bantime = 86400/g w /dev/stdout' jail.conf 
bantime = 86400 
$ cat jail.conf 
bantime = 86400 
a second line of text 

最後,要保存一個備份,你可以通過一個擴展-i開關:

$ echo 'asdf\nbantime = 600' > jail.conf 
$ echo 'a second line of text' >> jail.conf 
$ sed -i .old -e 's/^bantime = 600/bantime = 86400/g w /dev/stdout' jail.conf 
bantime = 86400 
$ cat jail.conf 
bantime = 86400 
another line of text 
$ cat jail.conf.old 
bantime = 600 
another line of text 
+1

謝謝!第一個腳本打印整個文件(不是很有幫助);然而,第二個腳本塊(「僅打印_changed_行...」)正是我所需要的。 – Christian

+0

@Christian,很高興聽到!我在回答過程中學到了一些關於sed的東西:) –

0

只需使用AWK:

awk -i inplace 'sub(/^bantime = 600/,"bantime = 86400"){ print "Replaced line", NR, $0 |"cat>&2" } 1' /etc/fail2ban/jail.conf 

以上使用GNU AWK就地編輯(就像GNU sed與-i一樣),並且可以打印任何你喜歡的信息(或者你喜歡的任何其他信息,通過修改cat>&2)每次它進行替代。

+0

你可以使用'>「/ dev/stderr」'而不是管道連接到'cat',你不可以嗎? –

+0

是的,但它不能移植到所有的UNIX機器上。 –