awk用法
一、基本用法
- 处理格式
$ awk 动作 文件名
$ awk '{print $0}' demo.text
说明:demo.txt是awk要处理的文本文件。单引号内部有大括号,里面就是每行要处理的动作print $0, 其中print是打印命令,$0代表当前样,执行结果为将文件原样输出。
$ echo 'this is my name'|awk '{print $0}'
this is a my name
说明:上面的代码就是将this is my name, 重新打印一遍。
-
字段分割
awk默认使用空格和制表符,将每一行数据分成若干字段,字段依次使用$1、$2、$3 …依次代表第一个字段、第二个字段、第三个字段,其中需要$0入上文所描述,代表整行数据。
$ echo 'this is my name' | awk '{print $2}'
$ is
说明:上述代码作用是使用空格分割this is my name, 打印第2个域字段。
- F参数
默认情况下awk使用tab和空格对数据进行分段,当需要指定自定义分割符时,可以使用-F参数进行指定。
$ echo 'root:x:0:0:root:/usr/bin/zsh' | awk -F':' '{print $3}'
$ 0
说明:上述代码使用:对数据进行分割,并打印第三个字段,(-F:或-F’:'或-F ':'都是正确的写法)。
注:使用;作为分割符时,因;为shell脚本的结束符,故使用;时需要进行转义(-F;或者-F ‘;’)。
二、变量
- awk内置变量列表
符号 | 作用 |
---|---|
NF | 表示当前行有多少字段,因此使用$NF表示最后一段 |
NR | 表示当前处理是多少行 |
FS | 字段分割符,默认是空格和制表符 |
OFS | 输出字段的分割符 |
ORS | 输出记录的分割符,用于打印是分割记录,默认为换行符 |
OFMT | 数字输出格式 |
- NF实例
$ echo '/home/tome/src/sec' | awk -F/ '{print $2}'
home
说明:上述实例中使用/对/home/tome/src/sec进行分割,$1为空$2为home
- NR 实例
使用/etc/passed文件进行实例说明
$ cat /etc/passwd
root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
bin:x:2:2:bin:/bin:/usr/sbin/nologin
sys:x:3:3:sys:/dev:/usr/sbin/nologin
sync:x:4:65534:sync:/bin:/bin/sync
games:x:5:60:games:/usr/games:/usr/sbin/nologin
man:x:6:12:man:/var/cache/man:/usr/sbin/nologin
说明:以上文/etc/passwd文件中的内容
$ awk -F: '{print NR,$2}' /etc/passwd
1 /bin/bash
2 /usr/sbin/nologin
3 /usr/sbin/nologin
4 /usr/sbin/nologin
5 /bin/sync
6 /usr/sbin/nologin
7 /usr/sbin/nologin
说明:输出结果中,第一列为NR的值表示处理的当前的行数、第二列为使用:分割文件行后的最后一个字段域的内容。
- FS 实例
- 通过FS可以实现修改分割字段的字符
$ awk '{print $1,$2,$3}' FS=':' /etc/passwd
root x 0
daemon x 1
bin x 2
sys x 3
sync x 4
games x 5
man x 6
lp x 7
说明:通过FS变量指定分割符为:并打印第一、第二、第三列数据(FS=':'或FS=:相同)
- 通过FS指定多个分割符
为了方便对比我们先指定一个分割符效果如下
$ awk '{print $1,$2,$NF}' FS=[:] /etc/passwd
root x /bin/bash
daemon x /usr/sbin/nologin
bin x /usr/sbin/nologin
sys x /usr/sbin/nologin
sync x /bin/sync
games x /usr/sbin/nologin
man x /usr/sbin/nologins
同时指定两个分割字符的效果如下
$ awk '{print $1,$2,$NF}' FS=[:/] /etc/passwd
root x bash
daemon x nologin
bin x nologin
sys x nologin
sync x sync
games x nologin
man x nologin
- OFS 实例
awk '{print $1,$2,$NF}' FS=[:/] OFS='|' /etc/passwd
root|x|bash
daemon|x|nologin
bin|x|nologin
sys|x|nologin
sync|x|sync
games|x|nologin
man|x|nologin
说明:上述实例指定输入分割符为:/,指定输出分割符为|,输出第一列、第二列、最后一列时,使用|分割输出的结果。
三、awk内置函数
- 常用原函数
函数名称 | 作用 |
---|---|
gsub(r,s) | 在整个$0中用s替代r |
gsub(r,s,t) | 在整个t中用s替代r |
tolower() | 字符转为小写 |
toupper() | 字符转为小写 |
length() | 返回字符串长度 |
index(s,t) | 返回s中字符串t的第一位置 |
match(s,r) | 测试s是否包含匹配r的字符串 |
split(s,a,fs) | 将字符串s使用fs分割并存储在数组a中 |
sprint(fmt,exp) | 返回经fmt格式化后的exp |
substr(s,p) | 返回字符串s中从p开始的后缀部分 |
substr(s,p,n) | 返回字符串s中从p开始长度为n的后缀部分 |
- gsub(r,s)及- gsub(r,s,t) 在整个$0中用s替代r用法示例
$ cat passwd.txt
root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
bin:x:2:2:bin:/bin:/usr/sbin/nologin
sys:x:3:3:sys:/dev:/usr/sbin/nologin
sync:x:4:65534:sync:/bin:/bin/sync
- 将上述文件中用:分割个第一列中的root替换为boot
$ cat passwd.txt | awk -F: '{gsub("root","boot", $1); print $0}'
boot x 0 0 root /root /bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
bin:x:2:2:bin:/bin:/usr/sbin/nologin
sys:x:3:3:sys:/dev:/usr/sbin/nologin
sync:x:4:65534:sync:/bin:/bin/sync
- 将上述文件中的root替换为boot
$ cat passwd.txt | awk -F: '{gsub("root","boot", $0); print $0}'
boot:x:0:0:boot:/boot:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
bin:x:2:2:bin:/bin:/usr/sbin/nologin
sys:x:3:3:sys:/dev:/usr/sbin/nologin
sync:x:4:65534:sync:/bin:/bin/sync
或
$ cat passwd.txt | awk -F: '{gsub("root","boot"); print $0}'
boot:x:0:0:boot:/boot:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
bin:x:2:2:bin:/bin:/usr/sbin/nologin
sys:x:3:3:sys:/dev:/usr/sbin/nologin
sync:x:4:65534:sync:/bin:/bin/sync
- tolower() 字符转为小写示例
$ cat passwdUpper.txt
ROOT:X:0:0:ROOT:/ROOT:/BIN/BASH
DAEMON:X:1:1:DAEMON:/USR/SBIN:/USR/SBIN/NOLOGIN
BIN:X:2:2:BIN:/BIN:/USR/SBIN/NOLOGIN
SYS:X:3:3:SYS:/DEV:/USR/SBIN/NOLOGIN
SYNC:X:4:65534:SYNC:/BIN:/BIN/SYNC
$ cat passwdUpper.txt | awk -F: '{ print tolower($0)}'
root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
bin:x:2:2:bin:/bin:/usr/sbin/nologin
sys:x:3:3:sys:/dev:/usr/sbin/nologin
sync:x:4:65534:sync:/bin:/bin/sync
- toupper() 字符转为小写示例
$ cat passwd.txt | awk -F: '{print toupper($0)}'
ROOT:X:0:0:ROOT:/ROOT:/BIN/BASH
DAEMON:X:1:1:DAEMON:/USR/SBIN:/USR/SBIN/NOLOGIN
BIN:X:2:2:BIN:/BIN:/USR/SBIN/NOLOGIN
SYS:X:3:3:SYS:/DEV:/USR/SBIN/NOLOGIN
SYNC:X:4:65534:SYNC:/BIN:/BIN/SYNC
- length() 返回字符串长度示例
$ cat passwd.txt | awk -F: '{ print length($1)}'
4
6
3
3
4
- index(s,t) 返回s中字符串t的第一位置示例
cat passwd.txt | awk -F: '{ print $0;print index("root",$1)}'
root:x:0:0:root:/root:/bin/bash
1
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
0
bin:x:2:2:bin:/bin:/usr/sbin/nologin
0
sys:x:3:3:sys:/dev:/usr/sbin/nologin
0
sync:x:4:65534:sync:/bin:/bin/sync
0
- match(s,r) 测试s是否包含匹配r的字符串示例
$ cat passwd.txt | awk -F: '{ print $0;print match($0,"root")}'
root:x:0:0:root:/root:/bin/bash
1
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
0
bin:x:2:2:bin:/bin:/usr/sbin/nologin
0
sys:x:3:3:sys:/dev:/usr/sbin/nologin
0
sync:x:4:65534:sync:/bin:/bin/sync
0
- split(s,a,fs) 将字符串s使用fs分割并存储在数组a中示例
split (s,a) 如果第三个参数没有提供,awk就默认使用当前FS值
$ cat passwd.txt | awk '{print $0;split($0,arry,":");print length(arry),arry[1],arry[2],arry[3]}'
root:x:0:0:root:/root:/bin/bash
7 root x 0
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
7 daemon x 1
bin:x:2:2:bin:/bin:/usr/sbin/nologin
7 bin x 2
sys:x:3:3:sys:/dev:/usr/sbin/nologin
7 sys x 3
sync:x:4:65534:sync:/bin:/bin/sync
7 sync x 4
- sprint(fmt,exp) 返回经fmt格式化后的exp示例
- fmt格式化说明:
格式 | 说明 | 示例 | 输出结果 |
---|---|---|---|
%c | 将ASCII转化为字符输出 | echo|awk ‘{print sprintf(“%c”,66)}’ | B |
%d,%i | 转化为整数不会进行四舍五入 | echo|awk ‘{print sprintf(“%d”,2.22)}’ | 2 |
%e,%E | 科学计数法输出 | echo|awk ‘{print sprintf(“%e”,2.22)}’ | 2.220000e+00 |
%f,%F | 浮点数输出,会四舍五入 | echo|awk ‘{print sprintf(“%f”,2.22)}’ | 2.220000 |
%g,%G | 输出浮点数,或者科学计数法输出 | echo|awk ‘{print sprintf(“%g”,2.22)}’ | 2.22 |
%o | 输出八进制 | echo|awk ‘{print sprintf(“%o”,12)}’ | 14 |
%s | 输出字符串 | echo|awk ‘{print sprintf(“%s”,121111)}’ | 121111 |
%x,%X | 输出十六进制 | echo|awk ‘{print sprintf(“%x”,18)}’ | 12 |
%% | 输出%号 | echo|awk ‘{print sprintf(“%%%x”,18)}’ | %12 |
- 修饰符—在格式化字符的前面
修饰符 | 说明 | 示例 | 结果 |
---|---|---|---|
N$ | N是正整数。printf的字段列表顺序和格式化字符串中的%号顺序是一一对应的,使用N$可以自行指定顺序 | echo|awk -F: ‘{print sprintf(“%2$s,%1$s”, “hello”,“word”)}’ | word,hello |
%5s | 宽度 指定该字段占用的字符数量,不足宽度默认使用空格填充,超出宽度将无视 | echo|awk -F: ‘{print sprintf(“%10s”, “hello”)}’ | _____hello(下划线表示空格) |
- | 表示左对齐。默认是右对齐的 | echo|awk -F: ‘{print sprintf(“%-10s”, “hello”)}’ | hello_____(下划线表示空格) |
%.Nf | N是正整数。浮点数保留小数位数 | echo|awk ‘{print sprintf(“%.3f”,18.12345)}’ | 18.123 |
- 简单的示例:
cat passwd.txt | awk -F: '{a = sprintf("%s-%s",$1,$2);print a}'
root-x
daemon-x
bin-x
sys-x
sync-x
- substr(s,p) 返回字符串s中从p开始的后缀部分示例
$ cat passwd.txt | awk '{print $1 ;print "----"substr($1,4)}'
root:x:0:0:root:/root:/bin/bash
----t:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
----mon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
bin:x:2:2:bin:/bin:/usr/sbin/nologin
----:x:2:2:bin:/bin:/usr/sbin/nologin
sys:x:3:3:sys:/dev:/usr/sbin/nologin
----:x:3:3:sys:/dev:/usr/sbin/nologin
sync:x:4:65534:sync:/bin:/bin/sync
----c:x:4:65534:sync:/bin:/bin/sync
- substr(s,p,n) 返回字符串s中从p开始长度为n的后缀部分示例
$ cat passwd.txt | awk '{print $1 ;print "----"substr($1,4,10)}'
root:x:0:0:root:/root:/bin/bash
----t:x:0:0:ro
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
----mon:x:1:1:
bin:x:2:2:bin:/bin:/usr/sbin/nologin
----:x:2:2:bin
sys:x:3:3:sys:/dev:/usr/sbin/nologin
----:x:3:3:sys
sync:x:4:65534:sync:/bin:/bin/sync
----c:x:4:6553
四、条件语句
wk允许指定输出条件,只输出符合条件的行文章来源:https://www.toymoban.com/news/detail-759880.html
$ awk ‘条件 动作’ 文件名文章来源地址https://www.toymoban.com/news/detail-759880.html
- 正则表达式匹配指定的行
$ cat passwd.txt
root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
bin:x:2:2:bin:/bin:/usr/sbin/nologin
sys:x:3:3:sys:/dev:/usr/sbin/nologin
sync:x:4:65534:sync:/bin:/bin/sync
$ cat passwd.txt | awk '/sys/ {print $1}'
sys:x:3:3:sys:/dev:/usr/sbin/nologin
- 输出偶数行
$ cat passwd.txt | awk -F: 'NR % 2 == 0 {print $1}'
daemon
sys
- 输出字段等于特定值
$ cat passwd.txt | awk -F: '$1 == "bin" {print $0}'
bin:x:2:2:bin:/bin:/usr/sbin/nologin
- if语句
$ cat passwd.txt | awk -F: '{if($1 >= "r") print $0}'
root:x:0:0:root:/root:/bin/bash
sys:x:3:3:sys:/dev:/usr/sbin/nologin
sync:x:4:65534:sync:/bin:/bin/sync
$ cat passwd.txt | awk -F: '{if($1 >= "r") print $0 ;else print $1}'
root:x:0:0:root:/root:/bin/bash
daemon
bin
sys:x:3:3:sys:/dev:/usr/sbin/nologin
sync:x:4:65534:sync:/bin:/bin/sync
$ cat passwd.txt | awk -F: '{if($1 >= "r") print $0 ;else if($1<"r") print $1}'
root:x:0:0:root:/root:/bin/bash
daemon
bin
sys:x:3:3:sys:/dev:/usr/sbin/nologin
sync:x:4:65534:sync:/bin:/bin/sync
到了这里,关于awk基础用法详解的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!