awk基本用法
awk 更适合格式化 文本内容,对文本进行复杂的处理
awk 语法
awk [options 可选参数] pattern(模式) {action(动作)} file(文件)
awk常用参数
参数 | 解释 |
---|---|
-F | 指定分割字段符 |
-V | 定义或修改一个awk内部的变量 |
-f | 从脚本文件中读取awk命令 |
awk常用内置变量
内置变量 | 解释 |
---|---|
$n | 指定分隔符后,当前记录的第n个字段(列) |
$0 | 完整的输入记录 |
FS | 输入字段分割符,默认是空格 |
OFS | 输出字段分隔符,默认是空格 |
RS | 输入记录分隔符(输入换行符),指定输入时的换行符 |
ORS | 输出记录分隔符(输出换行符),输出时用指定符号代替换行符 |
NF(Number of fields:字段数) | 分割后,当前行一共有多少个字段 |
NR(Number of records:记录数) | 当前记录数,行数 |
FNR | 各文件分别计数的行号 |
FILENAME | 当前文件名 |
ARGC | ARGC:命令行参数的个数 |
ARGV | ARGV:数组,保存的命令行所给定的各参数 |
自定义输出内容:awk,必须外层单引号,内层双引号。内置变量$1,$2都不得添加双引号,否则会识别为文本。
显示文件第五行
awk "NR==5" pwd.txt
显示文件2到5行
awk "NR==2,NR==5" pwd.txt
显示3到5行并显示行号
awk 'NR==3,NR==5{print NR,$0}' pwd.txt
显示第一行 倒数第二行最后一行
awk -F ":" '{print NR,$1,$(NF-1),$NF}' pwd.txt
取出IP地址信息
ifconfig ens33|awk 'NR==2{print $2}'
awk分隔符
-
输入分隔符 awk默认是空格,空白字符,英文field separate(字段分隔符) ,变量名是FS
-
输出分隔符 output field separate(输出字段分开) ,简称OFS。
FS输入分隔符:awk逐行处理文本的时候,以输入分隔符为准,把文本切成多个片段,默认符号是空格,当我们处理特殊文件,没有空格的时候,可以自由指定分割符特点。如下
awk -F ":" 模式 动作 文件
awk -V FS=":" 模式 动作 文件
OFS输出分隔符:awk执行完命令,默认用空格隔开一列,这个空格就是awk的默认输出符,如下
awk -F ":" -V OFS="-----" 模式 动作 文件
awk变量
内置变量 NR NF FNR
- awk 的内置变量NR NF 是不用添加$符号
- 而 $1,$2 是需要添加符号的。
输出每行行号以及字段总个数
awk '{print NR,$0}' pwd.txt
输出每行行号以及指定的列
awk '{print NR,$1,$5}' pwd.txt
处理多个文件显示行号
# 普通的NR变量,会将多个文件按照顺序排序
awk '{print NR,$0}' pwd.txt if.txt
# 使用FNR变量,可以分别对文件行数计数
awk '{print FNR,$0}' pwd.txt if.txt
RS 变量作用是 输入分隔符,默认是回车符,也就是回车换行符,我们可以自定义 空格 作为 行分隔符,每遇见一个空格,就换行处理
awk -v RS=" " '{print FNR,$0}' pwd.txt
ORS内置变量作用是输出分隔符的意思,awk默认认为,每一行结束了,就得添加回车换行符,ORS变量可以更改输出符
awk -v ORS="@@@" '{print NR,$0}' pwd.txt
内置变量FILENAME
显示正在处理的文件名
awk -F ":" '{print FILENAME,NR,$0}' pwd.txt
awk格式化输出
printf 和print的区别
format(格式)的使用
1.其与print的最大不同是,printf需要指定format
format用于指定后面的每个item(项目)的输出格式
printf语句不会自动打印换行符:\n
format格式的指示符都是以%开头,后跟一个字符如下
%c :显示字符的ASCII码
%d,%i :十进制整数
%e,%E :科学计数法显示数值
%f :显示浮点数
%g,%G :以科学计数法的格式或浮点数的格式显示数值
%s :显示字符串
%u :无符号整数
%% :显示自身
printf修饰符
-:左对齐,默认右对齐
+:显示数值符号
格式化输出
awk -F ":" 'BEGIN{printf "%-25s\t%-25s\t%-25s\t%-25s\t\n","用户名","用户ID","用户家目录","用户解释器"}{printf "%-25s\t%-25s\t%-25s\t%-25s\t\n",$1,$3,$6,$7}' pwd.txt
awk的模式
-
BEGIN 就是处理文本前,先执行BEGIN模式指定的动作
-
awk 'BEGIN{print "我是三剑客"}{print $0}' pwd.txt
-
END 就是处理完所有文本之后,需要执行的动作
awk '{print $0} END{print "三剑客学完啦"}' pwd.txt
关系运算符 | 解释 | 示例 |
---|---|---|
< | 小于 | x<y |
<= | 小于等于 | x<=y |
== | 等于 | x=y |
!= | 不等于 | x!=y |
>= | 大于等于 | x>=y |
> | 大于 | x>y |
~ | 匹配正则 | x~/正则/ |
!~ | 不匹配正则 | x!~/正则/ |
awk使用正则语法
找出文件中有games的行
awk '/^games/{print $0}' pwd.txt
取出IP地址
ifconfig ens33|awk 'NR==2{print $2}'
找出pwd.txt 中禁止登陆的用户
awk '/\/sbin\/nologin/{print NR,$0}' pwd.txt