- 记录与字段
awk一次从文件中读取一条记录,并将记录存储在字段变量$0中。记录被分隔为字段比功能存储在$1,$2,...$NF中,(默认使用空格或指标符为分隔符)。内建参数NF为记录的字段数。
#输出demo.txt 文件的第1个,第2个,第3个,第4个字段
awk ‘{print $1,$2,$3,$4}‘ demo.txt
#输出demo.txt 文件整行记录
awk ‘{print $0}‘ demo.txt
#输出demo.txt 该行的字段个数。
awk ‘{print NF}‘ demo.txt
#输出demo.txt 该行的字段个数。
awk ‘{print $NF}‘ demo.txt
- 字段分隔符
awk默认读取数据以空格或指标符为分隔符,但可以通过-F或FS(field separator)变量来改变更个符。
awk -F: ‘{print $1}‘ /etc/passwd
awk ‘BEGIN {FS = ":"} {print $1}‘ /etc/passwdecho ‘hello the:world,!‘ |awk ‘BEGIN{FS="[:, ]"} {print $1,$2,$3,$4}‘
- 内置变量 描述
ARGC 命令行参数个数
FILENAME 当前输入文件的名称
FNR 当前输入文档的当前记录编号,尤其是当有多个输入文档时有用
NR 输入流的当前输入记录编号
NF 当前记录的字段个数
FS 字段分隔符
OFS 输出字段分隔符,默认为空格
ORS 输出记录分隔符,默认我为换行符\n
RS 输入记录分隔符,默认我为换行符\n
cat test1.txt
This is a test file.
Welcome to Jacob‘s Class.cat test2.txt
Hello the world.
Wow, I‘m overwhelmed.
Ask for more.#输出当前文档的当前行号
awk ‘{print FNR}‘ test1.txt test2.txt
#将两个文档当做一个整体的输入流,通过NR输入当前行号
awk ‘{print NR}‘ test1.txt test2.txt
#输出每一行当前的字段数
awk ‘{print NF}‘ test1.txt
#内置变量FS字段分隔符
awk ‘BEGIN{FS="[:]"} {print $1}‘ /etc/passwd
#输出字段伏案分隔符
awk ‘BEGIN{OFS="-"}{print $1,$2,$3}‘ test1.txt
cat test.txt
name=lianjie
age=26
Tel=18219995524name=ccc
age=20
Tel=13899246656name=alex
age=25
Tel=19812345623awk ‘BEGIN{FS="\n";RS=""}{print $1,$2,$3,$4}‘ test.txt
name=lianjie age=26 Tel=18219995524
name=ccc age=20 Tel=13899246656
name=alex age=25 Tel=19812345623awk ‘BEGIN{FS="\n";RS=""}{print $1}‘ test.txt
- 表达式与操作符
操作符
+ 加
- 减
* 乘
/ 除
% 求余
^ 幂运算
++ 自增1
-- 自减1
+= (x+=9等价于x=x+9)
-= (x-=9等价于x=x-9)
*= (x*=9等价于x=x*9)
/= (x/=9等价于x=x/9)
> 大于
< 小于
>= 大于等于
<= 小于等于
!= 不等于
~ 匹配
!~ 不配
&& 与
|| 或
echo ‘test‘ | awk ‘x=2 {print x+3}‘
echo ‘test‘ | awk ‘x=2,y=3 {print x*3,y*3}‘
awk ‘/^$/ {print x+=1}‘ test.txt #统计所有的空白行
awk ‘/^$/ {x+=1}END{print x}‘ test.txt #打印总空白行的行个数
awk -F: ‘$1~/root/ {print $7}‘ /etc/passwd
awk -F: ‘$3>500 {print $1}‘ /etc/passwd
awk指令操作详解