网站模板文件不存在,青岛建站公司电话,清丰网站建设,一起做网站逛市场目录
认识awk
使用awk
语法
常用命令选项
awk变量
内置变量
自定义变量
printf命令
格式
演示
操作符
格式
演示
awk PATTERN 匹配部分
格式
演示
awk有意思的案例 认识awk awk是一种编程语言#xff0c;用于在linux/unix下对文本和数据进行处理。数据可以来…目录
认识awk
使用awk
语法
常用命令选项
awk变量
内置变量
自定义变量
printf命令
格式
演示
操作符
格式
演示
awk PATTERN 匹配部分
格式
演示
awk有意思的案例 认识awk awk是一种编程语言用于在linux/unix下对文本和数据进行处理。数据可以来自标准输入(stdin)、一个或多个文件或其它命令的输出。它支持用户自定义函数和动态正则表达式等先进功能是linux/unix下的一个强大编程工具。它在命令行中使用但更多是作为脚本来使用。awk有很多内建的功能比如数组、函数等这是它和C语言的相同之处灵活性是awk最大的优势。 awk其实不仅仅是工具软件还是一种编程语言。不过本文只介绍它的命令行用法对于大多数场合应该足够用了。
使用awk
语法
awk [options] program varvalue file…awk [options] -f programfile varvalue file…awk [options] BEGIN{ action;… } pattern{ action;… } END{ action;… } file ...
常用命令选项 -F fsfs指定输入分隔符fs可以是字符串或正则表达式如-F: -v varvalue赋值一个用户定义变量将外部变量传递给awk -f scripfile从脚本文件中读取awk命令
awk变量
变量内置和自定义变量每个变量前加 -v 命令选项
内置变量
1格式 FS 输入字段分隔符默认为空白字符 OFS 输出字段分隔符默认为空白字符 RS 输入记录分隔符指定输入时的换行符原换行符仍有效 ORS 输出记录分隔符输出时用指定符号代替换行符 NF 字段数量共有多少字段 $NF引用最后一列$(NF-1)引用倒数第2列 NR 行号后可跟多个文件第二个文件行号继续从第一个文件最后行号开始 FNR 各文件分别计数, 行号后跟一个文件和NR一样跟多个文件第二个文件行号从1开始 FILENAME 当前文件名 ARGC 命令行参数的个数 ARGV 数组保存的是命令行所给定的各参数查看参数
2演示
[roottest ~]# cat awkdemo
hello:world
linux:redhat:lalala:hahaha
test:love:youou
[roottest ~]# awk -v FS: {print $1,$2} awkdemo #FS指定输入分隔符
hello world
linux redhat
test love
//这里打印了以为输入分隔符打印了第一列和第二列
[roottest ~]# awk -v FS: -v OFS--- {print $1,$2} awkdemo #OFS指定输出分隔符
hello---world
linux---redhat
test---love
//这里以为输入分隔符---为输出分隔符然后打印出了第一列和第二类
[roottest ~]# awk -v RS: {print $1,$2} awkdemo
hello
world linux
redhat
lalala test
love
youou
//指定以:为换行符并且原换行符无效
[roottest ~]# awk -v FS: -v ORS--- {print $1,$2} awkdemo
hello world---linux redhat---test love---
//这里以为输入分隔符并且将‘---’替换\n 来输出第一列和第二列
[roottest ~]# awk -F: {print NF} awkdemo
2
4
3
//打印出了每行的字段数
[roottest ~]# awk -F: {print $(NF-1)} awkdemo #显示倒数第2列
hello
lalala
love
//显示出倒数第二列
[roottest ~]# awk {print NR} awkdemo awkdemo1
1
2
3
4
5
//打印出行号
[roottest ~]# awk END{print NR} awkdemo awkdemo1
5
//打印出最后一行的行号
[roottest ~]# awk {print FNR} awkdemo awkdemo1
1
2
3
1
2
//一共两个文件各文件分别计数, 行号
[roottest ~]# awk {print FILENAME} awkdemo
awkdemo
awkdemo
awkdemo
//当前文件名
[roottest ~]# awk BEGIN {print ARGC} awkdemo awkdemo1
3
//命令行参数的个数
[roottest ~]# awk BEGIN {print ARGV[0]} awkdemo awkdemo1
awk
//第一个参数
[roottest ~]# awk BEGIN {print ARGV[1]} awkdemo awkdemo1
awkdemo
//第二个参数
[roottest ~]# awk BEGIN {print ARGV[2]} awkdemo awkdemo1
awkdemo1
//第三个参数
自定义变量
自定义变量( 区分字符大小写)
1-v varvalue
① 先定义变量后执行动作print
[rootcentos111 test]# awk -v nameyps -F: {print name:$0} awkdemo
yps:hello:world
yps:linux:redhat:lalala:hahaha
yps:along:love:youou
② 在执行动作print后定义变量
[rootcentos111 test]# awk -F: {print name:$0;nameyps} awkdemo
:hello:world
yps:linux:redhat:lalala:hahaha
yps:along:love:youou
2在program 中直接定义
可以把执行的动作放在脚本中直接调用脚本 -f
[rootcentos111 test]# cat awk
{nameyps;print name,$1}
[rootcentos111 test]# awk -F: -f awk awkdemo
yps hello
yps linux
yps alongprintf命令
比print更强大
格式
1格式化输出
printf FORMAT, item1,item2, ...
① 必须指定FORMAT
② 不会自动换行需要显式给出换行控制符\n
③ FORMAT 中需要分别为后面每个item 指定格式符
2格式符与item 一一对应 %c: 显示字符的ASCII码 %d, %i: 显示十进制整数 %e, %E: 显示科学计数法数值 %f 显示为浮点数小数 %5.1f带整数、小数点、整数共5位小数1位不够用空格补上 %g, %G 以科学计数法或浮点形式显示数值 %s 显示字符串例%5s最少5个字符不够用空格补上超过5个还继续显示 %u 无符号整数 %%: 显示% 自身
3修饰符放在%c[/d/e/f...]之间 #[.#]第一个数字控制显示的宽度第二个# 表示小数点后精度%5.1f -左对齐默认右对齐 %-15s 显示数值的正负符号 %d
演示
---筛选出/etc/passwd文件中的第一列个第三列
[rootcentos111 test]# awk -F: {print $1,$3} /etc/passwd | grep root
root 0
---第一列显示小于5的字符串第2列显示整数并换行
[rootcentos111 test]# awk -F: {printf %5s--%u\n,$1,$3} /etc/passwd root--0bin--1
daemon--2
...
---使用-进行左对齐第2列显示浮点数
[rootcentos111 test]# awk -F: {printf %-20s--%-10.3f\n,$1,$3} /etc/passwd
root --0.000
bin --1.000
daemon --2.000
...
操作符
格式 算术操作符 xy, x-y, x*y, x/y, x^y, x%y -x: 转换为负数 x: 转换为数值 字符串操作符没有符号的操作符字符串连接 赋值操作符 , , -, *, /, %, ^ , -- 比较操作符 , !, , , , 逻辑操作符与 或|| 非! 函数调用 function_name(argu1, argu2, ...) 条件表达式三目表达式 selector ? if-true-expression : if-false-expression 注释先判断selector如果符合执行 ? 后的操作否则执行 : 后的操作
演示
1模式匹配符
---查询以/dev开头的磁盘信息
[rootcentos111 test]# df -h | awk /^\/dev/
/dev/mapper/centos-root 17G 9.5G 7.6G 56% /
/dev/sda1 1014M 254M 761M 25% /boot
---只显示磁盘使用状况和磁盘名
[rootcentos111 test]# df -h | awk /^\/dev/{print$(NF-1)--$1}
56%--/dev/mapper/centos-root
25%--/dev/sda1
---查找磁盘大于40%的
[rootcentos111 test]# df -h | awk $0 ~ /^\/dev/{print$(NF-1)--$1} | awk -F% $1 40
56%--/dev/mapper/centos-root
2逻辑操作符
[rootcentos111 test]# awk -F: $30$31000{print $1,$3} /etc/passwd
root 0
bin 1
daemon 2
...
[rootcentos111 test]# awk -F: $30||$31000{print $1} /etc/passwd
root
nfsnobody
user
user1
user2
[rootcentos111 test]# awk -F: !($30){print $1} /etc/passwd
bin
...
[rootcentos111 test]# awk -F: !(/bash$/){print $1,$3} /etc/passwd
bin 1
daemon 2
...
3条件表达式三目表达式
[rootcentos111 test]# awk -F: {$31000? usertypecommon user:usertyprsysadmin user;print usertype,$1,$3} /etc/passwdroot 0bin 1
...
common user nfsnobody 65534
common user gnome-initial-setup 989
...
awk PATTERN 匹配部分
格式
PATTERN根据pattern 条件过滤匹配的行再做处理
1如果未指定空模式匹配每一行
2/regular expression/ 仅处理能够模式匹配到的行正则需要用/ / 括起来
3relational expression关系表达式结果为“真”才会被处理
真结果为非0值非空字符串
假结果为空字符串或0值
4line ranges行范围 startline(起始行),endline(结束行)/pat1/,/pat2/ 不支持直接给出数字可以有多段中间可以有间隔
5BEGIN/END 模式 BEGIN{}: 仅在开始处理文件中的文本之前执行一次 END{} 仅在文本处理完成之后执行
演示
[rootcentos111 test]# awk -F: {print $1} awkdemo
hello
linux
along
[rootcentos111 test]# awk -F: /hello/{print $1} awkdemo
hello
[rootcentos111 test]# awk -F: 1{print $1} awkdemo
hello
linux
along
[rootcentos111 test]# awk -F: 0{print $1} awkdemo
[rootcentos111 test]# awk -F: /^h/,/^a/{print $1} awkdemo
hello
linux
along
[rootcentos111 test]# awk -F: BEGIN{print 第一列}{print $1} END{print 结束} awkdemo
第一列
hello
linux
along
结束
awk有意思的案例
seq 10 是一个 Linux 命令表示生成一个从 1 到 10 的序列。
[rootcentos111 test]# seq 10
1
2
3
4
5
6
7
8
9
10
---因为i0为假所以不打印
[rootcentos111 test]# seq 10 | awk i0
---i1为真所以全部打印
[rootcentos111 test]# seq 10 | awk i1
1
2
3
4
5
6
7
8
9
10
---只打印奇数行奇数行i进入时本身为空被赋为!i即不为空所以打印偶数行i进入时本身不为空被赋为!i即为空所以不打印
[rootcentos111 test]# seq 10 | awk i!i
1
3
5
7
9
---解释上一个操作i在奇偶行的值
[rootcentos111 test]# seq 10 | awk {i!i;print i}
1
0
1
0
1
0
1
0
1
0
---只打印偶数行是上边打印奇数行的取反
[rootcentos111 test]# seq 10 | awk !(i!i)
2
4
6
8
10
---只打印偶数行先对i进行赋值即不为空刚好和打印奇数行相反
[rootalong ~]# seq 10 |awk -v i1 i!i
2
4
6
8
10
seq 100 |awk i!i 那这段是怎么理解 首先我们要了解一下awk对于未定义的变量处理方法 对于数值运算未定义变量的话awk会赋予变量初值为0 对于字符运算未定义变量的话awk会赋予变量初值为空字符串 了解了这两条我们再看awk i!i这条命令是什么含义awk是对文本文件一行一行处理的seq 100命令执行后是如下形式 1
2
3
……
100 首相它读取第一行数据也就是1然后进行模式匹配i是一个未定义的变量上面我们提到了对于数值运算未定义变量的话初值会为0这时i的值即为0也就是i!0那么!是什么呢!就是取反的意思等号右边其实就是个布尔值0为假1为真这里是!0那么它就为非假也就是为真真的值为1因此i!01也就相当于i1到此i的值为1.
i的值为1后有什么作用呢 i1说明值为真awk会认定模式为真这时匹配是成功的会把第一行输出到屏幕可能有的人会问了这里只有i!i没有print它怎么输出的?awk的格式为 模式{ 动作}如果只有模式没有动作那么匹配成功后默认的会输出整条记录也就是说这条命令完整的写法为 seq 1 100 | awk i!i{print $0} 为什么第二行没有输出呢 前面进行第一行模式匹配的时候i的值已经由0变为了1在进行第二行操作的时候i!i变成了i!1这样i的值就又变成了0假所以第二行没有输出到了处理第三行的时候i!i变成了i!0所以会输出第三行以此类推……这样我们就可以输出奇数行而删除偶数行了。 那么如何输出偶数行呢 我们可以加一个if判断一下如果i的值为真我们就输出奇数行如果为假就输出偶数行
[rootcentos111 test]# seq 1 10 |awk {i!i;if(i) print $0}
1
3
5
7
9
[rootcentos111 test]# seq 1 10 |awk {i!i;if(!i) print $0}
2
4
6
8
10
看到这儿又有朋友可能会问了为什么现在把i!i放到动作里了呢 我们看这两条命令
[rootcentos111 test]# seq 1 10 |awk i!i{print !i}
0
0
0
0
0
[rootcentos111 test]# seq 1 10 |awk i!i{print i}
1
1
1
1
1
如果把i!i放到模式里边它会进行匹配把匹配的结果传递给动作那个时候已经把不匹配的舍去了所以我们无法用if来判断i的值。
到这里awk的一些基本用法就结束了下一篇会继续介绍awk的高级用法