【发布时间】:2017-11-25 01:08:11
【问题描述】:
我正在尝试内联修改文件,例如
sed -i -e 's/^bantime = 600/bantime = 86400/' /etc/fail2ban/jail.conf
我还想将此更改的结果输出到日志文件。结果可以是任何东西,但理想情况下,我希望得到一些积极的肯定,即做出了改变。
【问题讨论】:
-
您的单行似乎只打印更改,而不是修改文件。
我正在尝试内联修改文件,例如
sed -i -e 's/^bantime = 600/bantime = 86400/' /etc/fail2ban/jail.conf
我还想将此更改的结果输出到日志文件。结果可以是任何东西,但理想情况下,我希望得到一些积极的肯定,即做出了改变。
【问题讨论】:
以下是如何让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
【讨论】:
只需使用 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 来打印您喜欢的任何其他位置)。
【讨论】:
> "/dev/stderr" 而不是通过管道连接到cat,不是吗?