awk命令

时间:2019-07-05
本文章向大家介绍awk命令,主要包括awk命令使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

awk命令

1 awk命令

1.1 awk作用

擅长取列,擅长统计分析 实际上是gawk的软链接。模式扫描(条件分配),程序语言

1.2 语法

awk [参数] '模式(条件) {动作}(指令)' 文件信息

1.3 功能

查询,排除,替换
以下命令所需环境: cat > oldboy.txt <<EOF
Zhang Dandan 41117397 :250: 100 :175
Zhang Xiaoyu 390320151 :155:90:201
Meng Feixue 80042789 :250:60:50
Wu Waiwai 70271111 :250:80:75
Liu Bingbing 41117483 :250: 100 :175
Wang Xiaoai 3515064655 :50:95:135
Zi Gege 1986787350 :250:168:200
Li Youjiu 918391635 :175:75:300
Lao Nanhai 918391635 :250: 100 :175
EOF
1、显示Xiaoyu的姓氏和ID号码
(1)awk '/Xiaoyu/{print $1,$3}' oldboy.txt

(2)awk '/Xiaoyu/{print $1" "$3}' oldboy.txt

要用逗号,或者双引号分隔
按照指定列进行搜索信息
(1)awk '$2~/Xiaoyu/' oldboy.txt 将有Xiaoyu的信息显示出来

(2)awk '$2!~/Xiaoyu/' oldboy.txt !:表示取反 排除Xiaoyu的信息,将其他信息取出来
~:代表在awk中列的匹配方式

2、姓氏是zhang的人,显示他的第二次捐款金额及他的名字
第一步:先找出姓氏是张的人
awk '$1~/Zhang/' oldboy.txt

第二步:显示出名字和所有捐款记录
awk '$1~/Zhang/{print$2,$4}' oldboy.txt

第三步:指定字符信息作为空格符
awk -F "[: ]+" '$1~/Zhang/{print$2,$5}' oldboy.txt

补充:awk默认使用空格进行作为列分隔符 默认区分大小写
-F 指定分隔符的符号信息
利用 -F "[: ]+" -F 指定括号里的冒号,空格作为分隔符 +:将多个连续的分隔符汇总为一个整体
3、显示所有以41开头的ID号码人的全名和ID号码
第一步:找出ID号码是41开头的人
awk '$3~/^41/' oldboy.txt

第二步:显示出人的全名和ID号码
awk '$3~/^41/{print$1,$2,$3}' oldboy.txt|column -t

columt -t :对文件内容信息进行排序
4、显示所有ID号码最后一位数字是1或5的人的全名
第一步:找出ID号码最后一位数字是1或5的信息
awk '$3~/[15]$/'oldboy.txt
awk '$3~/1$|5$/' oldboy.txt
[ ]、| :在这里都是或者的关系

第二步:显示出全名信息
awk '$3~/[15]$/{print$1,$2}' oldboy.txt|column -t

5、显示文件中第二行,第三行的信息
第一步:显示第二行
awk 'NR==2' oldboy.txt

第二步:显示第三列
awk 'NR==2{print $3}' oldboy.txt

NR:表示行号信息,取出第几行信息
NR==2:取出第二行信息
6、显示Xiaoyu的捐款,每个捐款数值都有以$开头,
方法一:awk -F "[:]" 'NR==2{print "$"$2"$"$3"$"$4}' oldboy.txt

方法二:awk '$2~/Xiaoyu/{print $4}' oldboy.txt|sed 's#:#$#g'

方法三:awk '$2~/Xiaoyu/{print $4}' oldboy.txt|tr ":" "$"

方法四:awk替换功能
gsub(/要替换的信息/,"替换成什么",将第几列进行替换)
awk '$2~/Xiaoyu/{gsub(/:/,"$",$NF);print $NF}' oldboy.txt

1.4 awk命令高级功能说明

普通模式:
1、正则表达式作为模式 ^:还可以表示某一列的开始 $:还可以表示某一列的开始
2、比较表达式作为模式
awk 'NR==1{print $NF}' oldboy.txt

3、范围模式:
awk 'NR==1;NR==2' oldboy.txt 只查看第一和第二行

awk 'NR==1,NR==3' oldboy.txt 查看第一到第三行

特殊模式:BEGIN :在处理文件之前先执行的动作
(1)生成文件内容表头信息
awk 'BEGIN{print "姓氏","名称","id号码","捐款记录"}{print $0}' oldboy.txt |column -t

(2)用于在系统中进行运算数值
awk 'BEGIN{print 2+3}'

(3)修改或设置变量信息
a:awk命令中,会直接将字符串信息当成变量
$1: 表示取第一列
$NF:表示取最后一列信息
$: 表示取一行中所有的列
①awk 'BEGIN{oldboy=62;print oldboy}'

将oldboy当成变量
②awk 'BEGIN{oldboy=62;print "oldboy"}'

加上" "取消oldboy的变量
b:awk命令中,变量分类:
自定义变量:oldboy=62
内置变量:
NF : 显示最后一列信息 $(NF-1) 取倒数第2列
NR : 表示行号信息0,取出第几行 NR==2 NR>=2 NR<=2
FS : 指定分隔符信息 -F
①awk -F ":" 'NR==1{print $2}' oldboy.txt

以 :作为分隔符,取第一行第二列

②awk 'BEGIN{FS=":"}NR==1{print $2}' oldboy.txt

③awk -vFS=":" 'NR==1{print $2}' oldboy.txt

END:在处理文件之后再执行的动作
awk 'END{print "总结:这是一个学生登记表"}{print $0}' oldboy.txt|column

1.5 awk统计运算

1、计算空格出现的次数:
awk '/^$/{i=i+1}END{print i}' /etc/services

2、统计/etc/passwd文件中最后一列有/sbin/nologin的出现了多少次
①awk -F ":" '$NF~/nologin$/{i++}END{print i}' /etc/passwd
②awk '/nologin$/{i++}END{print i}' /etc/passwd

i=i+1 = i++ 累加运算:计算文件中一个字符串出现的次数
3、求和运算
seq 10|awk '{i=i+$1}END{print i}'

补充
NF : 显示最后一列信息 $(NF-1) 取倒数第2列
NR : 表示行号信息0,取出第几行 NR==2 NR>=2 NR<=2
FS : 指定分隔符信息 -F
$1: 表示取第一列
$NF:表示取最后一列信息
$: 表示取一行中所有的列
-F : 指定分隔符号信息 ":" "[:/]" "[:/]+"
-v : 设置变量信息

1.6 利用awk取出ip地址

第一步:定位有ip地址的行
ip a s eth0|awk 'NR==3'

第二步:只显示ip地址
ip a s eth0|awk -F "[ /]+" 'NR==3{print $3}' 用-F指定参数的时候,开头的^和空格都属于列
ip a s eth0|awk -F "[^0-9.]+" 'NR==3{print $2}'

在不指定-F参数信息时,
1. 默认将多个连续的空格汇总为整体
2. 默认将一行头部开始空格信息忽略不计
用-F指定参数的时候,开头的^和空格都属于列

原文地址:https://www.cnblogs.com/basa/p/11136365.html