linux shell实现查询到匹配语句并进行截取其第一个字符?awk好像可以?

要求:1)在某一配置文件中查到到匹配udp(ip("0.0.0.0") port (514)) 这行;2)去掉这行的注释符#
就像shell脚本实现自动修改打开允许root登录一样~(修改sshd_config ,去掉"#permit root login yes”这行注释)

第1个回答  2011-11-14
#!/bin/bash

awk \
-vfile1="/tmp/udp.txt" \
-vfile2="/tmp/sshd_config" \
'BEGIN{
mstr = ""
while(getline<file1>0){
if($0 ~ /^\#.*udp\(ip\(\"0.0.0.0\"\) port \(514\)/)
mstr = mstr substr($0, 2) "\n"
else
mstr = mstr $0 "\n"
}

print mstr > file1

mstr = ""
while(getline<file2>0){
if($0 ~ /^\#permit root login yes$/)
mstr = mstr substr($0, 2) "\n"
else
mstr = mstr $0 "\n"
}

print mstr > file2
}'

我不知道你说的那两个文件的路径如何,所以就放了/tmp,你自己可以相应更动。sshd_config那条是删掉#,还是整行删掉?上边code是删掉#,如果要整行删掉,就改成mstr = mstr就好了。追问

谢谢你的回答,而且你考虑很详细包括有没有截取到都做了判断,有命令行可以解决么?

追答

你可以把上述内存存成一个文件,然后chmod 755 文件,直接运行那个文件就可以了。

我的理解是你要自动把配置文件里的#去掉,然后再写回原文件,对吧?如果不是的话,请说明,那样就不用这么复杂了。

第2个回答  2011-11-14
你试试这个
file是你要编辑的文件,

#!/bin/bash
file=test
num=(`grep -n "#udp(ip(\"0.0.0.0\") port (514))" $file | awk -F: '{print $1}'`)
for i in ${num[*]}
do
#echo $i
sed -i "${i}s/^#//g" $file
done追问

grep "#udp(ip(\"0.0.0.0\") port (514))" test.sh | sed -i 's/^#//g' test.sh
你这个grep "#udp(ip(\"0.0.0.0\") port (514))" test.sh并没有实现,所以文件中#开头全截取没了,我只要那一行。再修改修改

追答

把test换成你要编辑的文件名,你在试一下吧。

第3个回答  2011-11-15
sed -i.bak 's/^#\(.*udp(ip("0.0.0.0") port (514)).*\)/\1/'追问

谢谢,请问sed后面每个参数及符号是什么意思,能详细赐教下么~man手册看了下,还是有些疑惑~不胜感激

追答

\( \) 可以实现标记内容,在后边实现引用,从左边到右边第一个就是\1,第二个就是\2

PS:哥们,我女朋友急用积分,----觉得可以就赶紧给积分呗...

参考资料:sed 与 awk 详解

本回答被提问者采纳
相似回答