目录
1、awk
作用:具有强大的文本格式化的处理能力,也是一种编程语言,支持条件判断、数组、循环、运算等功能;awk早期在Unix实现,Linux使用的awk实际是gawk(GUN awk)。
语法: awk [options] 'pattern{action}' file...
- options:可选参数
- pattern:模式/条件
- action:动作,最常使用的是:print 与 printf
1.1、awk参数
参数 | 作用 |
-F | 指定分隔符 |
-v | 定义或修改一个awk内部变量 |
-f | 从脚本文件中读取awk命令 |
1.2、awk变量
变量类型:
- 内置变量
- 自定义变量
内置变量 | 作用 |
FS | 输入字段分隔符,默认为空白字符 |
OFS | 输出字段分隔符,默认为空白字符 |
RS | 输入记录分隔符,指定输入时的换行符 |
ORS | 输出记录分隔符,指定输出时的换行符 |
NF | 当前行的字段的个数(即当前的行按照指定分隔符或默认分隔符,分割成了几列),字段数量,对应英文:number of Field |
NR | 行号,当前处理文本行的行号 |
FNR | 各个文件分别计数的行号,针对多个文件使用 |
FILENAME | 当前处理的文件的文件名 |
ARGC | 命令行参数的个数 |
ARGV | 数组,存储命令行所给定的每个参数 |
1.3、awk分割符
说明:awk默认以空格为分割符,多个空格也识别为一个空格,作为分隔符;awk是按行处理文件,根据用户指定的分隔符去工作,没有就使用默认分割符空格。
- $n:指定分割符后,当前记录的第n个字段
- $0:完整的输入记录,表示当前行的全部数据
注意事项:awk 外层必须是单引号,内层使用双引号,使用双引号的括起来的内容会识别为文本(字符串)
1.3.1、FS
- 作用:输入字段分隔符,默认为空白字符
示例:指定输入分隔符#,输出第1列和第3列的内容
- 命令:awk -F '#' '{print $1,$3}' student_table 或 awk -v FS='#' '{print $1,$3}' student_table
1.3.2、OFS
- 作用:输出字段分隔符,默认为空白字符
- awk 执行完成命令,默认以空格作为输出符,对输出内容进行分隔。
- 使用OFS指定输出分隔符,必须要和-v参数选项结合使用
示例:指定输出分割符#,输出第1列和第3列的内容
- 命令:awk -v OFS='#' '{print $1, $3}' student_table
1.3.3、RS
- 作用:输入记录分隔符,指定输入时的换行符,默认是回车换行符。
- 可以自定义指定的输入换行符
示例:指定使用#作为文件内容的输入换行符,并输出对应的行号
- 命令:awk -v RS='#' '{print NR, $0}' student_table
1.3.4、ORS
- 作用:输出记录分隔符,指定输出时的换行符,默认以回车符作为换行符,即每行的结束使用回车符作为换行符。
- 可以自定义输出换行符。
示例:指定使用&作为输出内容的换行符,输出第1列和第3列的内容
- 命令:awk -F '#' -v ORS='&' '{print $1.$3}' student_table
1.3.5、NF
- 作用:当前行的字段的个数(即当前的行按照指定分隔符或默认分隔符,分割成了几列),字段数量
- 注意事项:NF作为一个常量表示当前行被指定字符分割后的总字段数,使用$NF,表示取最后一列的内容,$(NF-1),表示取倒数第二列的内容
示例:打印文件student_tabl当前行字段以#分割符分割后的总数,并取出文件的最后一列和倒数第二列
- 命令:awk -F '#' '{print NF, $NF, $(NF-1)}' student_table
1.3.6、NR
- 作用:行号,当前处理文本行的行号
- 注意:NR是一个常量,如果和$使用就表示的取的第NR行的第NR个字符
示例如下:
示例1:取文件第二行到第六行的内容
- 命令:awk ’NR==2,NR==6{print NR, $0}‘ student_table 或 awk 'NR>=2{print NR, $0}' student_table
1.3.7、FNR
- 作用:各个文件分别计数的行号,针对多个文件使用
- 注意:如果只是用NR,输出结果会将多个文件按照顺序排列
示例:将文件student_table和student_table2分别按照各自文件的行号展示
- 命令:awk '{print FNR,$0}' student_table student_table2
1.3.8、FILENAME
- 作用:当前处理的文件的文件名
- 注意:使用该参数显示的是当前处理行的文件名
示例:显示当前行所属的文件名,行号,对应行的内容
- 命令:awk '{pirnt FILENAME, FNR, $0}' student_table student_table2
1.3.9、ARGC与ARGV
- ARGC:命令行参数的个数
- ARGV:数组类型,存储命令行所给定的每个参数
示例:打印当前awk命令的参数以及对应的每个参数 ,并对显示结果做去重展示。
- 命令:awk -F '#' '{print ARGC, ARGV[0],ARGV[1],ARGV[2]}' student_table student_table2 | uniq -d
1.4、自定义变量
方式一:使用-v 参数选项指定
示例:定义变量name,并使用awk输出name的内容
- 命令:awk -v name='Tom' '{print "My name is " name}' student_table
方式二:直接内部定义
示例:定义变量name,并使用awk输出name的内容
- 命令:awk 'name="Tom"{print "My name is " name}' student_table 或 awk 'BEGIN{name="Tom"}{print "My name is " name}' student_table
方式三:引用全局变量
示例:定义全局变量name,并使用awk输出name的内容
- 命令:
- name="Tom"
- awk -v name=$name '{print "My name is " name}' student_table
1.5、printf格式化输出
作用:用于对文件进行格式化输出,美化格式。
1、print与printf的区别
- 使用printf需要指定format格式
- format用于指定后面每个item的输出格式
- printf不会自动打印换行符:\n
2、format格式
注意:format格式的指示符都以%开头,后面跟一个字符
- %s:显示字符串
- %c:显示字符的ASCII码
- %d、%i:显示十进制整数
- %e、%E:显示数值的科学计数法形式
- %f:显示浮点数
- %u:显示无符号整数
3、printf修饰符
- -:左对齐,默认右对齐
- +:显示数值符号;如:printf “%+d” 20 ,打印结果为:+20