Linux awk 命令
- 1. 定义
- 2. 例子及说明
- 2.1 awk -F":" '{ print $1 }' test //打印第一个字段
- 2.2 awk '{if(NR>=1 && NR<=4) print $0}' test //打印符合条件的整行
- 2.3 awk -F '[ ,]+' '{print $4" "$8}' test //打印指定字段
- 2.4 awk 'BEGIN {count=0;print "[start] line count is ",count} \
- 2.5 awk 'BEGIN{a=1;b=2;print (a>2&&b>1,a=1||b>1)}'
- 2.6 awk 'BEGIN{a=11;if(a>=9){print "ok"}}'
- 2.7 awk -F ":" 'NF==8{print $0}' test
- 2.8 awk -F: '$3>=500 && $3<=60000{print $0}' /etc/passwd
- 2.9 awk '{print NF}' test
- 待续……
linux中最为常用的三大文本(grep,sed,awk)处理工具
Linux sed 命令
https://blog.csdn.net/lqy971966/article/details/107006904
Linux grep 命令
https://blog.csdn.net/lqy971966/article/details/106927370
Linux awk 命令
https://blog.csdn.net/lqy971966/article/details/107019195
1. 定义
-
awk 其名称得自于它的创始人 Alfred Aho 、Peter Weinberger 和 Brian Kernighan 姓氏的首个字母。实际上 AWK 的确拥有自己的语言:AWK 程序设计语言,三位创建者已将它正式定义为“样式扫描和处理语言”。
-
awk 也是常用的文本处理工具之一。
对文本每一行进行指定规则处理并输出。
1.1 man awk //man 的解释
mawk - pattern scanning and text processing language
模式扫描与文本处理语言
1.2 功能
awk 对文件的每一行进行指定规则的处理(查看)或者信息提取。
1.2.1 特点
- awk是行处理器
- 依次对每一行进行处理,然后输出
- 将一行分成数个字段来处理
作为linux中最为常用的三大文本(awk,sed,grep)处理工具之一
awk 是三剑客的老大
1.3 awk 工作原理
与sed一样, 均是一行一行的读取、处理
sed 作用于一整行的处理,
而 awk 将一行分成数个字段来处理
1.3.1 优点
在处理庞大文件时不会出现内存溢出或是处理缓慢的问题,通常用来格式化文本信息
1.4 语法
awk [选项] ‘[条件]{编辑指令}’ filename
如:awk -F 分隔符 ‘/模式/{动作}’ 输入文件
1.4.1 常用命令选项
-
-F:指定分隔符,可省略(默认空格或者Tab位)
-F fs or --field-separator fs
指定输入文件折分隔符,fs是一个字符串或者是一个正则表达式,如-F:。
-F相当于内置变量FS, 指定分割字符注意 这里分隔符以下三种情况均可正常使用
awk -F “:” = awk -F: = awk -F : -
-f:调用awk脚本尽心个处理
-f scripfile or --file scriptfile
从脚本文件中读取awk命令。 -
-V:调用外部shell变量
-v var=value or --asign var=value
赋值一个用户定义变量。
1.4.2 内置变量
变量 用途
FS 保存或设置字段分隔符,如FS=":"
$n 指定分隔的第n个字段,例如$1,$4分别表示第1个字段,第4个字段
$0 当前读入的整行文本内容
NF 记录当前处理行的字段个数(有多少列)
FNR 记录当前处理行在原文本内的行号
NR 记录当前已经读入行的数量(多少行)
FILENAME 当前处理的文件名
ENVIRON 调用shell环境变量,格式:ENVIRON[“变量名”]
1.4.3 语法规则-单引号,花括号,分号
awk -F 分隔符 ‘/模式/{动作}’ 输入文件
指令=模式+动作 即: ‘/模式/{动作}’
awk的指令一定要用单引号括起
awk的动作一定要用花括号括起
模式可以是正则表达式、条件表达式或两种组合
如果模式是正则表达式要用/定界符
多个动作之间用;号分开
1.4.4 BEGIN 和 END
-
BEGIN
在许多编程情况中,可能需要在 awk 开始处理输入文件中的文本之前执行初始化代码。
对于这种情况, awk 允许您定义一个 BEGIN 块。
它是初始化 FS(字段分隔符)变量、打印页眉或初始化其它在程序中以后会引用的全局变量的极佳位置。 -
END
awk 还提供了另一个特殊块,叫作 END 块。
awk 在处理了输入文件中的所有行之后执行这个块。
通常, END 块用于执行最终计算或打印应该出现在输出流结尾的摘要信息。
2. 例子及说明
以下所有的例子都是以下下面的test 进行测试说明
root@ubuntu/home/awkTest# cat test
hello:world:hello:hani
hello:world:hello:hani
hani:is:a:good:man:hani:is:handsome
this:is:the:test:script:of:awk:test
linux:awk:test
123456789
/aaa/bbb/ccc/ddd/eee/fff
I name is hani, i am a engineer.
2.1 awk -F":" ‘{ print $1 }’ test //打印第一个字段
-F:指定分隔符
$n 指定分隔的第n个字段
root@ubuntu/home/awkTest# awk -F":" '{ print $1 }' test
hello
hello
hani
this
linux
123456789
/aaa/bbb/ccc/ddd/eee/fff
I name is hani, i am a engineer.
2.2 awk ‘{if(NR>=1 && NR<=4) print $0}’ test //打印符合条件的整行
NR 记录当前已经读入行的数量
$0 当前读入的整行文本内容
root@ubuntu/home/awkTest# awk '{if(NR>=1 && NR<=4) print $0}' test
hello:world:hello:hani
hello:world:hello:hani
hani:is:a:good:man:hani:is:handsome
this:is:the:test:script:of:awk:test
2.3 awk -F ‘[ ,]+’ ‘{print $4" "$8}’ test //打印指定字段
一个或多个空格或逗号分隔开
root@ubuntu/home/awkTest# awk -F '[ ,]+' '{print $4" "$8}' test
……空行
hani engineer.
2.4 awk 'BEGIN {count=0;print "[start] line count is ",count} \
{count=count+1;print $0} \
END{print "[end] line count is ",count}' test
root@ubuntu/home/awkTest# awk 'BEGIN {count=0;print "[start] line count is ",count} \
{count=count+1;print $0} \
END{print "[end] line count is ",count}' test
[start] line count is 0
hello:world:hello:hani
hello:world:hello:hani
hani:is:a:good:man:hani:is:handsome
this:is:the:test:script:of:awk:test
linux:awk:test
123456789
/aaa/bbb/ccc/ddd/eee/fff
I name is hani, i am a engineer.
[end] line count is 8
count是自定义变量。之前的action{}里都是只有一个print,其实print只是一个语句,
而 action{}可以有多个语句,以;号隔开。
一共8行
2.5 awk ‘BEGIN{a=1;b=2;print (a>2&&b>1,a=1||b>1)}’
关系运算符+逻辑运算符
root@ubuntu/home/awkTest# awk 'BEGIN{a=1;b=2;print (a>2&&b>1,a=1||b>1)}'
0 1
2.6 awk ‘BEGIN{a=11;if(a>=9){print “ok”}}’
关系运算符
root@ubuntu/home/awkTest# awk 'BEGIN{a=11;if(a>=9){print "ok"}}'
ok
2.7 awk -F “:” ‘NF==8{print $0}’ test
NF 记录当前处理行的字段个数(有多少列)
root@ubuntu/home/awkTest# awk -F ":" 'NF==8{print $0}' test
hani:is:a:good:man:hani:is:handsome
this:is:the:test:script:of:awk:test
2.8 awk -F: ‘$3>=500 && $3<=60000{print $0}’ /etc/passwd
root@ubuntu/home/awkTest# awk -F: '$3>=500 && $3<=60000{print $0}' /etc/passwd
dlp:x:1000:1000:ubuntu dlp/a1,,,:/home/dlp:/bin/bash
2.9 awk ‘{print NF}’ test
root@ubuntu/home/awkTest# awk '{print NF}' test
1
1
1
1
1
1
1
8
待续……
awk太多 后面再添加