linux基础(day28)
时间:2022-04-27
本文章向大家介绍linux基础(day28),主要内容包括9.6 awk(上)、awk匹配功能(类似于grep命令的功能)、9.7 awk(下)、扩展、awk练习题、基本概念、基础应用、原理机制和需要注意的事项等,并结合实例形式分析了其使用技巧,希望通过本文能帮助到大家理解应用这部分内容。
9.6 awk(上)
awk工具
- head -n2 test.txt|awk -F ':' '{print $1}'
- head -n2 test.txt|awk -F ':' '{print $0}'
- awk -F ':' '{print $1"#"$2"#"$3"#"$4}'
- awk '/oo/' test.txt
- awk -F ':' '$1 ~/oo/' test.txt
- awk -F ':' '/root/ {print $1,$3} /test/ {print $1,$3}' test.txt
- awk -F ':' '$3=="0"' /etc/passwd
- awk -F ':' '$3>="500"' /etc/passwd
- awk -F ':' '$3>=500' /etc/passwd
- awk -F ':' '$7!="/sbin/nologin"' /etc/passwd
awk功能前的准备工作
- awk比sed更丰富的功能是,支持分段
[root@hf-01 ~]# mkdir awk
[root@hf-01 ~]# cd awk
[root@hf-01 awk]# cp /etc/passwd ./test.txt
[root@hf-01 awk]# ls
test.txt
awk命令 指定分割符
- awk -F ':' '{print $1}' test.txt //打印出第一段内容
- 分割符为 :
- head -n3 test.txt |awk -F ':' '{print $1}' //在文件前3行中,打印第一段内容
[root@hf-01 awk]# awk -F ':' '{print $1}' test.txt //打印出第一段内容
root
bin
daemon
adm
lp
sync
shutdown
halt
等等等,只截取了一小部分
[root@hf-01 awk]# head -n3 test.txt |awk -F ':' '{print $1}'
root
bin
daemon
[root@hf-01 awk]#
awk命令以分隔符为例,打印出第一段内容——>实际上并未去改变文件内容
awk命令 指定打印某一段
- awk -F ':' '{print $0}' test.txt //打印出所有的段
[root@hf-01 awk]# awk -F ':' '{print $0}' test.txt
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
等等等,只截取了一小部分
[root@hf-01 awk]#
打印第一段用 $1 表示 打印所有的段用 $0 表示
awk命令 指定打印多段内容,并指定以什么为分割
- awk -F ':' '{print $1,$2,$4}' test.txt //打印指定的分段,第一段,第二段,第四段
- 在打印多段内容的时候,只需要加 , 逗号 继续添加即可
- awk -F ':' '{print $1"@"$2"$4"}' test.txt //在前三行中打印指定的段,并指定用@ 进行分割
- 括号里面的分隔符,可以为 @ # 都可以使用
- 括号里面的指定的分隔符,需要使用 "" 双引号标注出来
[root@hf-01 awk]# awk -F ':' '{print $1,$2,$4}' test.txt
root x 0
bin x 1
daemon x 2
adm x 4
lp x 7
sync x 0
shutdown x 0
等等等,只截取了一小部分
[root@hf-01 awk]# head -n3 test.txt |awk -F ':' '{print $1"@"$2"@"$4}' //在前三行中,打印指定的段,并用 @ 分割
root@x@0
bin@x@1
daemon@x@2
[root@hf-01 awk]#
awk命令 打印所有文件内容
- 若使用awk命令,忽略了使用 -F (没有指定分割符),那么它默认将会以 空格 或 空白字符 为分割符去打印
- awk '{print $0}' test.txt //打印出文件的所有内容——>相当于cat命令查看 [root@hf-01 awk]# awk '{print $0}' test.txt 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 等等等,只截取了一小部分 [root@hf-01 awk]#
awk匹配功能(类似于grep命令的功能)
awk命令匹配打印包含字符的行
- awk '/oo/' test.txt //打印匹配包含字符oo的行
[root@hf-01 awk]# awk '/oo/' test.txt //打印匹配包含字符oo的行
root:x:0:0:root:/root:/bin/bash
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
[root@hf-01 awk]#
awk命令匹配打印某一段中包含字符的行
- awk -F ':' '$1 ~ /oo/' test.txt //打印第一段中包含oo的行
[root@hf-01 awk]# awk -F ':' '$1 ~ /oo/' test.txt
root:x:0:0:root:/root:/bin/bash
[root@hf-01 awk]#
- awk -F ':' '$1 ~ /o+/' test.txt //匹配第一段中包含o字符的行
- +号,表示一个或或多个+号前面的字符
[root@hf-01 awk]# awk -F ':' '$1 ~ /o+/' test.txt //匹配第一段中包含o字符的行
root:x:0:0:root:/root:/bin/bash
daemon:x:2:2:daemon:/sbin:/sbin/nologin
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
operator:x:11:0:operator:/root:/sbin/nologin
nobody:x:99:99:Nobody:/:/sbin/nologin
polkitd:x:999:998:User for polkitd:/:/sbin/nologin
avahi-autoipd:x:170:170:Avahi IPv4LL Stack:/var/lib/avahi-autoipd:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin
[root@hf-01 awk]#
[root@hf-01 awk]# awk -F ':' '$1 ~ /oo+/' test.txt
root:x:0:0:root:/root:/bin/bash
[root@hf-01 awk]#
这里会发现,有特殊符号的时候,grep命令需要加 -E 脱义,sed命令需要加 -r 脱义,而awk命令中的特殊符号则不需要脱义就可以实现操作
awk工具支持多个表达式一起写
- awk -F ':' '/root/ {print $1,$3} /usr/ {print $3,$5}' test.txt //匹配包含root的行,打印第1段和第3段,然后在匹配包含usr的行并打印第3段和第4段
- awk -F ':' '/root|usr/ {print $0}' test.txt //在文件所有段中,匹配包含root和usr的行
[root@hf-01 awk]# awk -F ':' '/root/ {print $1,$3} /usr/ {print $1,$3,$4}' test.txt //匹配包含root的行,打印第1段和第3段,然后在匹配包含usr的行并打印第3段和第4段
root 0
operator 11
games 12 100
[root@hf-01 awk]# grep -E 'root|usr' test.txt
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
[root@hf-01 awk]#
[root@hf-01 awk]# awk -F ':' '/root|usr/ {print $0}' test.txt //在文件所有段中,匹配包含root和usr的行
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
[root@hf-01 awk]# awk -F ':' '/root|usr/ {print $1,$3,$4}' test.txt
root 0 0
operator 11 0
games 12 100
[root@hf-01 awk]#
awk工具支持多个表达式一起写
awk工具针对数学表达式
加单引号
- awk -F ':' '$3==0' test.txt //匹配第3段等于0的,并打印所有段
- 必须写 两个等于号,写一个等于号就相当于 赋值
- awk -F ':' '$3==0 {print $1}' test.txt //匹配第3段等于0的,并打印第1段
- awk -F ':' '$3>=1000' test.txt //匹配第3段大于等于1000的,并打印所有段
[root@hf-01 awk]# awk -F ':' '$3==0' test.txt //匹配第3段等于0的,并打印所有段
root:x:0:0:root:/root:/bin/bash
[root@hf-01 awk]# awk -F ':' '$3==0 {print $1}' test.txt //匹配第3段等于0的,并打印第1段
root
[root@hf-01 awk]# awk -F ':' '$3>=1000 {print $0}' test.txt //匹配第3段大于等于1000的,并打印所有段
mysql:x:1000:1000::/home/mysql:/bin/bash
[root@hf-01 awk]#
加双引号
- awk -F ':' '$3>="500"' test.txt //第三段大于等于500的
- 加上双引号后,会看到第三段的输出的内容,都是以ascii码的排序方式去计算的,它会认为这是一个字符串,而不是一个数字去计算——>若需求是针对数字的,一定不可以加 双引号 !!!
[root@hf-01 awk]# awk -F ':' '$3>="1000" {print $0}' test.txt
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
games:x:12:100:games:/usr/games:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
nobody:x:99:99:Nobody:/:/sbin/nologin
dbus:x:81:81:System message bus:/:/sbin/nologin
polkitd:x:999:998:User for polkitd:/:/sbin/nologin
avahi:x:70:70:Avahi mDNS/DNS-SD Stack:/var/run/avahi-daemon:/sbin/nologin
avahi-autoipd:x:170:170:Avahi IPv4LL Stack:/var/lib/avahi-autoipd:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
mysql:x:1000:1000::/home/mysql:/bin/bash
systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin
[root@hf-01 awk]#
- 若是字符串,则需要加上双引号
- awk -F ':' '$7!="/sbin/nologin" {print $0}' test.txt //匹配打印出第7段不等于/sbin/nologin的所有段
[root@hf-01 awk]# awk -F ':' '$7!="/sbin/nologin" {print $0}' test.txt //匹配打印出第7段不等于/sbin/nologin的所有段
root:x:0:0:root:/root:/bin/bash
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mysql:x:1000:1000::/home/mysql:/bin/bash
[root@hf-01 awk]#
9.7 awk(下)
awk工具
- awk -F ':' '$3<$4' /etc/passwd
- awk -F ':' '$3>"5" && $3<"7"' /etc/passwd
- awk -F ':' '$3>1000 || $7=="/bin/bash"' /etc/passwd
- head -5 /etc/passwd |awk -F ':' '{OFS="#"} {print $1,$3,$4}‘
- awk -F ':' '{OFS="#"} {if ($3>1000) {print $1,$2,$3,$4}}' /etc/passwd
- head -n3 /etc/passwd | awk -F ':' '{print NF}‘
- head -n3 /etc/passwd | awk -F ':' '{print NR}‘
- awk 'NR>40' /etc/passwd
- awk -F ':' 'NR<20 && $1 ~ /roo/' /etc/passwd
- head -n 3 /etc/passwd |awk -F ':' '$1="root"‘
- awk -F ':' '{(tot=tot+$3)}; END {print tot}' /etc/passwd
- awk -F ':' '{if ($1=="root") {print $0}}' /etc/passwd
awk工具 两个字段相互比较
- awk -F ':' '$3<$4' test.txt //比较第3段小于第4段的,并匹配打印出来
[root@localhost awk]# awk -F ':' '$3<$4' test.txt //比较第3段小于第4段的,并匹配打印出来
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
[root@localhost awk]#
awk工具 两个字段相等
- awk -F ':' '$3==$4' test.txt //匹配出第3段和第4段相等的行
[root@localhost awk]# awk -F ':' '$3==$4' test.txt //匹配出第3段和第4段相等的行
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
nobody:x:99:99:Nobody:/:/sbin/nologin
dbus:x:81:81:System message bus:/:/sbin/nologin
avahi:x:70:70:Avahi mDNS/DNS-SD Stack:/var/run/avahi-daemon:/sbin/nologin
avahi-autoipd:x:170:170:Avahi IPv4LL Stack:/var/lib/avahi-autoipd:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
[root@localhost awk]#
awk工具 匹配大于5的字符,小于7的字符
- awk -F ':' '$3>"5" && $3<"7"' test.txt //匹配第3段大于5的字符,和小于7的字符,并打印出来所在行
- 这里双引号里面的数字表示 字符 ——>通过ASCII码进行比较
- 数字比大写字母小,大写字母比小写字母小
- 用双引号中字符的的第1个字符去和第3段进行比较
- && 表示 和 的意思
- 这里双引号里面的数字表示 字符 ——>通过ASCII码进行比较
[root@localhost awk]# awk -F ':' '$3>"5" && $3<"7"' test.txt //匹配第3段大于5的字符,和小于7的字符,并打印出来所在行
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
tss:x:59:59:/var/spool/postfix:/sbin/nologin
[root@localhost awk]#
这里的59是是在字符5和字符7之间的,所以就会匹配出来
awk工具 匹配大于94的段,或等于/sbin/nologin的段
- awk -F ':' '$3>94 || $7=="/sbin/nologin"' test.txt //匹配第3段大于94的段,或者第7段等于/sbin/nologin的段所在的行都打印出来
- || 表示 或者 的意思
[root@localhost awk]# vim test.txt
[root@localhost awk]# awk -F ':' '$3>94 || $7=="/sbin/nologin"' test.txt //匹配第3段大于94的段,或者第7段等于/sbin/nologin的段所在的行都打印出来
yroot:x:95:95: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
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
等等等,只截取了一部分
[root@localhost awk]#
awk工具 匹配的段不精准匹配 ~
- awk -F ':' '$3>94 || $7 ~ /bash/' test.txt //匹配第三段大于94的段,或者第7段包含/bin/的段,并都打印出来
- == 就是严格匹配
- ~ 这个只要包含就算匹配
- 举例:
- == 的话,第七段只能为/bin/bash才算符合
- ~ 的话,第七段里只要有bash 就算符合,比如/sbin/bash, bin123 都算匹配
[root@localhost awk]# awk -F ':' '$3>94 || $7 ~ /bin/' test.txt //匹配第三段大于94的段,或者第7段包含/bin/的段,并都打印出来
yroot:x:95:95: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
等等等,只截取了一部分
[root@localhost awk]#
awk工具 OFS
- 若有多段的时候,分隔符可以用 # @ 替换,指定分隔符;还有另外一个功能,就是OFS,这是一个内置的变量,
- -F 这是指定分段前的字符
- OFS用来指定 print 时候用到的分隔符—>注意 语法!!
- 先写OFS,在些print
- awk -F ':' '{OFS="#"} $3>94 || $7 ~ /bin/ {print $1,$3,$7}' test.txt //匹配第3段大于94的段,或者第七段包含bin的段,然后打印第1,第3,第7段,用 #号 区分
- 语法:在分割完之后,单引号里面用花括号括起来,给它指定print用到的分隔符OFS ,然后再写条件,最后在写print语句
[root@hf-01 awk]# head -n5 test.txt |awk -F ':' '{OFS="#"} $3>94 || $7 ~ /bin/ {print $1,$3,$7}' //在前5行中,匹配第3段大于94的段,或者第七段包含bin的段,然后打印第1,第3,第7段,用 #号 区分
root#0#/bin/bash
bin#1#/sbin/nologin
daemon#2#/sbin/nologin
adm#3#/sbin/nologin
lp#4#/sbin/nologin
[root@hf-01 awk]#
- awk -F ':' '{OFS="@"} {if ($3>94) {print $1,$3,$7}}' test.txt //匹配第3段大于第九段的字符,然后打印第1,第3,第7段内容, 并用@分割
- 匹配的分隔符,可以为@,可以为#
- 上下表达式相同
- 在使用if的时候,需要加一些符号,但是使用if 的表达式则更加规范
- awk -F ':' '{OFS="@"} $3>94 {print $1,$3,$7}' test.txt
[root@hf-01 awk]# awk -F ':' '{OFS="@"} {if ($3>94) {print $1,$3,$7}}' test.txt //匹配第3段大于第九段的字符,然后打印第1,第3,第7段内容, 并用@分割
nobody@99@/sbin/nologin
polkitd@999@/sbin/nologin
avahi-autoipd@170@/sbin/nologin
mysql@1000@/bin/bash
systemd-network@192@/sbin/nologin
[root@hf-01 awk]#
[root@hf-01 awk]# awk -F ':' '{OFS="@"} $3>94 {print $1,$3,$7}' test.txt //匹配第3段大于第九段的字符,然后打印第1,第3,第7段内容, 并用@分割
nobody@99@/sbin/nologin
polkitd@999@/sbin/nologin
avahi-autoipd@170@/sbin/nologin
mysql@1000@/bin/bash
systemd-network@192@/sbin/nologin
[root@hf-01 awk]#
awk工具 两个内置的变量
- OFS是打印print的时候,指定的变量符
- NR 表示 行
- NF 表示 段
- head -n5 test.txt |awk -F ':' '{print NR":"$0}' test.txt //在前5行中,打印出所有的行
- 这个就像grep的-n功能,显示所有行号
[root@hf-01 awk]# head -n5 test.txt| awk -F ':' '{print NR":"$0}' //在前5行中,打印出所有的行
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
[root@hf-01 awk]#
- head -n5 test.txt |awk -F ':' '{print NF":"$0}' test.txt //在前5行中,打印所有的段
- 在段的前面看到的数字,显示的是每一行有几段内容
[root@hf-01 awk]# head -n5 test.txt| awk -F ':' '{print NF":"$0}' //在前5行中,打印所有的段
6:rootx:0:0:root:/root:/bin/bash
7:bin:x:1:1:bin:/bin:/sbin/nologin
7:daemon:x:2:2:daemon:/sbin:/sbin/nologin
7:adm:x:3:4:adm:/var/adm:/sbin/nologin
7:lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
[root@hf-01 awk]#
awk工具 NR 表示 行
- sed -n '1,10'p test.txt //打印前十行
- awk -F ':' 'NR<=10' test.txt //打印前十行
- NR 表示 行,可作为一个判断条件
- awk -F ':' 'NR<=10 && $1 ~ /root|sync' test.txt //匹配前10行中,第1段包含root或者sync的段,并把这一行打印出来
[root@hf-01 awk]# awk -F ':' 'NR<=10' test.txt //打印前十行
rootx: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@hf-01 awk]#
[root@hf-01 awk]# awk -F ':' 'NR<=10 && $1 ~ /root|sync/' test.txt //匹配前10行中,第1段包含root或者sync的段,并把这一行打印出来
rootx:0:0:root:/root:/bin/bash
sync:x:5:0:sync:/sbin:/bin/sync
[root@hf-01 awk]#
awk工具 NF 表示 段
- awk -F ':' 'NF==6 && $1 ~ /root|sync/' test.txt //匹配文件中,是6段的行,并在第1段包含root或者sync的段,并把这一行打印出来
- NF 表示 段
[root@hf-01 awk]# awk -F ':' 'NF==6 && $1 ~ /root|sync/' test.txt //匹配文件中,是6段的行,并在第1段包含root或者sync的段,并把这一行打印出来
rootx:0:0:root:/root:/bin/bash
[root@hf-01 awk]#
awk工具 $NR":"$NF
- awk -F ':' '{print $NR":"$NF}' test.txt //就是文件的第几行一直匹配最后一段,一直持续到第七段结束(只有7段,所以后面为空) - $NR 表示多少行 - $NF 表示7段
- 所以打印的内容为,第一行为
[root@hf-01 awk]# awk -F ':' '{print $NR":"$NF}' test.txt
rootx:/bin/bash //文件第一行为 rootx 匹配最后一段 /bin/bash
x:/sbin/nologin //文件第二行为 x 匹配最后一段 /sbin/nologin
2:/sbin/nologin //......以此类推下去
4:/sbin/nologin
lp:/sbin/nologin
/sbin:/bin/sync
/sbin/shutdown:/sbin/shutdown
:/sbin/halt //因为$NR只有七行,所以在打印后面的时候,行为空
:/sbin/nologin
:/sbin/nologin
等等等,只截取了一部分
[root@hf-01 awk]#
awk工具 赋值
- head -n3 test.txt |awk -F ':' '$1="root"' //在前3行中,第1段赋值为root
- 一旦赋值之后,会看到分隔符消失了
- 这时只需要定义下 OFS 即可
- head -n3 test.txt |awk -F ':' '{OFS=":"} $1="root"' //在前3行中,第1段赋值为root,并定义分割符为:
[root@hf-01 awk]# head -n3 test.txt |awk -F ':' '$1="root"' //在前3行中,第1段赋值为root
root 0 0 root /root /bin/bash
root x 1 1 bin /bin /sbin/nologin
root x 2 2 daemon /sbin /sbin/nologin
[root@hf-01 awk]# head -n3 test.txt |awk -F ':' '{OFS=":"} $1="root"' //在前3行中,第1段赋值为root,并定义分割符为:
root:0:0:root:/root:/bin/bash
root:x:1:1:bin:/bin:/sbin/nologin
root:x:2:2:daemon:/sbin:/sbin/nologin
[root@hf-01 awk]#
awk工具 tot值求和
- awk -F ':' '{(tot=tot+$3)}; END {print tot}' test.txt //每次tot值循环,就会把第三段相加
- tot 表示求和
- 在第一次tot求和的时候,是为0与第3段相加,然后依次循环,一直到第3段结束,然后输出tot值
- tot 表示求和
[root@hf-01 awk]# awk -F ':' '{(tot=tot+$3)}; END {print tot}' test.txt
2847
[root@hf-01 awk]#
awk工具 打印文本中所有数字
- awk -F ':' '$0 ~ /[0-9]/' test.txt //匹配文本中所有包含数字的段,打印出来所在行
[root@hf-01 awk]# awk -F ':' '$0 ~ /[0-9]/' test.txt //匹配文本中所有包含数字的段,打印出来所在行
rootx: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
等等等,只截取了一部分
[root@hf-01 awk]#
awk工具 打印文本中所有数字
- awk -F ':' '$0 ~ /[0-9]/' test.txt //匹配文本中所有包含数字的段,打印出来所在行
[root@hf-01 awk]# awk -F ':' '$0 ~ /[0-9]/' test.txt //匹配文本中所有包含数字的段,打印出来所在行
rootx: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
等等等,只截取了一部分
[root@hf-01 awk]#
扩展
sed练习题
- 把这里面的所有练习题做一下
- 1.把/etc/passwd 复制到/root/test.txt,用sed打印所有行
[root@localhost ~]# cp /etc/passwd /root/test.txt
[root@localhost ~]# ls
111 1.txt 2.txt 3.txt awk sed
123 234 2.txt.bak anaconda-ks.cfg grep test.txt
[root@localhost ~]# sed -n '1,$'p test.txt
- 2.打印test.txt的3到10行
[root@localhost ~]# sed -n '3,10'p test.txt
- 3.打印test.txt 中包含 ‘root’ 的行
[root@localhost ~]# sed '/root/'p test.txt
- 4.删除test.txt 的15行以及以后所有行
[root@localhost ~]# sed '10,$'d test.txt
- 5.删除test.txt中包含 ‘nologin’ 的行
sed '/nologin/'d test.txt
- 6.替换test.txt 中 ‘root’ 为 ‘toor’
sed 's/root/toor/'g test.txt
- 7.替换test.txt中 ‘/sbin/nologin’ 为 ‘/lalala/AAA/’
sed 's#/sbin/nologin#/lalala/AAA/#'g test.txt
- 8.删除test.txt中5到10行中所有的数字
sed '5,10s/[0-9]//'g test.txt
- 9.删除test.txt 中所有特殊字符(除了数字以及大小写字母)
sed 's/[^0-9a-zA-Z]//'g test.txt
- 10.把test.txt中第一个单词和最后一个单词调换位置 sed 's/(^[a-zA-Z][a-zA-Z])([^a-zA-Z].)([^a-zA-Z])([a-zA-Z][a-zA-Z]*$)/4231/' test.txt
- 11.把test.txt中出现的第一个数字和最后一个单词替换位置
sed 's#([^0-9][^0-9]*)([0-9][0-9]*)([^0-9].*)([^a-zA-Z])([a-zA-Z][a-zA-Z]*$)#15342#' test.txt
- 12.把test.txt 中第一个数字移动到行末尾
sed 's#([^0-9][^0-9]*)([0-9][0-9]*)([^0-9].*$)#132#' test.txt
- 13.在test.txt 20行到末行最前面加 ‘aaa:’
写法一:
sed -r '20,$s/(.*)/aaa:&/'g test.txt
写法二:
sed '20,$s/^.*$/aaa:&/'g test.txt
sed里面的p 是打印, g 是全局替换 d 是删除 -n 参数是要和 p 一起使用
awk练习题
- 1.用awk 打印整个test.txt (以下操作都是用awk工具实现,针对test.txt)
sed '{print $0}' test.txt
sed -F ':' '{print $0}' test.txt
- 2.查找所有包含 ‘bash’ 的行
awk '/bash/' test.txt
awk -F ':' '$0 ~ /bash/' test.txt
- 3.用 ‘:’ 作为分隔符,查找第三段等于0的行
awk -F ':' '$3=="0"' test.txt
- 4.用 ‘:’ 作为分隔符,查找第一段为 ‘root’ 的行,并把该段的 ‘root’ 换成 ‘lll’ (可以连同sed一起使用)
[root@localhost ~]# awk -F ':' '$1=="root"' test.txt |sed 's/root/lll/'
lll:x:0:0:root:/root:/bin/bash
- 5.用 ‘:’ 作为分隔符,打印最后一段
awk -F ':' '{print $NR}' test.txt
- 6.打印行数大于20的所有行
[root@localhost ~]# awk -F ':' 'NR>20 {print $0}' test.txt
- 7.用 ‘:’ 作为分隔符,打印所有第三段小于第四段的行
awk -F ':' '$3<$4 {print $0}' test.txt
- 8.用 ‘:’ 作为分隔符,打印第一段以及最后一段,并且中间用 ‘@’ 连接 (例如,第一行应该是这样的形式 'root@/bin/bash‘ )
awk -F ':' '{print $1"@"$NF}' test.txt
- 9.用 ‘:’ 作为分隔符,把整个文档的第四段相加,求和
awk -F ':' '{if(sum+=$4)}; END {print sum}' test.txt
- Golang语言 redis 使用
- 页面结构化在 Android 上的尝试
- iOS 11: CORE ML—浅析
- 高性能网络编程7--tcp连接的内存使用
- Android 平台 Native 代码的崩溃捕获机制及实现
- go语言变参,匿名函数的多种用法
- 问题帖子--Concurrent Read/Write Map
- Android 混淆那些事儿
- H5 直播避坑指南
- H5 和移动端 WebView 缓存机制解析与实战
- 根据IE版本加载不同CSS样式的方法小结,解决低版本IE兼容问题
- Linux下用dd命令测试硬盘的读写速度
- 教你 Debug 的正确姿势——记一次 CoreMotion 的 Crash
- Linux系统yum命令安装软件时保留(下载)rpm包
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 2020 年,苹果的 AI 还有创新吗?
- 毕设有着落了!一套开源的,基于SpringBoot的车牌识别系统
- 详解hive的join优化
- 区块链时代的世界宪章:代码即法律
- SQL 计算公司的期初资产
- nested exception is java.lang.IllegalStateException: refreshAfterWrite requires
- 除了会排序,你对ORDER BY的用法可能一无所知!
- 修改xposed特征并刷机
- Python 爬虫进阶必备 | 关于某租房网站数据加密的分析
- CMAKE学习记录(二)
- maven 中的版本依赖冲突问题
- Manual for Ubuntu Installation
- 修改自定义站点监控页面的样式
- 快速建站“新玩具”—glitch.me
- 踩坑记 | Flutter升级影响了NestedScrollView?