awk命令

1. 格式

awk 选项 ‘匹配规则{执行命令}’ file_name
例如: awk -F: '/^$/{print “blank lines”} test.txt

选项含义
-F fs指定分隔符
-f file指定执行的脚本文件
-v var=val在执行处理过程之前,设置一个变量 var,并给其设备初始值为 val(多个-v可生成多个变量)。
–dump-variables=file将全局变量输入到文件中去, 默认文件名为awkvars.out
–lint检查代码(不知道有啥用…)
–posix打开检查POSIX兼容性, 所有扩展功能会关闭
–profile=file将命令写入文件,默认为awkprof.out
–version展示版本信息
2. 数据变量:
选项含义
$0整行
$n第n个数据字段
ARGC命令行输入参数的个数
ARGV命令行输入参数数组
CONVFMT数字转化为字符串的格式%.6g
OFMT数字输出的格式,默认%.6g
ENVIRON环境变量数组
FILENAME当前文件名称
FS字段间分隔符,默认为空格
NFnumber of fields(当前行的字段数)
NRnumber of records(已读入的行数)
FNR当前文件已读入的行数, 处理多个文件时有用
OFS输出字段间的分隔符,默认空格
ORS输出行间分隔符, 默认换行符
RS输入记录的分割符, 默认为换行符
RLENGTHmatch函数匹配的字符串的长度
RSTART此变量表示由 match 函数匹配的字符串的第一个字符的位置
SUBSEP多维数组下标间的分隔符, 默认’\034’, 有用!
FIELDWIDTHS一组空格分割的数字, 将文本按数字对应长度输出, 忽略fs的作用
IGNORECASE设置为非0时, 匹配会忽略大小写, 默认为0
3. 操作符

“+ - * / ^ %” : 5种基本运算;
“++ --”: 自增自减
"= ,+=, -=,… ": 赋值操作
“== !=, >, <, >=, <=”: 比较操作符
“&& || !”: 逻辑运算符
“expression ? statement1 : statement2”: 三元运算符
“+a, -a”: 一元运算符, 表示乘以1或-1
“^ * *”: 指数运算符
" ": 通过空格或双引号可以字符串连接
in: 可以访问数组成员;
~和!~: 用于匹配或不匹配awk '$0 !~ 9' marks.txt

4. 正则表达式

和通用正则表达式类似

5. 数组

awk数组比较灵活, 索引可以是数字或字符串, 不需要提前声明;
多维数组可以用一维数组模拟: 比如 a["0,0"] = 100
删除数组操作: delete a[0]

6. if - else

格式为: if (condition) {action1;action2};else if(condition2) action3;else action4 注意中间用分号分割;

7. 循环
7.1 for

格式: for(i =0 ; i <5 ; i ++) action
awk 'BEGIN { for (i = 1; i <= 5; ++i) print i }'
awk 'BEGIN{for (i in a) print i, a[i]}'

7.2 while, do-while

格式: while(condition) action; do action while (condition)

awk 'BEGIN {i = 1; while (i < 6) { print i; ++i } }'
awk 'BEGIN {i = 1; do { print i; ++i } while (i < 6) }'
7.3 break, continue, exit(n)
3. 关键字

BEGIN和END关键字: 分别在读取文件前和读取文件后执行;

$ awk 'BEGIN{print "aaa"} /0210000b27d45d19f3885e62e/ {print $0} END{print "bbb"}' test.txt 
aaa
1586846340 0210000b27d45d19f3885e62e 200
1586846340 0210000b27d45d19f3885e62e 100
bbb
4. 内置函数
4.1 数学函数:

int(), rand(), cos()等

4.2 字符串函数:

(1) asort(array, d), asort(array, d)
asort 对数组value排序, 然后索引会变为0, 1,2 …等整数, 原索引丢失;
asorti对数组index排序, index排序后变为value, 原value丢失, 索引变为0,1,2等;
d参数: 复制后再排序, 不改变原数组;
(2)gsub(rex, sub, str), index(str, sub), sub(), match(str, rex), sub(rex, sub, str)
gsub将匹配rex的内容替换为sub, 全局替换;
index 返回匹配sub的第一个字符的索引, 匹配失败返回0, 字符串索引从1开始;
match 返回匹配rex的第一个位置, 匹配失败返回0;
sub 同gsub, 只替换匹配到的第一个
(3) split(str, array, rex), sprintf(str, format-list)
split使用rex分割字符串,然后将分割的结果保存在array中;
sprintf 使用format-list对str格式化, 然后返回格式化后的字符串;
(4) strtonum(str)
将字符串转为数字, 如果以0开头, 当八进制处理, 如果以0x开头, 以十六进制处理;
(5) substr(str, start, l)
返回字符串的子串
(6) tolower(), toupper()
(7)length: awk 'length($0) > 18' marks.txt

4.3 时间函数

(1) systime() 返回时间戳;
(2) mktime(YYYY MM DD HH MM SS) 字符串转为时间戳;
(3) strftime(format , timestamp) 时间戳转字符串;

4.4 其他函数

(1) systime(str) 执行命令并返回执行码;
(2) 位操作, close, exit等
(3) getline 读入下一行;
(4) next: 停止处理, 进入下一行的处理;
(5) 停止当前文件的处理, 开始下一个文件的处理;
(6) return 用于自定义函数的返回值;

5. 自定义函数
function function_name(argument1, argument2, ...)
{
    function body
}
6. 重定向

和shell相似 支持 > , >>, 和管道符

awk 'BEGIN { print "hello, world !!!" | "tr [a-z] [A-Z]" }'
echo "Old data" > /tmp/message.txt 
7. 使用注意:

1. 在 awk 程序执行时,如果没有指定执行命令,则默认会把匹配的行输出;如果不指定匹配规则,则默认匹配文本中所有的行。
2. 多个命令之间用分号分割, 从文件读取命令不需要分号,只要每行1个命令即可;

[root@localhost ~]# cat awk.sh
{print $1 "'s home directory is " $6}
[root@localhost ~]# awk -F: -f awk.sh /etc/passwd
root's home directory is /root
bin's home directory is /bin
daemon's home directory is /sbin
adm's home directory is /var/adm
lp's home directory is /var/spool/lpd

3. awk命令中使用变量不需要提前申明
awk '/a/{++cnt} END {print "Count = ", cnt}' marks.txt

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值