sed 和 awk

sed

sed [选项] 动作 文件
-n		#取消默认输出  ,有n必须要有p,有p加了n才不会有默认输出
	-i		#真正的替换,修改
	-r		#支持扩展正则  (* [A-z] '|')
	
	内部命令:
	
		p		#打印   -n    /号可以不能用别的符号替换-#
		
		d		#删除         /号可以不能用别的符号替换-#
		
		s		#替换         #号可以不能用别的符号替换-/
		g		#全局
		
		a		#追加
		i		#插入
		
		;		#不连续命令的分割   行--删除--
		,		#表示连续的命令   行--删除--
	    '|'      #或者            行--删除--

1.查 

[root@qls ~]# sed -n  '1p'  passwd 		#打印单行,第一行,不能用 ^P
root:x:0:0:root:/root:/bin/bash
[root@qls ~]# sed  -n  '1,3p'  passwd 	#打印连续的多行 不能 '1p,3p'
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
[root@qls ~]# sed  -n '1p;3p'  passwd 	#打印不连续的多行
root:x:0:0:root:/root:/bin/bash
daemon:x:2:2:daemon:/sbin:/sbin/nologin
[root@qls ~]# sed -n  '$p'  passwd 		#打印最后一行  不能 p$
ntp:x:38:38::/etc/ntp:/sbin/nologin

# 连续的行1个p,多个不连续的行2个p(引号最好都加上)--------------


[root@oldboy ~]# stat 2. | sed -n '1,$p'  引号必须要加
  File: ‘2.’
  Size: 10244     	Blocks: 24         IO Block: 4096   regular file
Device: 803h/2051d	Inode: 33615068    Links: 1
Access: (0644/-rw-r--r--)  Uid: (    0/    root)   Gid: (    0/    root)
Context: unconfined_u:object_r:admin_home_t:s0
Access: 2020-04-03 12:02:14.752816436 +0800
Modify: 2020-04-03 11:58:46.135806488 +0800
Change: 2020-04-03 12:01:56.091815546 +0800
 Birth: -

[root@qls ~]# sed  -n  '/root/p'  passwd 		#过滤包含root的行   /号可以不能用别的符号替换
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
[root@qls ~]# sed  -n  '/^root/p'  passwd 		#过滤以root开头的行
root:x:0:0:root:/root:/bin/bash
[root@qls ~]# sed  -nr   '/root|adm/p'  passwd 	#过滤root或者adm的行  #扩展正则
root:x:0:0:root:/root:/bin/bash
adm:x:3:4:adm:/var/adm:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
[root@qls ~]# sed  -n   '/root/p;/adm/p'  passwd 	#过滤root或者adm的行
root:x:0:0:root:/root:/bin/bash
adm:x:3:4:adm:/var/adm:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
[root@qls ~]# sed  -n   '/^root/,/adm/p'  passwd 	#过滤以root开头的行到adm的行
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
[root@oldboy ~]# sed  -nr   '/^halt/,/1/p'  passwd    #过滤以root开头的行到下面1行
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin

# 连续的行1个p,不连续的行2个p(引号最好都加上)(awk过滤最简单)--------------sed里面加了p,必须加 -n才有意义,加了-n,加p才有意义

2.删除 

[root@qls ~]# sed  '1d'  passwd 		#删除第一行

[root@qls ~]# sed  '$d'  passwd			#删除最后一行

[root@qls ~]# sed  '1,20d'  passwd 		#删除连续的多行

[root@qls ~]# sed  '1d;20d'  passwd		#删除不连续的多行

[root@qls ~]# sed  '/root/d'  passwd 	#删除包含root的行

[root@qls ~]# sed -r  '/root|adm/d'  passwd	#删除不连续的多行  /号可以不能用别的符号替换

 [root@qls ~]# sed  '/root/d;/adm/d'  passwd #删除不连续的多行
 
 [root@qls ~]# sed  '/^root/,/adm/d'  passwd	#删除以root开头的行到包含adm的行
 
 [root@qls ~]# sed  '1,$d'  passwd 		#删除所有
 
 # 连续的行1个d,不连续的行多个个d(引号最好都加上),不用加g(awk 不能删除?)-------------- sed 删除最简洁
 
 
 3.增  默认不是真正的追加或插入  -i 是真正的追加或插入
 不加 -i 多次追加或插入无意义 ,加了 -i 可以多次重复追加
 
 [root@qls ~]# sed  '$aoldboy'  sort.log		#在文件的最后一行追加oldboy
 abc/1
