awk复习

10月22日任务

复习

awk调用外部变量

-v参数设置内部变量调用外部变量数组

[root@test awk]# a=44
[root@test awk]# echo "ABCD" | awk -v GET_A=$a '{print GET_A}'
44

更复杂的应用:bash

[root@test awk]# cat awk1.sh #!/bin/bash
# sort先排序,awk截取第一个字段,uniq取独
sort -n file | awk -F ':' '{print $1}' | uniq > id.txt
for id in `cat id.txt`;do
echo "[$id]"
# 使用-v设置内部变量,用于打印时的判断
awk -v id2=$id -F ":" '$1==id2 {print $2}' file
done
[root@test awk]# cat file
1111111:13443253456
2222222:13211222122
1111111:13643543544
3333333:12341243123
2222222:12123123123

# 效果
[root@test awk]# sh awk1.sh
[1111111]
13443253456
13643543544
[2222222]
13211222122
12123123123
[3333333]
12341243123

awk文件合并(暂时未理解)

将两个文件中,第一列相同的行合并到同一行中函数

[root@test awk]# cat 1.txt 1 aa
2 bb
3 ee
4 ss
[root@test awk]# cat 2.txt 1 ab
2 cd
3 ad
4 bd
5 de

[root@test awk]# awk 'NR==FNR{a[$1]=$2}NR>FNR{print $0, a[$1]}' 1.txt 2.txt 1 ab aa
2 cd bb
3 ad ee
4 bd ss
5 de

解释:NR表示读取的行数,FNR表示读取的当前行数
因此其实NR==FNR 就表示读取2.txt的时候。 同理NR>FNR表示读取1.txt的时候
数组a其实就至关于一个map

awk将文件内容链接为单行工具

[root@test awk]# cat file.txt
13443253456
13211222122
13643543544
12341243123
12123123123

[root@test awk]# awk '{printf("%s+",$0)} END{printf("\n")}' file.txt
13443253456+13211222122+13643543544+12341243123+12123123123+

# %s表明了file.txt内的单行内容# END块在前面结束后添加换行符

awk工具gsub函数使用

咱们能够使用sed轻松实现全局替换功能,一样的awk也能够实现,这里须要使用一个函数:gsub函数spa

# sed方法比较简单
[root@test awk]# sed 's/x/passwd/g'p /etc/passwd | head
root:passwd:0:0:root:/root:/bin/bash
root:passwd:0:0:root:/root:/bin/bash
bin:passwd:1:1:bin:/bin:/sbin/nologin
bin:passwd:1:1:bin:/bin:/sbin/nologin
daemon:passwd:2:2:daemon:/sbin:/sbin/nologin
daemon:passwd:2:2:daemon:/sbin:/sbin/nologin
adm:passwd:3:4:adm:/var/adm:/sbin/nologin
adm:passwd:3:4:adm:/var/adm:/sbin/nologin
lp:passwd:4:7:lp:/var/spool/lpd:/sbin/nologin
lp:passwd:4:7:lp:/var/spool/lpd:/sbin/nologin

# awk使用gsub函数一样实现相同效果
[root@test awk]# awk -F ':' 'gsub(/x/,"passwd"){print $0}' /etc/passwd | head
root:passwd:0:0:root:/root:/bin/bash
bin:passwd:1:1:bin:/bin:/sbin/nologin
daemon:passwd:2:2:daemon:/sbin:/sbin/nologin
adm:passwd:3:4:adm:/var/adm:/sbin/nologin
lp:passwd:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:passwd:5:0:sync:/sbin:/bin/sync
shutdown:passwd:6:0:shutdown:/sbin:/sbin/shutdown
halt:passwd:7:0:halt:/sbin:/sbin/halt
mail:passwd:8:12:mail:/var/spool/mail:/sbin/nologin
operator:passwd:11:0:operator:/root:/sbin/nologin

awk使用print打印单引号

awk中一些特殊符号能够使用\的方式转义,如";可是有些则不能如'3d

# 单引号的使用比较复杂:这个单引号先用双引号包括,外围再使用单引号包括。
[root@test awk]# awk -F ':' '{print "This'"'"'s my number: "$2}' file
This's my number: 13443253456
This's my number: 13211222122
This's my number: 13643543544
This's my number: 12341243123
This's my number: 12123123123

[root@test awk]# awk -F ':' '{print "This is \"my\" number: "$2}' fileThis is "my" number: 13443253456
This is "my" number: 13211222122
This is "my" number: 13643543544
This is "my" number: 12341243123
This is "my" number: 12123123123

awk实现多条件过滤

咱们能够使用grep -E 'a|b' file来过滤出file中知足a或b的内容;一样,使用awk命令也能够实现相同功能:awk '/a|b/' filecode

[root@test awk]# cat 1.txt1 aa
2 bb
3 ee
4 ss

[root@test awk]# awk '/a|b/ {print $0}' 1.txt 1 aa
2 bb

# 还能够指定分割符,打印指定字段
[root@test awk]# awk -F ' ' '/a|b/ {print $2}' 1.txt
aa
bb

awk格式化打印

awk功能十分强大,能够将字符串按格式输出:1,01,001,0001,00001,000001,0000001,20171124202055 输出10行,排序

末尾为时间(%Y%m%d%H%M%S);这种格式输出跟C语言很类似。字符串

[root@test awk]# awk 'BEGIN{for(i=1;i<=10;i++)printf("%01d,%02d,%03d,%04d,%05d,%06d,%07d,%d\n",i,i,i,i,i,i,i,strftime("%Y%m%d%H%M%S"))}'
1,01,001,0001,00001,000001,0000001,20171124202055
2,02,002,0002,00002,000002,0000002,20171124202055
3,03,003,0003,00003,000003,0000003,20171124202055
4,04,004,0004,00004,000004,0000004,20171124202055
5,05,005,0005,00005,000005,0000005,20171124202055
6,06,006,0006,00006,000006,0000006,20171124202055
7,07,007,0007,00007,000007,0000007,20171124202055
8,08,008,0008,00008,000008,0000008,20171124202055
9,09,009,0009,00009,000009,0000009,20171124202055
10,10,010,0010,00010,000010,0000010,20171124202055
相关文章
相关标签/搜索