awk基础用法详解

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 实例
  1. 通过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=:相同)

  1. 通过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
  1. 将上述文件中用:分割个第一列中的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
  1. 将上述文件中的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示例
  1. 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
  1. 修饰符—在格式化字符的前面
修饰符说明示例结果
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_____(下划线表示空格)
%.NfN是正整数。浮点数保留小数位数echo|awk ‘{print sprintf(“%.3f”,18.12345)}’18.123
  1. 简单的示例:
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允许指定输出条件,只输出符合条件的行

$ awk ‘条件 动作’ 文件名

  • 正则表达式匹配指定的行
$ 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
  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
1. grep grep 的基本语法为: ``` grep [OPTION]... PATTERN [FILE]... ``` 其中,`PATTERN` 是要搜索的字符串或正则表达式,`FILE` 是要搜索的文件名。如果不指定 `FILE`,则默认从标准输入读取数据。 常用的选项包括: - `-i`:忽略大小写。 - `-v`:反向匹配,输出不包含 `PATTERN` 的行。 - `-n`:输出匹配行的行号。 - `-r`:递归搜索一个目录下的所有文件。 - `-E`:使用扩展正则表达式。 - `-w`:匹配整个单词,而不是子字符串。 例如,要在文件 `file.txt` 中搜索所有包含 `hello` 的行,可以使用: ``` grep hello file.txt ``` 2. sed sed 的基本语法为: ``` sed [OPTION]... {script-only-if-no-other-script} [input-file]... ``` 其中,`script` 是要执行的编辑命令,支持多个命令以分号分隔。如果不指定 `input-file`,则默认从标准输入读取数据。 常用的命令包括: - `s/PATTERN/REPLACEMENT/g`:替换文本中的 `PATTERN` 为 `REPLACEMENT`,`g` 表示全局替换。 - `d`:删除匹配行。 - `p`:输出匹配行。 - `n`:读入下一行,替换模式空间中的内容,并打印输出。 例如,要将文件 `file.txt` 中的所有 `hello` 替换为 `world`,可以使用: ``` sed 's/hello/world/g' file.txt ``` 3. awk awk 的基本语法为: ``` awk [OPTIONS] 'pattern {action}' file ``` 其中,`pattern` 是要匹配的条件,`action` 是要执行的操作。如果不指定 `file`,则默认从标准输入读取数据。 常用的命令包括: - `$0`:表示整个文本行。 - `$1`:表示第一个字段,以空格为分隔符。 - `-F`:指定字段分隔符。 - `BEGIN`:在处理文件之前执行的命令。 - `END`:在处理文件之后执行的命令。 例如,要在文件 `file.txt` 中输出第二列的内容,可以使用: ``` awk '{print $2}' file.txt ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

相约天涯海角

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值