abd/11
fgrf/2
fger/8
rgrgh/66
fger/8
abd/11
fgrf/2
oldboy
[root@qls ~]# sed   '1aoldboy'  sort.log	#在文件的第一行后面追加oldboy(1)
abc/1
oldboy
abd/11
fgrf/2
fger/8
rgrgh/66
fger/8
abd/11
fgrf/2

[root@qls ~]# sed  '1ioldboy'  sort.log 		#在第一行的前面插入oldboy
oldboy
abc/1
abd/11
fgrf/2
fger/8
rgrgh/66
fger/8
abd/11
fgrf/2
[root@qls ~]# sed  '$ioldboy'  sort.log 		#在最后一行前面插入oldboy
abc/1
abd/11
fgrf/2
fger/8
rgrgh/66
fger/8
abd/11
oldboy
fgrf/2

[root@qls ~]# sed  '1ioldboy\noldgirl'  sort.log 	#插入多行
oldboy
oldgirl
abc/1
abd/11
fgrf/2
fger/8
rgrgh/66
fger/8
abd/11
fgrf/2
[root@qls ~]# sed  '$aoldboy\noldgirl'  sort.log 	#追加多行 
abc/1	
abd/11
fgrf/2
fger/8
rgrgh/66
fger/8
abd/11
fgrf/2
oldboy
oldgirl

# 'Naxx\nxx' a追加,i插入,N行数,\n多行

4.替换 小弟是tr

[root@qls ~]# cat passwd 
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
[root@qls ~]# sed  's#root#oldboy#g'  passwd 		#把所有的root替换为oldboy     	s 替换	g 全局  #号可以用别的符号替换   (先匹配root整个字符,然后再替换)(不能-n 可以任务是在默认输出的基础上进行的替换,再打印出默认输出)
oldboy:x:0:0:oldboy:/oldboy:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/oldboy:/sbin/nologin

[root@qls ~]# sed  's#root#oldboy#'  passwd 		#替换每一行第一个匹配条件的
oldboy:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/oldboy:/sbin/nologin

[root@qls ~]# sed  '10s#root#oldboy#g'  passwd 		#针对 行 进行替换 (行s)
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/oldboy:/sbin/nologin

[root@qls ~]# sed  '10,11s#root#oldboy#g'  passwd 		#操作多行替换  
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/oldboy:/sbin/nologin
oldboy

[root@qls ~]# sed  '$s#root#oldboy#g'  passwd 		#替换最后一行
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
oldboy

[root@qls ~]# sed  '/^root/s#root#oldboy#g'  passwd 		#替换以root开头的行中root替换为oldboy
oldboy:x:0:0:oldboy:/oldboy:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
oldboy

[root@qls ~]# sed  '/t$/s#root#oldboy#g'  passwd 	#匹配以t为结尾的进行替换
root:x:0:0:root:/root:/bin/bash          # 不能是$t--------
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
oldboy

[root@oldboy ~]# cat passwd |sed 's#[0-9]#hhh#g'    先匹配,再替换
mm:x:hhhhhhhhhhhh:hhhhhhhhhhhh::/tmp/:/bin/bash

# 把root替换为oldboy,可以认为是 边界递增匹配 再替换

[root@oldboy ~]# tr o 9 < passwd  替换,不是真正的替换
[root@oldboy ~]# tr -d o < passwd 删除,不是真正的删除

# 去重
[root@lb01 ~]# echo zzllss|sed -nr 's#(.)(.)#\1#gp'
zls
[root@lib02 ~]# echo nneettssttaatt|awk -F '' '{print $1$3$5$7$9$11$13}'
netstat
[root@lib02 ~]# echo nneettssttaatt|sed -nr 's#(.)(.)#\1#gp'
netstat

awk


