awk基本用法

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 
posted @ 2020-12-27 17:34  迎风飘扬的蓝色碎花  阅读(737)  评论(0编辑  收藏  举报