使用sed或awk更新行

使用sed或awk更新行,sed,awk,Sed,Awk,我想打开httpd.conf文件并用新参数更改LogFormat行。 标准是该行应以“LogFormat”开头,以“combined”结尾 下面是我手动操作的方式。我想按程序更改行 vi /etc/httpd/conf/httpd.conf #LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined LogFormat "\"%h\" \"%l\" \"%u\" \"%{%Y-%m-

我想打开httpd.conf文件并用新参数更改LogFormat行。 标准是该行应以“LogFormat”开头,以“combined”结尾

下面是我手动操作的方式。我想按程序更改行

vi /etc/httpd/conf/httpd.conf 
#LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
LogFormat "\"%h\" \"%l\" \"%u\" \"%{%Y-%m-%d %H:%M:%S}t\" \"%r\" \"%>s\" \"%b\" \"%{Referer}i\" \"%{User-Agent}i\" \"%D\" \"%T\" \"%q\" \"%f\" \"%v\" " combined

您可以尝试以下方法:

sed 's/^LogFormat.*combined$/new-logformat-line-whatever/' httpd.conf

改用Perl,使用它的
-i
(就地编辑)标志


这将修改文件httpd.conf,将备份存储在文件“httpd.conf.bak”中。将“replacement”替换为所需的实际替换文本。

Perl、awk、sed都可以完成此任务。添加-i选项以就地编辑文件(而不是写入stdout)。
#!/bin/bash

cp /etc/httpd/conf/httpd.conf  /etc/httpd/conf/httpd.conf.bak
awk 'BEGIN{
 pat1="\\\"%{%Y-%m-%d %H:%M:%S}t\\\""
 pat2="\\\"%D\\\" \\\"%T\\\" \\\"%q\\\" \\\"%f\\\" \\\"%v\\\""
}
/^LogFormat.*combined/{
 $5=pat1
 $NF=pat2"\042 combined"
}1' file >temp
mv temp /etc/httpd/conf/httpd.conf
#!/bin/bash

cp /etc/httpd/conf/httpd.conf  /etc/httpd/conf/httpd.conf.bak
awk 'BEGIN{
 pat1="\\\"%{%Y-%m-%d %H:%M:%S}t\\\""
 pat2="\\\"%D\\\" \\\"%T\\\" \\\"%q\\\" \\\"%f\\\" \\\"%v\\\""
}
/^LogFormat.*combined/{
 $5=pat1
 $NF=pat2"\042 combined"
}1' file >temp
mv temp /etc/httpd/conf/httpd.conf