关于linux:每天一个-Linux-命令4awk

31次阅读

共计 3239 个字符,预计需要花费 9 分钟才能阅读完成。

举荐: 每天一个 Linux 命令(3):sed

命令简介

Awk  pattern scanning and processing language,对文本和数据进行解决。

awk 是一种编程语言,用于在 linux/unix 下对文本和数据进行解决。数据能够来自规范输 (stdin)、一个或多个文件,或其它命令的输入。它在命令行中应用,但更多是作为脚本来应用。awk 有很多内建的性能,比方数组、函数等,这是它和 C 语言的相同之处,灵活性是 awk 最大的劣势。

语法格局

awk [options] 'scripts' var=value filename

罕用参数

-F 指定分隔符(能够是字符串或正则表达式)-f 从脚本文件中读取 awk 命令
-v var=value 赋值变量,将内部变量传递给 awk

脚本根本构造

awk 'BEGIN{print"start"} pattern{commands} END{print"end"}' filename

一个 awk 脚本通常由 BEGIN 语句 + 模式匹配 +END 语句三局部组成, 这三局部都是可选项.

工作原理:

  • 第一步执行 BEGIN 语句
  • 第二步从文件或规范输出读取一行,而后再执行 pattern 语句,逐行扫描文件到文件全副被读取
  • 第三步执行 END 语句

实例展现:

echo "hello" | awk 'BEGIN{print"welcome"} END{print"2017-08-08"}'
welcome
2017-08-08
echo -e "hello" | awk 'BEGIN{print"welcome"} {print} END{print"2017-08-08"}'
welcome
hello
2017-08-08
#不加 print 参数时默认只打印以后的行
echo|awk '{a="hello"; b="nihao"; c="mingongge"; print a,b,c;}'
hello nihao mingongge
#应用 print 以逗号分隔时,打印则是以空格分界
echo|awk '{a="mgg"; b="mingg"; c="mingongge"; print a" is "b" or "c;}'
mgg is mingg or mingongge
#awk 的 print 语句中双引号其实就是个拼接作用

Awk 的变量

内置变量

$0   #以后记录
$1~$n #以后记录的第 N 个字段
FS   #输出字段分隔符(- F 雷同作用)默认空格
RS   #输出记录宰割符,默认换行符
NF   #字段个数就是列 
NR   #记录数,就是行号,默认从 1 开始
OFS  #输入字段分隔符,默认空格
ORS  #输入记录宰割符,默认换行符 

内部变量

[mingongge@ ~]#a=100
[mingongge@ ~]#b=100
[mingongge@ ~]#echo |awk '{print v1*v2}' v1=$a v2=$b
10000

Awk 运算与判断

算术运算符

+ - 加减
* / & 乘 除 求余
^ *  求幂
++ -- 减少或缩小,作为前缀或后缀
[mingongge@ ~]#awk 'BEGIN{a="b";print a,a++,a--,++a;}'
b 0 1 1
[mingongge@ ~]#awk 'BEGIN{a="0";print a,a++,a--,++a;}'
0 0 1 1
[mingongge@ ~]#awk 'BEGIN{a="0";print a,a++,--a,++a;}'
0 0 0 1
#和其它编程语言一样,所有用作算术运算符进行操作,操作数主动转为数值,所有非数值都变为 0

赋值运算符

= += -= *= /= %= ^= **=

正则运算符

~ !~  匹配正则表达式 / 不匹配正则表达式

逻辑运算符

||  &&  逻辑或  逻辑与

关系运算符

< <= > >= != = 

其它运算符

$   字段援用 
空格 字符串链接符
?:   三目运算符
ln   数组中是否存在某键值

Awk 正则

^    行首定位符
$    行尾定位符
.    匹配任意单个字符
*    匹配 0 个或多个前导字符(包含回车)+    匹配 1 个或多个前导字符
?    匹配 0 个或 1 个前导字符 
[]   匹配指定字符组内的任意一个字符 /^[ab]
[^]  匹配不在指定字符组内的任意一个字符
()   子表达式
|    或者
    本义符
~,!~ 匹配或不匹配的条件语句
x{m} x 字符反复 m 次
x{m,} x 字符至多反复 m 次
X{m,n} x 字符至多反复 m 次但不起过 n 次(需指定参数 -posix 或 --re-interval)

Awk 实例介绍

awk –F :‘{print $2}’datafile
#以: 分隔打印第二列
awk –F :‘/^Dan/{print $2}’datafile
#以: 分隔打印以 Dan 结尾行的第二列内容
awk –F :‘/^[CE]/{print $1}’datafile 
#打印以 C 或 E 结尾行的第一列
awk –F :‘{if(length($1) == 4) print $1}’datafile 
#打印以: 分隔且长度为 4 字符的第一列内容
awk –F :‘/[916]/{print $1}’datafile
#匹配 916 的行以: 分隔打印第一列
awk -F : '/^Vinh/{print"a"$5}' 2.txt
#显示以 Dan 结尾行并在第五列前加上 a
awk –F :‘{print $2”,”$1}’datafile
#打印第二列第一列并以, 分隔
awk -F : '($5 == 68900) {print $1}' 2.txt
#以: 分隔打印第五列是 68900 的行第一列 
awk -F : '{if(length($1) == 11) print $1}' 2.txt
#打印以: 分隔且长度为 4 字符的第一列内容
awk -F : '$1~/Tommy Savage/ {print $5}' 2.txt
awk -F : '($1 =="Tommy Savage") {print $5}' 2.txt
#打印以: 分隔且第一列为 Tommy Savage 的第五列内容
ll |awk 'BEGIN {size=0;} {size=size+$5;} END{print"[end]size is ",size}'
#统计目录个的文件所有的字节数
awk 'BEGIN{size=0;} {size=size+$5;} END{print"[end]size is ",size/1024/1024,"M"}' 
#以 M 为单位显示目录下的所有字节数
awk 'BEGIN{a=10;a+=10;print a}'
20 
#a+10 等价于 a=a+10
echo|awk 'BEGIN{a="100testaaa"}a~/test/{print"ok"}' 
#正则匹配 a 是否有 test 字符,成立打印 ok
awk 'BEGIN{a="b";print a=="b"?"ok":"err"}'
ok
awk 'BEGIN{a="b";print a=="c"?"ok":"err"}'
err
#三目运算符?:
awk '/root/{print $0}' passwd 
#匹配所有蕴含 root 的行
awk -F: '$5~/root/{print $0}' passwd 
# 以分号作为分隔符,匹配第 5 个字段是 root 的行
ifconfig eth0|awk 'BEGIN{FS="[[:space:]:]+"} NR==2{print $4}'
#打印 IP 地址
awk '{print toupper($0)}' test.txt
#toupper 是 awk 内置函数,将所小写字母转换成大写

每天一个 Linux 命令(1):xargs

每天一个 Linux 命令(2):od

正文完
 0