awk支持所有的正则表达式元字符,并且还支持?,+这两个扩展元字符,而grep,sed不支持
文章目录
awk工作模式
将文本一行一行读入模式空间,每一行称作一条记录records,每条记录按特定的分割符号分开,每个部分称作一个域fields,域用$调用
awk语法
awk option 'pattern{action}' 文件 文件 #option选项,pattern模式,action动作,由模式的真假决定动作是否执行
awk的模式
BEGIN 表示开始之前
END 表示结束之前
$0 打印全部域(整行)
$1 打印第一个域
$2 打印第二个域
$3 ......
$NF 打印记录的最后一个域
$后面还可以跟变量或表达式,注意awk引用内部变量不需要$符号,这里的$是打印域的意思
awk -F: 'BEGIN{one=1;two=2} {print $one,$(one+two)}' /etc/passwd #打印第一个域,和第三个域
awk选项及其意义
写法 意义 举例
-F 指定输入分割符号,默认是空格和TAB, -F:
-f 调用awk脚本 awk -f awk.sh /etc/passwd
-v 指定自定义变量
awk的内键变量及其意义(内键变量都是大写的)
FS 指定输入分割符,跟-F一样 awk 'BEGIN{FS=":"} {print $1}' /etc/passwd
OFS 指定输出分割符,默认是空格 awk -F: 'BEGIN{OFS="\t"}{print $1,$3}' /etc/passwd
NR 当前记录数(行号)
FNR 浏览文件记录数(总共有多少行)
NF 当前记录中的域数量
$NF 打印记录的最后一个域
RS 输入记录分隔符,默认是换行符 awk 'BEGIN{RS=":"}{print $1}' /etc/passwd
ORS 输出记录分隔符,默认是换行符
FILENAME 打印当前文件名
awk的关系运算符及其意义
<
>
<=
>=
== 等于
!= 不等于
~ 匹配正则表达式
!~ 不匹配正则表达式
awk布尔运算
&&逻辑与,||逻辑或,!逻辑非
awk算数运算符及其意义
+,-,*,/,%求余,^乘方,++x,x++
awk的格式化输出:printf
运算符 意义
%c ASCII字符
%d 整数型
%e 浮点数,科学计数法
%f 浮点数
%o 八进制数
%s 字符串
%x 十六进制数
修饰符 意义
- 左对齐(不指定就是右对齐)
width 域的宽度(步长)
.prec 小数点后边的位数
%-.3f 表示左对齐,小数点后面保留3个数字
awk -F: '{printf "%-5.2s\n",$3}' /etc/passwd
awk -F: '{printf "%s\t%s\n",$3,$4}' /etc/passwd
awk条件语句和循环语句:条件表达式可以包含算数,关系,和布尔操作符
if (条件表达式)
{print $2}
else
{print $3}
if (x ~ /root/){print $0}
if (x ~ /root/){print $0}else{print $1}
循环语句有三种while ,do while ,for
while (条件表达式){print $2}
do
{print $2}
while
for (设置计数器初始值;测试计数器;计数器变化){动作}
for (i in b){动作}
awk数组
基本格式:array[index]=value
awk怎么调用shell中的变量
a=15
awk -v a=$a '{print a}' /etc/passwd
实例:
awk -F: '{print $(NF-1)}' /etc/passwd #打印每条记录的倒数第二个域
awk -F: '{a=NF-1;print a}' /etc/passwd #打印每条记录的倒数第二个域
awk -F: '{print $1"="$2}' /etc/passwd #打印第一个域和第二个域,中间用=分开
awk -F: 'NR==3{print $0}' /etc/passwd #打印第三行
awk -F: 'NR>1&&NR<4{print $0}' /etc/passwd #打印第二到三行
awk -F: 'NR==3{print $0}NF>4{print $2}' /etc/passwd #打印第三行和大于第四行的第二个域
awk '{print $0,$1+$2+$3,($2+$3)/2}' ./suxue #计算
awk '{a+=$2}END{print a}' ./suxue #将所有的第二个域相加,得到最后的和
awk -F: '{if($3>800){print $0}}' /etc/passwd #打印第三个域大于800的行 (if判断)
awk -F: '{if($1=="root"){print $0}else{$1="root";print $0}}' /etc/passwd
awk -F: '{for(i=1;i<=NF;i++){print $i}}' /etc/passwd #让每一个域都占一行(for循环)
awk '/^r/{print $0}' /etc/passwd #匹配正则表达式,以r开头的行
如果文章对你有帮助,欢迎点击上方按钮打赏作者
暂无评论