awk
awk [选项] 动作 文件
-F    #指定分割符[],默认是以 空白字符 为分隔符  
	"['']" 以空为分隔符,必须用引号把【】括起来 ,不能用【】(数空格),指定多个在一起的分隔符【】+
	指定特殊符号的时候,[\"] 一定要转义
	
	NR	#表示行号(NR== ,NR>= )	Linux中一般都是用 == ,不能直接接$ 取最后一行
	
	NF	#表示每一行的列数
	
	$NF	#表示最后一列 ----不能NF$
	
	$0	#整行内容(打印)
	
	$n	#n是数字   表示取出哪一列  列--
    
    &&	#并且   (行)
    
    ||	#或者  (行)
    '|' #或者   (过滤) 
    
    !	#排除   NR!=   '!/root/'

    
    ’	#取出连续的    行----过滤
    
    ;	#多条命令分割 

#取行 
[root@qls ~]# awk  'NR==1'  passwd 		#取出第一行
root:x:0:0:root:/root:/bin/bash
[root@qls ~]# awk  'NR==1,NR==3'  passwd 	#取出第一行到第三行(不能是NR==1,3 ,这样只能取第一列)
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
[root@qls ~]# awk  'NR==1;NR==3' passwd 		#取出第一行和第三行
root:x:0:0:root:/root:/bin/bash
daemon:x:2:2:daemon:/sbin:/sbin/nologin


[root@qls ~]# awk  'NR>10'  passwd 		#取出大于10行的所有行的的内容
root
[root@qls ~]# awk 'NR<2'  passwd 		#取出小于两行的内容
root:x:0:0:root:/root:/bin/bash
[root@qls ~]# awk 'NR<=2'  passwd 		#小于等于
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
[root@qls ~]# awk 'NR>=10'  passwd 		#大于等于
operator:x:11:0:operator:/root:/sbin/nologin
root

[root@qls ~]# awk 'NR>=1 && NR<=10'  passwd 		#取出大于等于第一行并且小于等于第十行    &&  并且,两个条件都要满足  awk里面,> 只能用一种,不然会错误显示整个文件内容,,不能用,代替&&
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin

[root@qls ~]# awk 'NR>0 && NR<11'  passwd		#取出大于等于第一行并且小于等于第十行    &&  并且  不能用','

[root@qls ~]# awk  'NR<2 || NR>10'  passwd 		#取出小于2行或者大于10行   ||  或者,满足一个条件就可以  ,不能 '|'
root:x:0:0:root:/root:/bin/bash
root

[root@oldboy ~]# awk 'NR==5 {print}' /etc/passwd	{print}加不加都一样
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
[root@oldboy ~]# awk 'NR==5' /etc/passwd
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin

[root@oldboy ~]# cat /etc/passwd|awk 'NR==5'
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin


理解,awk取行最简单,可以取数据或者数据流,,取多个不连续行的时候,必须加多个NR--一般的命令都可以处理数据或数据流wc tr more less head tail grep sort uniq---------------------------------

# 行号
[root@qls ~]# awk  '{print NR,$0}'  passwd 		#显示行号 ,必须要加'{}'
				   打印  行号  $0 表示每一行的整行内容
[root@oldboy ~]# cat passwd -n
[root@oldboy ~]# grep .* -n passwd 高亮显示

1 root:x:0:0:root:/root:/bin/bash
2 bin:x:1:1:bin:/bin:/sbin/nologin
3 daemon:x:2:2:daemon:/sbin:/sbin/nologin
4 adm:x:3:4:adm:/var/adm:/sbin/nologin
5 lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
6 sync:x:5:0:sync:/sbin:/bin/sync
7 shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
8 halt:x:7:0:halt:/sbin:/sbin/halt
9 mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
10 operator:x:11:0:operator:/root:/sbin/nologin
11 root

# 过滤	不需要加任何选项,直接过滤,支持基本正则和扩展正则 ,默认边界递增过滤
[root@qls ~]# awk  '/root/'  passwd 		#过滤出root的字符串
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
root
[root@qls ~]# awk  '/^root/'  passwd 		#过滤出以root开头的字符串,过滤必须要加/  / ,也只能加/  / ,'' 号可以省略,'!/ /' 引号不能省略
root:x:0:0:root:/root:/bin/bash
root
[root@qls ~]# awk  '/root$/'  passwd 		#过滤出以root为结尾的字符串(不能是$n)
root
[root@qls ~]# awk  '/root|adm/'  passwd 	#过滤出root或者adm的字符串 '|'或者    不能用 (||,;)
root:x:0:0:root:/root:/bin/bash
adm:x:3:4:adm:/var/adm:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
root

[root@qls ~]# awk  '/root/;/adm/'  passwd 	#过滤出root或者adm的字符串
root:x:0:0:root:/root:/bin/bash
adm:x:3:4:adm:/var/adm:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
root

[root@qls ~]# awk  '/adm/,/sync/'  passwd 	#过滤以adm的行到sync的行
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync

理解,awk 过滤注意格式 '/ /',边界递增过滤--/root$/---------------------------

# 取列,默认以空白字符(空格或TAB键)为分隔符,取多列的话可以 正反序
[root@qls ~]# awk   'BEGIN{FS=":"}{print $7}'  passwd 		#取出文件的第七列,只能用双引号,不能用 ':' , 或 :  ,
/bin/bash
/sbin/nologin
/sbin/nologin
/sbin/nologin
/sbin/nologin
/bin/sync
/sbin/shutdown
/sbin/halt
/sbin/nologin
/sbin/nologin

[root@qls ~]# awk  -F:  '{print $7}'  passwd 	#取出文件的第七列, -F: 或 -F :(两个分隔符) 或 -F':' 或 -F":"  或 -F [:]  不能加{:} 最好加 -F '[]'
'{ }' 引号必须要加
/bin/bash
/sbin/nologin
/sbin/nologin
/sbin/nologin
/sbin/nologin
/bin/sync
/sbin/shutdown
/sbin/halt
/sbin/nologin
/sbin/nologin

[root@qls ~]# awk  -F '[:]'  '{print $7}'  passwd 
/bin/bash
/sbin/nologin
/sbin/nologin
/sbin/nologin
/sbin/nologin
/bin/sync
/sbin/shutdown
/sbin/halt
/sbin/nologin
/sbin/nologin

[root@qls ~]# awk  -F:  '{print $NF}'  passwd 		#取出文件中的每一行的最后一列,NF表示列,$NF表示最后一列,可以指定多个分隔符,格式是       '[: ]'
/bin/bash
/sbin/nologin
/sbin/nologin
/sbin/nologin
/sbin/nologin
/bin/sync
/sbin/shutdown
/sbin/halt
/sbin/nologin
/sbin/nologin
root

理解,注意可以指定多个分隔符,正反序---------------

[root@oldboy ~]# cat /oldboy/oldboy.txt | awk -F'[ ,"]+' '{print $3,$7}'
qiandao 1716141363   取出不连续的3和7列,不能用;

[root@qls ~]# echo  'oldboy:123 oldgirl'  >>passwd 
[root@qls ~]# awk  '{print $2}'  passwd  |tail -1
oldgirl
[root@qls ~]# awk -F: '{print $2}'  passwd  |tail -1
123 oldgirl
[root@qls ~]# awk -F '[: ]' '{print $2}'  passwd  |tail -1		#支持多个分隔符  
123

#取出ip地址
[root@qls ~]# ifconfig  eth0
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 10.0.0.100  netmask 255.255.255.0  broadcast 10.0.0.255
        inet6 fe80::c653:602a:38c6:e45  prefixlen 64  scopeid 0x20<link>
        ether 00:0c:29:ae:0b:8a  txqueuelen 1000  (Ethernet)
        RX packets 3515748  bytes 5009905896 (4.6 GiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 382062  bytes 54939915 (52.3 MiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

[root@qls ~]# ifconfig  eth0 |awk  'NR==2'  
        inet 10.0.0.100  netmask 255.255.255.0  broadcast 10.0.0.255
[root@qls ~]# ifconfig  eth0 |awk  'NR==2'   |awk  '{print $2}'
10.0.0.100
[root@qls ~]# ifconfig  eth0 |awk  'NR==2{print $2}'
10.0.0.100
awk 默认前面的空格不存在,所以是'{print $2}',除非指定以空格为分隔符,才会像sed 一样,数空格,算列数(数那一堆)

#取出ip地址
[root@qls ~]# ip a s eth0
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 00:0c:29:ae:0b:8a brd ff:ff:ff:ff:ff:ff
    inet 10.0.0.100/24 brd 10.0.0.255 scope global noprefixroute eth0
       valid_lft forever preferred_lft forever
    inet6 fe80::c653:602a:38c6:e45/64 scope link noprefixroute 
       valid_lft forever preferred_lft forever
[root@qls ~]# ip a s eth0 |  awk 'NR==3' | awk  -F '[ /]*'  '{print $2}'
inet
[root@qls ~]# ip a s eth0 |  awk 'NR==3' | awk  -F '[ /]*'  '{print $3}'
10.0.0.100
[root@qls ~]# ip a s eth0 |  awk 'NR==3' | awk  -F '[ /]'  '{print $6}'
10.0.0.100
* 在基本正则里面表示所有的意思,在awk里面表示匹配0次或0次以上,代表一个整体
# 理解,awk不认识空格,除非指定了空格才会去数空格(数那一堆的)


[root@qls ~]# awk  'NR!=1'  passwd 		#排除第一列 (!排除,取反)(必须是NR!= )
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
root
oldboy:123 oldgirl
[root@oldboy ~]# awk '!NR=1' passwd
awk: cmd. line:1: !NR=1
awk: cmd. line:1:    ^ syntax error
[root@oldboy ~]# awk 'NR=1!' passwd
awk: cmd. line:1: !NR=1!
awk: cmd. line:1:    ^ syntax error

[root@qls ~]# awk  '!/root/'  passwd 		#排除包含root的字符串-----相当于假删除
'/root/!' 报错
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
oldboy:123 oldgirl
[root@qls ~]# 

# 理解,排除第一位-----------------

[root@qls ~]# awk -F:  '/^root/{print $NF}'  passwd #取出满足以root开头的行并且打印出该行的最后一列,引号必须要加
/bin/bash
root
[root@qls ~]# awk -F:  '/^root/{print $1,$2}'  passwd 	#打印多列内容
root x
root 

[root@qls ~]# awk -F:  '/^root/{print $3,$1}'  passwd 	#把第三列和第一列倒着显示
0 root
 root


12.在/etc/passwd文件中,以冒号分割字段,截取第三列包含数字5的行?#列和过滤混用
[root@oldboy ~]# awk -F "[:]+" '$3~/5/' /etc/passwd
sync:x:5:0:sync:/sbin:/bin/sync
nfsnobody:x:65534:65534:Anonymous NFS User:/var/lib/nfs:/sbin/nologin

14.使用命令调换 passwd 文件里 root 位置和/bin/bash 位置? 即将所有的第一列和最后一列位置调换?
[root@oldboy ~]# awk -F "[:]+" '{print $NF":"$2":"$3":"$4":"$5":"$6":"$1}' /etc/passwd   用$NF表示最后一列(可以用$7表示),小心修改重要文件,cat /etc/passwd,或者备份,注意真替换还是假

[root@oldboy Packages]# curl -s https://mirrors.aliyun.com/zabbix/zabbix/3.4/rhel/7/x86_64/ |awk -F '[ "]+' '/rpm/{print $3}'  过滤

[root@oldboy ~]# seq 100|awk 'BEGIN{sum=0}{sum+=$1}END{print sum}'
5050
[root@oldboy ~]# seq 100|awk 'BEGIN{sum=-1}{sum+=$1}END{print sum}'  起始值,第几列什么动作
5049
[root@oldboy ~]# seq 100|awk 'BEGIN{s=0}{s+=$1}END{print s}'
5050
[root@oldboy ~]# seq 100|awk 'BEGIN{sum=0}{sum-=$1}END{print sum}'
5050

-F''   以空分隔符,【】,以空为分隔符的时候,空格也要数,,外面用双引号,里面就用单引号。分隔符里有‘ “ ,那就要用tr 或者sed 替换了
[root@oldboy ~]# cat 1.txt   取18
my name is syy ,'18"\ years old ;QQ;\/'1757528181
[root@oldboy ~]# cat 1.1 | awk -F [\'\""] '{print $2}' 
[root@oldboy ~]# cat 1.txt | tr ' " | awk -F ["] '{print $2}'

awk不认识空格  , 【‘  ’ ,】可以拼出来空格

$1+$2$3+$4

前面用引号引起来,后面也要用引号引起来 (tr,cut)---前后一致性
[root@oldboy ~]# stat 2. | grep 0644 | sed -nr 's#.*s: \(0(.*)/-.*#\1#p'
注意转义括号(标点符号),小心贪婪匹配

# "['']" 以空为分隔符,必须用引号把 [] 括起来,不能是 ['']
[root@oldboy ~]# awk -F"['']" '{print $2}' kk
18"\ years old ;QQ;\/

# 指定特殊符号的时候,[\"] 一定要转义
[root@oldboy ~]# awk -F[\'\"] '{print $2}' kk
18
posted @ 2020-05-01 12:36  看萝卜在飘  阅读(155)  评论(0编辑  收藏  举报