【shell】六 awk命令学习

版权声明:转载请标明出处。 https://blog.csdn.net/u010720408/article/details/90766857

调用awk类似sed
(目前的linux 都是用的gawk,两者现在互相等同了。)
awk中的执行语句,类似C/C++

awk调用三种方式

①在shell命令输入

awk [-F 域分隔符] 'awk 程序段' 输入文件

②awk程序段插入脚本文件,然后通过awk命令调用它

awk -f awk脚本文件 输入文件
#通过-f 调用awk脚本文件

③将awk命令插入脚本文件后,设为可执行,然后执行脚本文件

./awk脚本文件 输入文件

1. awk模式匹配

awk 由 pattern 和 action组成;
pattern模式选择输入行是否执行后续action动作;
action动作可以是包含语句、函数、表达式的执行过程;
awk的pattern支持的正则表示大元字符要比grep、sed广;

#打印空行

awk '/^$/{print "This is a blank line."}' input

在这里插入图片描述

2. awk 记录和域

awk人为输入文件是结构化的,awk将每个输入文件行 定义为记录;
行中每个字符串定义为域,域之间用空格、Tab键或其他符号进行分割;
多个连续空格、多个连续Tab间等当做一个分割域符号处理;

awk 使用 $指定执行的域, $ 后面数字代表取第几个域,下标从1开始,$1取得第一个域的值;

$0代表所有的域;

3. awk 系统变量

变量名 意义
$n 取第n个域的值
$0 取所有域,即整行
ARGC 命令行参数的数量
ARGIND 命令行中当前文件的位置(从0开始标号)
ARGV 命令行参数的数组
CONVFMT 数字转换格式
ENVIRON 环境变量关联数组
ERRNO 最后一个系统错误的描述
FIELDWIDTHS 字段宽度列表,以空格键分割
FILENAME 当前文件名
FNR 浏览文件的记录数
FS 字段分隔符,默认是空格键
IGNORECASE 布尔变量,如果为真,则进行忽略大小写匹配
NF 当前记录中的域数量
NR 当前记录数
OFMT 数字的输出格式
OFS 输出域分隔符,默认是空格键
ORS 输出记录分隔符,默认是换行符
RLENGTH 由match函数所匹配的字符串长度
RS 记录分割符,默认是行换符
RSTART 由match函数所匹配的字符串的低于公车位置
SUBSEP 数组下标分隔符,默认值是\034

4. awk 格式化输出

printf (格式控制符,参数)

修饰符:

修饰符 意义
- 左对齐
width 域的步长
.prec 小数点右边的位数

格式符:

格式符
%c ASCII字符
%d 整数
%e 浮点数,科学计数法
%f 浮点数
%o 八进制数
%s 字符串
%x 十六进制数
awk 'BEGIN {FS=","} {printf("%s\t%d\n",$2,$8)}' sturecord

在这里插入图片描述

#配合修饰符
awk 'BEGIN {FS==" ";print "Name\t\tPhonenumber"} {printf("%-15s\t%s\n",$1,$2)}' sturecord

在这里插入图片描述

5. awk 内置字符串函数

function
gsub(r,s) 在输入文件中用s替换r
gsub(r,s,t) 在t中用s替换r
index(s,t) 返回s中字符串第一个t的位置
length(s)
match(s,t) 测试s是否包换匹配t的字符串
split(r,s,t) 在t上将r分成序列s
sub(r,s,t) 在t上将第一次出现的r替换为s
substr(r,s) 返回字符串r中从s开始的后缀部分
substr(r,s,t) 返回字符串r中从s开始长度为t的后缀部分

6. 向awk脚本文件 传递传输

awk脚本 parameter=value 输入文件
./pass.awk   MAX=3 FS="," inpufilename

注意命令行参数无法被BEGIN字段语句访问

7. awk 中条件语句与循环语句

if (x ~ /[Hh]el?o/) print x

do
  动作
while (天剑表达式)

for (设置计数器初值;测试计数器;计数器变化)
  动作

8. awk 数组 array[index]=value

关联数组

8. awk 实操记录

输入文件为sturecord:(姓名中是空格,后面的都是Tab键)
Li Hao njue 025-83481010
Zhang Ju nju 025-83466534
Wang Bin seu 025-83494883
Zhu Lin njupt 025-83680010

在这里插入图片描述

#awk 打印第一、二列域
awk '{print $1,$2}' sturecord

在这里插入图片描述

#awk 变量指定域号
awk 'begin {one=1;two=2} {print $(one+two)}' sturecord

在这里插入图片描述

#-F 改变分隔符
awk -F "\t" 'print $3' sturecord

在这里插入图片描述

#awk 同样也提供另一个环境变量FS的改变分割符
awk 'BEGIN {FS=","} {print $0}' sturecord
awk 'BEGIN {FS=","} {print $1,$3}' sturecord

#awk 中 ~匹配正则表达式  !~ 不匹配正则表达式
awk 'BEGIN {FS=":"} $1~/root/' /etc/passwd


#if/else else 以及与或运算,用逗号分割,第三列等于10或第四列等于10则打印整行
awk 'BEGIN {FS=","} {if ($3==10 || $4==10) print $0}' /etc/paswd

#awk 统计 空行,类似C/C++ 有x++ ++x的区别
awk '/^$/{print x+=1}' input

猜你喜欢

转载自blog.csdn.net/u010720408/article/details/90766857