目录
绪论
1、用法
1.1 格式选项
1.2 awk 常用内置变量
1.3 awk的打印功能
1.4 奇偶打印
1.5 awk运算
1.6 awk的内置函数:getline
1.7 文本过滤打印
1.8 awk条件判断打印
1.9 三元表达式,类似于java
1.10 awk的精确筛选
1.11 awk和tr比较改变分隔符
1.12 awk结合数组来进行使用
1.13 去重统计
绪论
awk是文本三剑客之一(grep,sed,awk),是功能最强大的文本工具,也是按行来进行操作,对行操作完之后,可以根据指定命令来进行取列
awk的分割符,他的默认分隔符是空格,或者tab键,多个空格,它会自动压缩成一个
1、用法
awk 选项 '模式或者条件{操作}' 文件
1.1 格式选项
-F 指定分割符,如果是空格,则不需要加F
-v 变量赋值
{操作}:默认为打印
eg:awk '{print $1}' test.txt 打印第一列
打印多列的话用逗号隔开,$0表示全部打印
1.2 awk 常用内置变量
$0 打印所有内容
$n 处理行的第几列
NR 处理行的行号
NF 处理当前行的字段个数,$NF就表示最后一个字段
FS 列分割符,指定文本的分割符,和F作用一直
F:分割符 FS=":"
OFS 输出文本的分割符
RS 输出分割符为回车,行分割符
内置变量$n要加$,表示列的;其他的内置变量,不用加$,更不能用引号,也不能用括号,否则会被当成字符串处理
1.3 awk的打印功能
awk '{print} ' 文件名
awk '{print NR} ' 文件名
awk '{print NR,$0} ' 文件名
指定行号打印输出内容:
awk 'NR==3{print}' test,txt 打印第三行
awk 'NR==2,NR==4{print}' test,txt 打印第二到四行
awk 'NR==2;NR==4{print}' test,txt 打印第二和四行
1.4 奇偶打印
awk 'NR%2==0{print}' 文件名 偶数打印
1.5 awk运算
awk 'BEGIN{PRINT 10+20}'
awk 'begin{print 3^2}' 3的2次方,也支持小数运算
awk '{print $3}' test.txt取出第三行
1.6 awk的内置函数:getline
· 如果getline左右两侧没有重定向符号(<>),或者没有(|)时,awk会先读第一行,但是如果加了getline,跳过第一行,读取第二行
awk '{getline;print}' test.txt 打印了第二行和第四行,偶数打印
awk '{print;getline}' test.txt 奇数打印
· 如果两边有重定向或者管道符,getline作用于定向输入文件
awk '{getline < "test1.txt";print>"test2.txt"}' test1.txt操作对象是test1.TXT,获取test1的内容,传给test2
ls | awk '{getline ky30;print ,ky30;}' getline:自定义的变量。把ls输出的结果传给ky30,打印前面ls的结果
1.7 文本过滤打印
awk 以root为开头的行:
awk '/^root/{print}' /etc/passwd
awk 'BEGIN{..};{..};END{..}' 文件在对文件进行操作之前会先执行BEGIN{..}的模式条件,或者是命令操作。中间的{..}是真正的处理文件的命令。END{..}结束语句,一般都是打印执行结果
v变量赋值,指的是改变分割符
1.8 awk条件判断打印
awk -F: '$3>100{print}' /etc/passwd | head -n 15 第三列大于100的打印出来
取反:awk -F: '!($3>10){print}' /etc/passwd | head -n 15
awk支持条件判断语句if
awk -F: '{if ($3>10) {print}}' /etc/passwd
1.9 三元表达式,类似于java
格式:awk '(条件表达式)?(A表达式或者值):(B的表达式或者值)'
?相当于if :相当于else
awk -F: '{i=($3>$4)?$3:$4;{print $1,$2}}' /etc/passwd
1.10 awk的精确筛选
$NF:最后一个字段
head -n 2 /etc/passwd | awk -F: '{print $NF}' 第七个字段为bash,打印第一列和最后一列
awk -F: '$7!~"nologin"{print $1,$3}' /etc/passwd 第七个字段不是nologin的打印第一列和第三列
&&和 ||或 条件表达式用括号括起来
1.11 awk和tr比较改变分隔符
echo a b < d | tr " " " " ":" 输出a:b:c:d
1.12 awk结合数组来进行使用
在awk中怎么定义数组
1.13 去重统计
提取host.txt主机名
awk -F '[ .]+' '{print $2}' test.txt