AWK是linux中面向行(line)的编程语言,用于文本处理、提取、格式化、运算等各类文本操作
- 命令行awk
=> 最简单用法
-F
-v var=value #在awk中引入外部变量的方法之一
FIRST="aaa";SECOND="bbb"
awk -v fir=$FITST -v sec=$SECOND '{print fir,sec}' somefile
-f filename
代码语言:javascript复制 # 两个基本概念
记录 awk每次处理的一个数据流
域 通过特定字符分割的一个条记录中的不同部分。
- 常用变量
FS (<=> -F) awk -F'-' '{print $1}' a.txt FS="-"
NF $NF 当前记录的总域数
NR, FNR Number of Record
RS (记录分割符)
OFS 输出域分隔符,默认空格
ORS 输出记录分隔符,默认新行
example:
awk -F ' '
awk -F '[ ]'
awk -F '[ ] '
三者有区别么?
解答: 第一个表示 分隔符为,单个或多个空格或者tab
第二个表示一个空格
第三个表示一个或多个空格。
- 模式与行为
BEGIN { actoin } "stdin 以前"
END { action } "read 结束
/regexp/ { actoin } <=> /expression/ { action}
/regexp1/,/regexp2/ { action }
expression { }
expr1, exp2 { }
expr2 && expr2 {}
expr2 || expr2 {}
! expr {}
expr ? : { action }
special pattern
---------------
- awk 中的正则表达式
. 任意单个字符
* 任意多个它前的字符
一个以上它前面的字符
? 一个或者0个它前面的字符
^ 行首
$ 行末
| 或
() 分组
[] [] 枚举成员,任意单个其中的字符
r{m,n} posix标准正则
- 变量,关联数组
使用即定义
var = value
array[key] = value 如果key是字符,应用双引号引起来 arr["tom"]=333
array =
delete array[index]
delete array
3. 操作符,
$ 域标识
(...) 分组
-- 自增,自减
^ ** 乘方
- * / %
&& || ! 与,或,非
? : 三目操作符
|
|& 管道IO
> < <= >= != ==
~ !~ 正则匹配
in 数组成员迭代(测试)
= = -= *= /= %= ^= **=
space : 字符串连接操作符
- 操作符,
$ 域标识
(...) 分组
-- 自增,自减
^ ** 乘方
- * / %
&& || ! 与,或,非
? : 三目操作符
|
|& 管道IO
> < <= >= != ==
~ !~ 正则匹配
in 数组成员迭代(测试)
= = -= *= /= %= ^= **=
space : 字符串连接操作符
- 转意序列
n 换行
t tab
f 浮点数
r 回车
v 垂直制表
xhex digts
ddd
- 控制结构,自定义函数
if (expr) { statement } [ else { statement } ]
while (expr) { statement }
do { statement } while (expr)
for (expr1; expr2; expr3) { statement }
for (var in array) { statement }
break, continue
exit [ expression ]
{ statement }
## confiured as --enable-switch
swith () {
case value|regexp : statement
...
[ default : statement ]
}
function max (a, b) {
reuturn a > b ? a : b
}
- I/O 控制
getline set $0, NR, NF, FNR
getline <file set $0, NF
getline var set var, NR, FNR
getline var <file
command | getline [var]
command |& getline [var] co-process
next
nextfile FILENAME, ARGIND, FNR=1
system()
fflush()
print ...
print ... >file
print ... >>file
print ... | command
print ... |& command
(协进程)
11, 常见函数
代码语言:javascript复制 数学函数: int, rand, sqrt, srand, (exp, log, cos, sin, atan2)
# awk 'BEGIN{srand();r=int(rand()*10);print r}' file srand()产生一个随机数种子,rand()生成0-1之间的一个随机数
字符串函数:
substr
sub 将首个匹配的字符串替换
gsub 将全部匹配的字符串替换
length
index, 返回字串索引
match, 返回匹配RE的位置
split,
x = sprintf ("xxx),
printf, 格式化输出
tolower,
toupper,
strtonum,
gensub, gensub(r,s,h [,t]) 找到t中满足正则r的字符串并用s替换,若h为字母g,全部替换,若为数字几,就像第几个匹配的替换
最后将被修改的整个串返回
asort, 返回数组元素个数
asorti 返回数组元素个数(操作后会将索引变成数字) except that the array indices are used for sorting,not the array
values.when done, the array is indexed numerically,and the values are
those of the original indices.
代码语言:txt复制时间函数:
代码语言:javascript复制 mktime, mktime("YYYY MM DD HH MM SS") 返回这个时间到19700101开始的秒数
strftime, 返回特定格式的时间 如 strftime("%y-%m-%d %H:%M:%S",systime()) 13-05-13 17:46:06
%a 星期几 %I 12小时格式 %p 显示(AM/PM) %Y 四位数的年 %U 一年第几周 %w 十进制表示星期几
%x 重设本地时间
systime 返回以秒为单位的从1970年1月1日0点开始的秒数
代码语言:javascript复制#位操作函数:
lshift, rshift, and, or, xor, compl(补码 bitwise complement)
- 使用环境变量
ENVIRON 是一个数组,如 ENVIRON["HOME"] (查看所有环境变量的命令env 查看所有变量:set,取消变量unset)
PROCINFO 是一个数组,如 PROCINFO["uid"] PROCINFO["ppid"] PROCINFO["pid"] (查看线程:ps)
- 使用额外的awk函数库/脚本库, awk脚本的参数处理。
--source -f
ARGC
ARGV
ARGIND
example:
字符串 'aaabcccaaabbbccc',连续的字母作为一个子字符串,从左往右,去重复后,变为 'aaabcccbbb' , awk或sed实现,不使用管道。