linux_sed操作
sed处理流程
使用shell命令,将当前目录所有文件中的"www.58.com"替换为"58.com"
sed -i "s/www.58.com/58.com/g" `grep www.58.com -rl ./`
使用sed命令可以进行字符串的批量替换操作,使用的格式如下:
sed -i "s/oldstring/newstring/g" `grep oldstring -rl path`
其中,oldstring是待被替换的字符串,newstring是待替换oldstring的新字符串,grep操作主要是按照所给的路径查找oldstring,path是所替换文件的路径
-i:直接在文件中替换,不在终端输出
-r:所给的path中的目录递归查找
-l:输出所有匹配到oldstring的文件
sed 'p' passwd打印两行一模一样的(因为默认已经输出到屏幕上一次,在p一下就两次了),sed -n 'p' passwd就可以正常显示一行,-n忽略默认输出,把默认的输出忽略了
nl passwd就会把行号显示出来
定位一行的方式:
1、行号
nl passwd | sed -n '22p'就会把第22行的行号和内容输出来,nl -b a passwd,nl -b a的意思把空白行的行号也显示出来
2、正则表达式
sed -n '/mysql/p' passwd,利用正则表达式把mysql这行打印出来
定位多行的方式:
1、行号
nl passwd | sed -n '1,5p'显示1-5行,多行显示
2、正则表达式
可以用正则表达式nl passwd | sed -n '/mysql/,/ssj/p'定位多行,也可以用行号和正则同时来定位(nl passwd | sed -n '1,/adm/p')
不选择这一行或几行:
nl passwd | sed -n '10!p' 不要第10行
nl passwd | sed -n '6,10!p' 不要第6-10行
间隔几行:
nl passwd | sed -n '6~2p' 从第6行开始,步长是2,中间是~线,打印出第6,8,10......
基本操作命令:
a:新增行 nl passwd | sed '12a=====',在第12行后面插入5个=,nl passwd | sed '1,5a=====',在1-5行后面插入5个=
i:插入行 nl passwd | sed '12i=====',在第12行前面插入5个=,nl passwd | sed '1,5i=====',在1-5行前面插入5个=
c:替代行 nl passwd | sed '12c=====',把第12行换成5个=,nl passwd | sed '7,12c=====',把7-12行变成1行,5个=
d:删除行 nl passwd | sed '12d',删除第12行,nl passwd | sed '7,12d',把7-12行都删除
修改配置文件,在profile中添加环境变量:
sed -i '$a\ export TOMCAT_HOME=XXXX\n export PATH=$PATH:$TOMCAT_HOME' profile $代表最后一行,a是最后一行后面新增,\代表输入空格,\n换行,-i是修改文件内容,直接在profile里面就追加成功了
删除空行:
sed '/^$/d' AAA.txt ^代表行的开始,$代表行的结束,^$代表空白行
服务器日志处理,服务器log中打印error信息:
sed -n '/error/p' AAA.txt(包含error的行被打印出来)
替换操作:s
分隔符: /
全局替换: g sed 's/:/*/g' passwd 把passwd文件里的所有:都换成*,如果没有写g,只把第一个:替换成*
批量替换: %s/src/new/g %s是全部替换,src是要替换的内容,new是要替换成新的内容
替换1-5行: 1,5s/src/new/g
多个sed命令用;隔开 nl passwd | sed '{10,20d;s/:/*/g}' 删除掉10-20行且将:全部换成*
nl passwd | sed -n '{n;p;}' 大括号里的n是跳过这一行直接处理下一行然后打印,打印就是2,4,6,8...... nl passwd | sed -n '{n;n;p;}' 打印3,6,9......,也可以用步长的方式打印3,6,9行 nl passwd | sed -n '{3~3p}'
&:替换固定的字符串,配合替换操作使用,将passwd中用户名后添加空格 sed 's/[a-z_-]\+/& /' passwd,先把用户名筛选出来,用户名这么表示[a-z_-],正则a-z随机取一个,passwd里多个用户名,使用+,将+转义用\+,&就是代表[a-z_-],匹配用户名
将用户名的首字母转换为大写 \u,小写 \l ,sed 's/[a-z_-]\+/\u&/' passwd,ls | sed 's/.*/\u&/'
对一串字符转大写 \U,小写 \L, ls | sed 's/.*/\U&/',&就是代表.*,.代表除了换行符以外的所有字符
() \(\),括号要转义,替换某部分字符串,cat test.txt | sed 's/w1\(w2\)\(w3\)/\1\2/' ,\1代表第一个正则表达式括弧里面的字符,\2第二个正则表达式括弧里面的字符
获取eth0的IP,有三种方式,一是ifconfig|sed -n '/inet.*Bcast/p'|sed 's/\s\+inet.*r://'|sed 's/\s\+Bcast:.*//',\s代表空格,+代表一个以上,要转义使用\+,就会打印出192.168.1.15
第二种是ifconfig | sed -n '/inet .*Bca/p' | sed 's/ine.*r:\([0-9\.]\+\).\+Bcast.*$/\1/',[0-9\.]代表ip的正则表达式,.要转义用\.,一个ip以上\+,.\+中间有一个以上任意字符,.*$,Bcast后面任意字符
第三种是ifconfig | sed -n '/inet .*Bca/p' | sed 's/ine.*r:\([0-9\.]\+\).*Bcast:\([0-9\.]\+\).*Mask:\([0-9\.]\+\)/\1/',ifconfig | sed -n '/inet .*Bca/p' | sed 's/ine.*r:\([0-9\.]\+\).*Bcast:\([0-9\.]\+\).*Mask:\([0-9\.]\+\)/\1,\2,\3/'可以把三个ip都取出来
获取passwd中的用户名,uid,gid, sed 's/\(^[a-z_-]\+\):x:\([0-9]\+\):\([0-9]\+\):.*$/\1,\2,\3/' passwd
r:读取指定文件插入到匹配行,sed '1r a.txt' b.txt,读取a.txt文件的内容,插入到b.txt文件的第一行,读文件不会改变文件内容,a.txt和b.txt文件内容不会改变
w:复制匹配行拷贝指定文件里,sed '1w a.txt' b.txt,拷贝b.txt文件的第一行,写到a.txt文件里,覆盖写,a.txt变成了aaa,写操作会改变目标文件
q:退出sed,使用q可以提前退出sed nl passwd | sed '5q',打印到第5行就退出sed了
-e:可以执行多次sed命令,nl passwd | sed -e '10,20d' -e 's/:/*/g',删除10-20行并且将:全部替换成*