SHELL sed

SED 流式编辑器 可以对文档进行非交互式增删改查,逐行处理
sed是对行进行操作,必须先找到行后才可以进行操作。例如:查找包含!和>符号之外的行 sed -n ‘/[>!]/!p’ homework.txt

反向选择:
[ ^ ]:除了小写字母:[ ^a-z ]
! : 除了第一行 sed -n ‘1!p’ homework.txt

适用方式:
		1,前置指令 | sed 选项  “定址符 指令”
		2,sed 选项  “定址符 指令”   被处理文档
			选项 -n 屏蔽默认输出  
					-i  写入文件   
					-r  支持扩展正则
		3, 指令 : p输出   d删除    s替换

大栗子:

		   sed -n '1p' user		//输出第1行
		   sed -n '2,4p' user   //输出第2~4行
		   sed -n '2,+1p' user  //输出第2行以及后面1行
		   sed -n '2p;4p' user  //输出第2行,第4行
			
		  sed -n '/^root/p' user  //在sed中使用正则表达式输出以root开头的行
		  grep "^root" user  		//效果同上
		  egrep "^root|^bin" user  //找root或者bin开头的行  
		  sed -nr '/^root|^bin/p' user  //在sed中查找,-r使用扩展正则,效果同上
		 
		  sed -n '=' user    				//查看所有行号
		  sed -n '$=' user  			    //查看最后一行的行号,相当于查看文档总共有几行
		  sed -n '$p' user  //查看最后一行
		  sed -n '1!p' user   //查看除了第1行以外的行, !代表取反
			
		  sed  '1d' user   //删第1行
		  sed  'd' user   //删所有
		  sed  '2,5d' user   //删2~5行
		  sed  '1d;3d' user   //删第1行,第3行
		  sed  '$d' user   //删除最后一行

sed中的替换,使用 s/old/new/
vim test.txt //准备素材,写入下列内容
2017 2011 2018
2017 2017 2024
2017 2017 2017

		sed 's/2017/8888/' test.txt  		   		 //替换所有行的第1个2017为8888
		sed '1s/2017/8888/' test.txt      		//替换第1行的第1个2017
		sed '1,2s/2017/8888/' test.txt  		//替换1~2行
		sed 's/2017/8888/2' test.txt   			//替换所有行的第2个2017
		sed '/2011/s/2017/8888/' test.txt  	//替换有2011的行的第1个2017
		sed 's/2017/8888/g' test.txt      		//替换所有行的所有个,g代表全局
		sed -n 's/root/6666/p'  /etc/passwd  //替换每行第1个root,并只显示被替换的行
		sed -n 's/root/6666/2p'  /etc/passwd  //替换每行第2个root,并只显示被替换的行
		sed -n 's/root/6666/gp'  /etc/passwd  //替换每行的所有root
		sed '3s/2017/8888/;3s/2017/8888/' test.txt  //替换第3行的第1个和第2个2017
		
		符号发生冲突:可以使用转义符或更改间隔符号
		尝试将user文档中的/bin/bash替换成/sbin/sh
		sed 's//bin/bash//sbin/sh/' user    //常规手段替换,内容会与替换 冲突,替换失败
		sed 's/\/bin\/bash/\/sbin\/sh/' user  //使用\转义符号,可以成功,但不方便
		sed 's!/bin/bash!/sbin/sh!' user   //更改替换的间隔符号是最理想方法
		sed 's(/bin/bash(/sbin/sh(' user   //效果同上

利用替换来实现其他功能,删除,排序:s/xxx// s/(xx)/\n/

		删除文件中每行的第二个、最后一个字符
				sed 's/.//2;s/.$//' test    分两个步骤完成,中间用分号隔开,第一步将每行的第二个任意字符替换成空,第二步将每行的最后一个任意字符替换成空即可
		将文件中每行的第一个、倒数第1个字符互换
					echo abc > abc			//创建素材
					sed -r 's/(a)(b)(c)/\3\2\1/' abc  //替换abc时复制每一个字符,后面替换的内容用\数字粘贴,可以任意调换位置
					sed -r 's/^(.)(.*)(.)$/\3\2\1/' abc   //升级,全匹配,分别找到第1个字符和最后1个字符,中间可以是任意
		为文件中每个大写字母添加括号
					sed -r 's/([A-Z])/(\1)/g' test  //先找到任意大写字母,然后保留,最后替换成带括号的状态

sed的a,i,c命令:

			sed中除了常用的p d s 三个指令,还有 a行下追加   i行上添加   c替换整行
			sed 'a 666' user  //在所有行下追加666
			sed '1a 666' user  //第1行下追加666
			sed 'i 666' user   //所有行上添加666
			sed '3i 666' user  //第3行上添加666
			sed 'c 666' user   //所有行替换成666
			sed '/root/c 666' user  //找到有root的行替换成666

栗子:

				编写脚本,找到使用bash解释器的用户,并按照 “用户名 --> 密码” 的格式保存到log文件中
				#!/bin/bash
				u=$(sed -n '/bash$/s/:.*//p' /etc/passwd)   //找到使用bash的人,并且将这些用户的名字存到变量u中
				for i in $u   //将这些人交给for循环处理
				do
				        u1=$(grep $i: /etc/shadow)  //用每个人名找到密码文件中shadow中对应的信息
				        u2=${u1#*:}  //然后掐头
				        u3=${u2%%:*}  //再去尾,得到纯粹的密码
				        echo "$i --> $u3"    //再按格式输出,如果需要保存就用 >> log 
				done
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值