文章目录
- 一. awk支持的语法格式:
- 使用awk过滤
- 使用awk 过滤第一列和最后一列
- awk还可以结合管道和重定向,进行使用
- 使用awk进行对命令进行过滤,显示/etc/passwd的账户和账户对应的shell,而账户与shell之间以逗号分割,而且在所有行添加列名name,shell,在最后一行添加"blue,/bin/nosh"
- awk系统的教程
- awk 还可以顺序调转打印文件内容
- 使用awk进行个数统计
- 使用AWK 进行对文本内容进行,分割
- 12.使用awk中的FS过滤不规则的列
- 13.如果要指定两个分隔符,进行过滤数据,要用[ ] 包括
- 14.awk 外在变量和内在变量
- 15.awk -v 选项 是指定在任何输入被读入前定义参数 #指定执行BEGIN前的变量赋值
- 16.awk 使用内置函数
- 17、 awk -v FIELDWIDTHS="23 8 9999"
- 18、awk之判断
一. awk支持的语法格式:
- 支持内置变量
- 支持函数
- 支持条件操作,正则表达式匹配
- 支持流程控制语句,类似于c语言
1.使用awk 过滤多个字符
[root@node1 ~]# awk -F: ‘/^(root|adm)/{print $1,$3}’ /etc/passwd
root 0
adm 3
[root@node1 ~]# awk -F: ‘/root|adm/{print $1,$3}’ /etc/passwd
root 0
adm 3
operator 11
2.打印文件的行数
[root@node1 ~]# sed -n ‘$=’ /etc/passwd
[root@localhost awk]# awk ‘BEGIN{x=0;} {x++;} END{print x}’ passwd
19
[root@localhost awk]# wc -l passwd
19 passwd
2.1 打印所有的行数
[root@localhost awk]# awk ‘//{print }’ passwd
3. 使用分割符
命令解释: -F ‘:’ 是以:进行分割,
如果只是显示/etc/passwd的账户和账户对应的shell,而账户与shell之间以tab键分割
[root@localhost awk]# awk -F ':' '{print $1"\t"$7}' passwd
root /bin/bash
bin /sbin/nologin
daemon /sbin/nologin
adm /sbin/nologin
lp /sbin/nologin
sync /bin/sync
shutdown /sbin/shutdown
halt /sbin/halt
mail /sbin/nologin
operator /sbin/nologin
games /sbin/nologin
4,如果只是显示/etc/passwd的账户和账户对应的shell,而账户与shell之间以逗号分割,而且在所有行添加列名name,shell,在最后一行添加"blue,/bin/nosh"。
[root@localhost awk]# awk -F ':' 'BEGIN {print "name,shell"} {print $1","$7} END {print "blue,/bin/nosh"}' passwd
name,shell
root,/bin/bash
bin,/sbin/nologin
daemon,/sbin/nologin
adm,/sbin/nologin
operator,/sbin/nologin
blue,/bin/nosh
5.awk过滤包含关键字 (跟grep的用法是一直的)
[root@localhost awk]# awk -F: '/root/' passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
案例,过滤最近登录系统的用户数
[root@localhost awk]# last -n 5
root pts/1 192.168.199.1 Fri Dec 7 00:36 still logged in
root pts/0 192.168.199.1 Thu Dec 6 23:24 still logged in
root pts/0 192.168.199.1 Thu Dec 6 18:38 - 21:48 (03:10)
root tty1 Thu Dec 6 18:37 still logged in
reboot system boot 3.10.0-693.el7.x Thu Dec 6 18:34 - 00:44 (06:09)
wtmp begins Tue Dec 4 19:45:18 2018
使用awk过滤
[root@localhost awk]# last -n 5 | awk '{print $1}'
root
root
root
root
reboot
wtmp
参考博文
https://blog.youkuaiyun.com/zl378837964/article/details/84829852
使用awk 统计文件的行数
[root@localhost awk]# awk ‘BEGIN{x=0;} {x++;} END{print x}’ passwd
19
[root@localhost awk]# wc -l passwd
19 passwd
使用awk 过滤第一列和最后一列
[root@localhost awk]# awk -F ‘:’ ‘{print $1}’ passwd | head -5
root
bin
daemon
adm
lp
[root@localhost awk]# awk -F ‘:’ ‘{print
1
,
1,
1,NF}’ passwd | head -5
root /bin/bash
bin /sbin/nologin
daemon /sbin/nologin
adm /sbin/nologin
lp /sbin/nologin
awk还可以结合管道和重定向,进行使用
[root@localhost awk]# awk -F ‘/’ ‘{print $NF}’ passwd > 1.txt
[root@localhost awk]# ls
1.txt passwd
[root@localhost awk]# cat 1.txt
bash
nologin
nologin
nologin
nologin
sync
awk使用正则表达式,可以参考以下博文
https://www.cnblogs.com/slpawn/p/8747930.html
使用awk截取字符
[root@localhost awk]# awk ‘{print substr($0,5,5)}’ passwd | head -10
❌0:
x:1:1
on❌
x:3:4
:4:7:
命令解释:从第一个字符开始计算,第五个开始,截取5个字符
使用awk进行对命令进行过滤,显示/etc/passwd的账户和账户对应的shell,而账户与shell之间以逗号分割,而且在所有行添加列名name,shell,在最后一行添加"blue,/bin/nosh"
[root@localhost awk]# cat passwd |head -5 |awk -F ‘:’ ‘BEGIN {print “name,shell”} {print $1","$7} END {print “blue,bing log”}’
name,shell
root,/bin/bash
bin,/sbin/nologin
daemon,/sbin/nologin
adm,/sbin/nologin
lp,/sbin/nologin
blue,bing log
awk工作流程是这样的:先执行BEGING,然后读取文件,读入有/n换行符分割的一条记录,然后将记录按指定的域分隔符划分域,填充域,$0则表示所有域,
1
表
示
第
一
个
域
,
1表示第一个域,
1表示第一个域,n表示第n个域,随后开始执行模式所对应的动作action。接着开始读入第二条记录······直到所有的记录都读完,最后执行END操作。
这个是awk内置变量的博文
http://www.cnblogs.com/ggjucheng/archive/2013/01/13/2858470.html
awk还可以同时过滤多个文件
参考博文
https://blog.youkuaiyun.com/u010533843/article/details/78551622
awk ‘{ print FILENAME,$0 }’ file1 file2 file3>fileall
把file1、file2、file3的文件内容全部写到fileall中,格式为 打印文件并前置文件名。
awk系统的教程
https://www.yiibai.com/awk/awk_environment.html
awk还可以支持脚本(但是后缀必须是awk结尾的脚本)
1、标准的语法格式
awk [options] -f file …
2.案例操作
[root@localhost awk]# awk ‘{print}’ marks.txt
Amit Physics 80
Rahul Maths 90
Shyam Biology 87
Kedar English 85
Hari History 89
[root@localhost awk]# touch command.awk
[root@localhost awk]# ls
command.awk marks.txt passwd
[root@localhost awk]# vim command.awk (必须是awk后缀结尾)
{print}
:wq
[root@localhost awk]# awk -f command.awk marks.txt
Amit Physics 80
Rahul Maths 90
Shyam Biology 87
Kedar English 85
Hari History 89
awk 还可以顺序调转打印文件内容
[root@localhost awk]# awk ‘/a/ {print $1 “\t” $3}’ marks.txt
Rahul 90
Shyam 87
Kedar 85
Hari 89
[root@localhost awk]# awk ‘/a/ {print $3 “\t” $1}’ marks.txt
90 Rahul
87 Shyam
85 Kedar
89 Hari
使用awk进行个数统计
awk ‘/a/{++cnt} END {print "Count = ", cnt}’ marks.txt
Count = 4
使用AWK 进行对文本内容进行,分割
[root@localhost tang]# cat 4.txt
nihao,nih;zhang"zhao"ma
[root@localhost tang]# awk -F’[,;"]’ ‘{print $1,$2,$3,$4,$5}’ 4.txt
nihao nih zhang zhao ma
12.使用awk中的FS过滤不规则的列
[root@king ~]# cat /proc/cpuinfo
processor : 0
vendor_id : GenuineIntel
cpu family : 6
model : 142
[root@king ~]# awk 'BEGIN{FS="[ \t]+:[ \t]"} /vendor_id/ {print $2}' /proc/cpuinfo
GenuineIntel
命令解释:
awk截取信息, FS为指定格式; 以 “:” 冒号为分界符,两边都是制表符"\t",第二个参数
/machine指定了以machine为开始的那一行
https://www.cnblogs.com/rohens-hbg/p/5510890.html
13.如果要指定两个分隔符,进行过滤数据,要用[ ] 包括
awk -F ‘[-:]’ '{print $1,$2}’ access.log
https://www.cnblogs.com/rainy-shurun/p/5426541.html
cat liumin.sh | awk -F '[\":\"]' '{print $42}' | sort | uniq -c
14.awk 外在变量和内在变量
https://www.cnblogs.com/-clear-/p/7570841.html
15.awk -v 选项 是指定在任何输入被读入前定义参数 #指定执行BEGIN前的变量赋值
实例:
[root@king shell]# awk -v n=1 ‘BEGIN{print n}’
1
参考博文:
http://bbs.chinaunix.net/thread-4208706-1-1.html
16.awk 使用内置函数
substr 截取字符串
返回从起始位置起,指定长度之子字符串;若未指定长度,则返回从起始位置到字符串末尾的子字符串。
格式:
substr(s,p) 返回字符串s中从p开始的后缀部分
substr(s,p,n) 返回字符串s中从p开始长度为n的后缀部分
[king@king ~]$ df -v | grep /boot
/dev/sda1 1038336 134980 903356 13% /boot
[king@king ~]$ df -v | grep "/boot"|awk '{print substr($4,1,2)}'
90
cat debug.log.2019-08-27.bak | grep 已兑换数量 | awk '{print $10}'
cat debug.log.2019-08-27.bak | grep 已兑换数量 | awk -F , '{print $5}' | awk -F [ '{print $2}' | awk -F ] '{print $1}