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
sed 和 awk的更多相关文章
- Sed、Awk单行脚本快速参考
文本间隔: # 在每一行后面增加一空行 sed G awk '{printf("%s\n\n",$0)}' # 将原来的所有空行删除并在每一行后面增加一空行. # 这样在输出的文本 ...
- sh脚本学习之: sh脚本 、sed、awk
sh脚本 sh命令的批处理文件,支持更复杂的逻辑. Shell中的变量 参数 $0 当前脚本路径 $1....$n 脚本执行对应的第n个参数 条件判断 文件判断 test [op] path e存在 ...
- 一个利用sed和awk处理文本的小栗子
这两天做<Linux操作系统>课程的作业,碰到了一个题目,感觉很有意思,很考验对awk掌握的熟练度,故特意拿来分享. 首先说题目是这样的,有这样一段文本: RECORD #这是多余的注释行 ...
- Pyp 替代sed,awk的文本处理工具
Linux上文本处理工具虽不少,像cut,tr,join,split,paste,sort,uniq,sed,awk这些经典工具让人眼花缭乱,而且都太老了,使用方法都不太人性化,尤其awk,语法简直反 ...
- sed and awk学习笔记
sed and awk 背景 awk起源追溯至sed和grep,进而追溯至共同的行编辑器ed.实用工具grep来源于ed命令:g/re/p .实用工具awk和sed有一个共同的选项-f用于指定脚本的名 ...
- 三大文本处理工具grep、sed及awk的简单介绍
grep.sed和awk都是文本处理工具,虽然都是文本处理工具单却都有各自的优缺点,一种文本处理命令是不能被另一个完全替换的,否则也不会出现三个文本处理命令了.只不过,相比较而言,sed和awk功能更 ...
- 学习笔记之Shell脚本学习指南 & sed与awk & 正则表达式
正则表达式_百度百科 http://baike.baidu.com/link?url=ybgDrN2WQQKN64_gu-diCqdeDqL8LQ-jiQ-ftzzPaNUa9CmgBRDNnyx50 ...
- sed和awk最佳入门教程
文档<sed和awk最佳入门教程>——摘自<实战linux shell编程与服务器管理>,简单易懂,适合初学者. 下载地址:http://download.csdn.net/d ...
- grep、sed、awk、perl、js、vim等对正则表达式的支持的差别
grep.sed.awk.perl等对正则表达式的支持的差别 grep 2.5.1 egrep 2.5.1 sed 3.02 sed 4.07 awk 3.1.1 perl 5.8.0 vim 6.1 ...
- 正则、grep、sed、awk
每次用到正则都要蛋疼一下,索性总结一下在这里. 正则 正則表達式主要分为基础正则和扩展正则.注意,正则和一般命令行输入的命令的通配符不同.正则仅仅使用于支持这样的表示法的工具,如:vi,grep,se ...
随机推荐
- Asp.Net.Core WebApi 版本控制
前言 在后端Api的开发过程中,无法避免的会遇到接口迭代的过程,如何保证新老接口的共存和接口的向前的兼容呢,这时候就需要对Api进行版本的控制,那如何优雅的控制Api的版本呢? 开始 Microsof ...
- IntelliJ IDEA 激活码 [已购买,分享给码友]
一.前言 笔者在网上找了一圈,各种方法都试过了,之前那种在网上随便找个注册码,过了一段时间就被封了,想了想还是经常用的和朋友一起购买了,方便日后使用 二.下载最新的 IDEA 其实也可以从老版本直接升 ...
- 从 Socket 编程谈谈 IO 模型(三)
快过年啦,估计很多朋友已在摸鱼的路上.而我为了兄弟们年后的追逐,却在苦苦寻觅.规划,导致文章更新晚了些,各位猿粉谅解. 上期分享,我们结合新春送祝福的场景,通过一坨坨的代码让 BIO.NIO 编程过程 ...
- 3D城市
<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" ...
- How to generate entities from database schema using doctrine-orm-module
1.安装好doctrine,在composer.json中添加如下 "require": { "php": "^5.6 || ^7.0", ...
- idea 快捷键 pvsm sout
1.在IntelJ中和Eclipse中稍有不同,在Eclipse中,输入main再按Alt+/即可自动补全main函数,但是在IntellJ中则是输入psvm,选中即可 2.在方法体内部有for循环, ...
- 怎么把jmeter汉化?
1.在Jmeter 的bin目录下找到 jmeter.properties 文件 2.找到后复制一份出来用记事本打开,Ctrl+F输入 language 定位找到 #language=en 并且把 ...
- MyBatis-Plus使用小结
官网: https://mybatis.plus/ https://gitee.com/baomidou/mybatis-plus https://github.com/baomidou/mybati ...
- stand up meeting 11/18/2015
今日工作总结: 冯晓云:完成C#版本API的class library编译,尝试与主程序进行通信:昨天临时通知让用C++封装,不解!!![后续:我用C#做了一个查词的APP,调用的就是这个API的DL ...
- A Bug's Life POJ - 2492 (种类或带权并查集)
这个题目的写法有很多,用二分图染色也可以写,思路很好想,这里我们用关于并查集的两种写法来做. 题目大意:输入x,y表示x和y交配,然后判断是否有同性恋. 1 带权并查集: 我们可以用边的权值来表示一种 ...