概述
文本三剑客之一,是功能最强大的文本工具,
awk也是按行进行操作,但是是对行操作完之后可以根据指定命令来对行取列,对列进行操作
awk 分隔符
默认分隔符是空格键或则TAB键,多个空格会压缩成一个
awk的用法
格式:
awk ‘选项’ 模式或则条件 {操作} 文件(操作对象)
awk ‘{print $1} test.txt’ : 打印test.txt第一列
常用选项
-F:指分隔符,如果是空格,不需要指定
-v : 变量赋值
操作默认就是打印
awk 常用内置变量:
$o:打印所有内容
$n:当前处理行的第n个字段(第n列)
NR: 当前处理的行的行号(序数)
NF: 当前处理的行的字段个数
$NF代表最后一个字段
FS: 列分割符。指定每行文本的字段分隔符,输入内容的分隔符
-F: FS=“:”
不常用的:
OFS:输出内容的列分隔符
内置变量: $N要加"$" 其他内置变量不用加"$" ,更不能用引号,也不能用括号,否则会被当成字符串来处理
awk 的打印功能
awk ‘{print}’ test.txt :打印所有
0和1放置{ print}前,能够起到限制打印内容的作用(默认为"1"),如果为0,就不打印内容
awk '{print $0}' test1.txt
$0,代表整行内容;
awk是逐行读取处理,配合$0,就是打印所有内容
$1只取第一列,可以对行切片,输出列
只打印行号
即打印行号,也打印内容
打印第三行
打印第二行和第四行
奇偶打印
awk运算
格式:
除了加减乘除外,也可以求幂,整数和小鼠都可以
面试题
awk的内置函数
getline
1、当getline左右无重定向符号(“<”,">")或者管道符号(“|”)时,awk首先读取的是第一行,而getline获取的是光标跳转至下一行的内容(也就是第二行)。
2、当getline左右有管道符号或重定向符时,getline则作用定向输入文件,由于文件是刚打开,并没有被awk读入一行,而只是getline读入,所以getline返回的是文件的第一行,而不是跳转至一行输入
awk '{print $0;getline}' test1.txt 打印一行,跳过一行,打印奇数行
awk '{getline;print $0}' test1.txt 跳过一行。打印一行 打印偶数行
如果两边有重定向或则管道符,getline 作用于定向输出文件
awk '{getline < "test1.txt"; print $0 > "test2.txt";}' test1.txt
使用重定向把test1输出给test2
ls | awk '{getline ky30; print $0, ky30;}'
“ | ” :getline ky30 自定义变量
ls 输出结果传给getline 然后 传给ky30 在打印命令的输出结果,如果没有结果,不做任何结果
文本内容匹配过滤打印:
以root为开头进行过滤
BEGIN打印模式
格式;
awk 'BEGIN{...};{...};END{...}' 文件
处理过程:
1、在awk处理指定的文本之前,需要先执行BEGIN{...}模式里的命令操作
2、中间的{...} 是真正用于处理文件的命令操作
3、在awk处理完文件后才会执行END{...}模式里的命令操作。END{ }语句块中,往往会放入打印结果等语句。
BEGIN定义某个模式,中间的对前面的模式进行操作,最后打印结果
-v的用法:变量赋值
把原来的“ : ” 的分隔符变为“+” 并打印变量的内容
awk 条件判断打印
UID大于500 的进行打印
取反,uid小于10的行,所有列
awk的三元表达式与精准筛选用法
格式:
awk '(条件表达式)?(A表达式或者值):(B表达式或者值)'
? : 表示if (满足)
“ :” : 表示else (不满足)
三元表达式:条件表达式、A表达式、B表达式
awk的精确筛选:
$n(> < ==): 用于对比数值
$n~"字符串": 代表第n个字段包含某个字符串
$n!~"字符串": 代表第n个字段不包含某个字符串
$n=="字符串": 代表第n个字段为某个字符串
$n!="字符串": 代表第n个字段不为某个字符串
$NF: 代表最后一个字段
例如:
输出第七个字段不包含“nologin”所在行的第1个字段和第3个字段
awk -F: '$7!~"nologin" {print $1,$3}' /etc/passwd
指定第六个字段为/home/dn,第七个字段为/bin/bash,输出满足这些条件所在行的第一个和最后一个字段
awk -F: '($6=="/home/dn")&&($7=="/bin/bash"){print $1,$NF}' /etc/passwd
awk 和tr比较改变分隔符
awk方式
awk结合数组运用
在awk中,怎么定义数组
awk中的数组形成遍历
awk 'BEGIN{a[0]=10 ; a[1]=20 ; a[2]=30;for(i in a)print i,a[i]}'