用sed替换内联,但也打印输出

时间:2017-06-21 23:32:40

标签: unix sed replace

我正在尝试内联修改文件,例如

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

我还想将此更改的结果输出到日志文件中。结果可能是任何结果,但理想情况下,我希望得到一些肯定的改变。

2 个答案:

答案 0 :(得分: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 :(得分: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一样)并且每次都可以将你喜欢的任何消息打印到stderr(或者你喜欢的任何地方,通过修改cat>&2)做替换。