三剑客
awk是一种编程语言,主要用于在linux/unix下对文本和数据进行处理,是linux/unix下的一个工具。数据可以来自标准输入、一个或多个文件,或其它命令的输出。
awk的处理文本和数据的方式:逐行扫描文件,默认从第一行到最后一行,寻找匹配的特定模式的行,并在这些行上进行你想要的操作
awk的语法:
awk [options] 'commands(地址定位)' file(s)
options 部分
-F 定义字段分割符号,默认的分隔符是空格
-v 定义变量并赋值
command 部分:
'范围说明或正则表达式或者{awk命令语句1;awk命令语句2;...}'
'BEGIN{} {} END{}'
行处理前 行处理 行处理后
1、范围说明部分可以是BEGIN、END、逻辑表达式或者为空
2、awk命令语句间用分号间隔
3、引用shell变量需用双引号引起
awk的工作原理:
# awk -F: '{print $1,$3}' /etc/passwd
(1)awk使用一行作为输入,并将这一行赋给内部变量$0,每一行也可称为一个记录,以换行符(RS)结束
(2)然后,行被:(默认为空格或制表符)分解成字段(或域),每个字段存储在已编号的变量中,从$1开始。
(3)awk如何知道用空格来分隔字段的呢? 因为有一个内部变量FS来确定字段分隔符。初始时,FS赋为空格
(4)awk打印字段时,将以设置的方法使用print函数打印,awk在打印的字段间加上空格,因为$1,$3之间
有一个逗号。逗号比较特殊,它映射为另一个内部变量,称为输出字段分隔符OFS,OFS默认为空格
(5)awk输出之后,将从文件中获取另一行,并将其存储在$0中,覆盖原来的内容,然后将新的字符串分隔
成字段并进行处理。该过程将持续到所有行处理完毕
awk的基本应用:
$0 :表示当前所有记录
$1,$2,$3...$n:awk中用该顺序形式表示files中每行以间隔符号分割的各列的不同字段
注:
awk默认以空格符为间隔符号将每行分割为单独的字段,也可以使用awk内置变量FS定义间隔符号
awk -F: ''
awk 'BEGIN{FS=":"}'
NF 表示当前记录的字段数(列数)
$NF 最后一列
$(NF-1) 倒数第二列
FNR/NR 行号
FILENAME 文件名
"\t" 制表符
"\n" 换行符
"" 打印字符串
FS 定义间隔符
OFS 定义输出字段分隔符
RS 输入记录分割符,默认换行
ORS 输出记录分割符,默认换行
print 打印函数
一:
创建一个文件1.txt
my first language:Java
second languange:python
third language:C
用法:
1、awk '{print $0}' 1.txt 表示print表示打印, $0 表示整个记录,1.txt表示一个文件,所以此条指令的结果就是把这整个文件打印出来
结果:
my first language:Java
second languange:python
third language:C
2、awk '{print $1}' 1.txt 表示:打印文本的第一列
结果:
my
second
third
3、awk -F ':' '{print $2}' 1.txt 表示以":"为分隔符,打印第2列 -F表示指定分割符,也可以是要查询的文本中的其他分割符。
结果:
Java
python
c
4、awk -F ':' '$2=="Java"{print $2}' 表示以":"为分隔符,限制在":"分隔符的第二列为Java的那一项
结果:
Java
5、awk -F ':' 'NR % 2 ==1 {print $2}' 1.txt 表示:打印奇数行的第二个字段 NR是一个内置的变量,表示当前正在处理的记录,即当前的记录是第几个记录。
结果:
Java
c
6、awk '{if(NR >1) print $2}' 1.txt 表示打印第二个及其以后的记录,上面的字段分隔符是空格了,并且 if 语句是在“{}” 里指定的。
结果:
languange:python
language:C
7、awk '{if($1 < "s") print $1; else print $2}' 1.txt 表示:如果第一个字段大于“s",则打印第一个字段,否则打印第二个字段。
结果:
my
languange:python
language:C
8、awk提供了一些内置函数来供我们使用,以下常用的函数如下:
tolower():字符转为小写。
toupper():字符转为大写
length():返回字符串长度。
substr():返回子字符串。
sqrt():平方根。