linux_sed操作

Posted laosun0204

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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行并且将:全部替换成*

 

-i:可以修改文件的内容

 

修改当前目录下所有文件中包含aaa的文件,将aaa改成AAA

grep aaa -rl .这个命令就可以将当前目录下所有文件中包含aaa的文件给查找出来,通过 sed -i "s/aaa/AAA/g" `grep aaa -rl .` 即可实现

以上是关于linux_sed操作的主要内容,如果未能解决你的问题,请参考以下文章

脚本学习_Linux_Sed命令_替换

脚本学习_Linux_Sed命令_替换

Kotlin 协程Flow 操作符 ② ( 末端操作符 | collect 操作符 | reduce 操作符 | single 操作符 | first 操作符 | toList 操作符 )

Kotlin 协程Flow 操作符 ② ( 末端操作符 | collect 操作符 | reduce 操作符 | single 操作符 | first 操作符 | toList 操作符 )

jQuery操作元素属性操作样式操作样式类操作HTML代码以及其他操作 [学完你还不会吗]

Kotlin 协程Flow 操作符 ① ( 过渡操作符 | map 操作符 | transform 操作符 | 限长操作符 | take 操作符 )