awk大法

awk


awk概念

一款用于数据流的文本处理工具,它将文件作为记录序列处理。在一般情况下,文件内容的每行都是一个记录。每行内容都会被分割成一系列的域,因此,我们可以认为一行的第一个词为第一个域,第二个词为第二个,以此类推。AWK程序是由一些处理特定模式的语句块构成的。AWK一次可以读取一个输入行。对每个输入行,AWK解释器会判断它是否符合程序中出现的各个模式,并执行符合的模式所对应的动作。

它颇有玩头的原因,就在于可以对列和行进行操作。awk也有很多内建功能,比如数组、函数等,这是它和C语言的相同之处。灵活性是awk最大的优势。

awk语法

program: PATTERN{ACTION STATEMENTS}
    语句之间用分号分隔
    print, printf
选项:
    -F:指明输入时用到的字段分隔符;
    -v var=value: 自定义变量;

由例子引入:

awk大法

由上面可以看到:基本用法是

awk 'BEGIN{ print "start" }{ print }END{ print "END" }'

awk也可以从stdin(标准输入中读取)

三部分:BEGIN,END,和带模式匹配选项的常见语句块,都可以省略。

然后来谈谈awk的工作原理:

1、执行BEGIN{ commands }语句块中的语句

2、从文件或stdin中读取一行,然后执行pattern{ commands }。从复这个过程,直到文件全部被读取完毕。

3、当读至输入流末尾时,执行END{ commands }语句块。

总结,BEGIN\END语句块,在输入流之前和之后被执行,一般用于在开头和结尾加点什么东西。最重要的部分是pattern语句块中的通用命令。如果不提供该语句块,则默认执行{ print },即打印所读取到的每一行。

print

print item1, item2, ...
要点:
(1) 逗号分隔符;
(2) 输出的各 item 可以字符串,也可以是数值;当前记录的字段、变量或 awk 的表达
式;
(3) 如省略 item,相当于 print $0;

1、打印后五行的第二和第四字段

awk大法

2、在字段前后加上字符和数字

awk大法

变量

内建变量:最常用的是FS

FS:input field seperator,默认为空白字符;
OFS:output field seperator,默认为空白字符;
RS:input record seperator,输入时的换行符;
ORS:output record seperator,输出时的换行符;
NF:number of field,字段数量
{print NF}, {print $NF}
NR:number of record, 行数;
FNR:各文件分别计数;行数;
FILENAME:当前文件名;
ARGC:命令行参数的个数;
ARGV:数组,保存的是命令行所给定的各参数;


自定义变量

(1) -v var=value
变量名区分字符大小写;
(2) 在 program 中直接定义

1、打印/etc/passwd中的第一个字段

awk大法

2、使用-F:与 -v FS=':'一样

awk大法

3、打印/etc/passwd 中的第1,3,7字段,并以:隔开打印

awk大法

awk大法

4、显示每一行有多少个字段

awk大法

printf 命令

格式化输出:printf FORMAT, item1, item2, ...
(1) FORMAT 必须给出;
(2) 不会自动换行,需要显式给出换行控制符,\n
(3) FORMAT 中需要分别为后面的每个 item 指定一个格式化符号;
格式符:
    %c: 显示字符的 ASCII 码;
    %d, %i: 显示十进制整数;
    %e, %E: 科学计数法数值显示;
    %f:显示为浮点数;
    %g, %G:以科学计数法或浮点形式显示数值;
    %s:显示字符串;
    %u:无符号整数;
    %%: 显示%自身;
修饰符:
    #[.#]:第一个数字控制显示的宽度;第二个#表示小数点后的精度;
    %3.1f
    -: 左对齐
    +:显示数值的符号

1、以字符串形式显示

awk大法

2、以字符串输出username,以十进制形式输出UID

awk大法

3、打印用户UID大于1000的输出普通用户,否则是系统用户或者管理员。

awk大法

4、打印UID大于1000用户的第一和第三字段

awk大法

5、打印以UUID开头的行的第一个字段

awk大法

6、找出“/bin/bash”的的行

awk大法

7、找出以root开头到以ftp开头的行,打印出来第一个字段

awk大法

awk最有意思的地方是:我觉得它是在抄c语言的

暂且把awk当做万能的吧,由于知识水平的限制,我不知道它内部不能用什么。就知道它可以用数组,可以用函数,可以用控制语句。姑且认为这个作者是个抄家吧,那下面看看哪里抄了。

1、算术操作符:(抄一点,bash脚本有let、bc、[ ]等等)

x+y, x-y, x*y, x/y, x^y, x%y
-x
+x: 转换为数值;

2、字符串操作符:

没有符号的操作符,字符串连接

bash:==,>,<,!=,=~--->是否等于,大于,小于,不等于

3、赋值操作符:(算你没抄)

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

4、比较操作符:(全抄)

>,>=,<,<=,!=,==


bash:-gt -ge -lt -le -eq -ne

5、模式匹配符:(还不知道什么意思)

~:是否匹配
!~:是否不匹配

6、逻辑操作符:(没抄)

&&
||
!

7、函数调用:

function_name(argu1,argu2,……)

8、条件表达式:

selector?if-true-expression:if-false-expression

C语言也是这样

# awk -F: '{$3>=1000?usertype="Common User":usertype="Sysadmin or
SysUser";printf "%15s:%-s\n",$1,usertype}' /etc/passwd

PATTERN

(1) empty:空模式,匹配每一行;
(2) /regular expression/:仅处理能够被此处的模式匹配到的行;
(3) relational expression: 关系表达式;结果有“真”有“假”;结果为“真”才会被处理;真:结果为非 0 值,非空字符串;
(4) line ranges:行范围,

    startline,endline:/pat1/,/pat2/
    注意: 不支持直接给出数字的格式
    ~]# awk -F: '(NR>=2&&NR<=10){print $1}' /etc/passwd
(5) BEGIN/END 模式

    BEGIN{}: 仅在开始处理文件中的文本之前执行一次;
    END{}:仅在文本处理完成之后执行一次;

控制语句

if(condition) {statments}
if(condition) {statments} else {statements}
while(conditon) {statments}
do {statements} while(condition)
for(expr1;expr2;expr3) {statements}
break
continue
delete array[index]
delete array
exit
{ statements }

if-else

1、用if else来转换条件表达式select

awk大法

2、找到shell类型是bash的用户并打印出来

awk大法

3、找到字段数大于5的行并打印

awk大法

awk大法

4、找到磁盘应用(use)显示比例大于80%的话,怎么显示出来?

先以%为分割符分割 awk大法再取最后一个字段

awk大法

仅显示以DEV条件开头的行

awk大法

找出最后一个字段值大于20的

awk大法


while循环

使用场景:对一行内的多个字段逐一进行处理,对数组中的各元素逐一使用。

取出linux16开头的行,并且对每一行的每个字段分别去统计字符的个数

awk大法

只显示大于等于7的。多加一个if。(类似于编脚本)

awk '/^[[:space:]]*linux16/{i=1;while(i<=NF) {if(length($i)>=7){print $i,length($i)}; i++}}' /etc/grub2.cfg

awk大法

for循环(与bash差不多)

语法:for(expr1;expr2;expr3) statement
for(variable assignment;condition;iteration process) {for-body}

~]# awk '/^[[:space:]]*linux16/{for(i=1;i<=NF;i++) {print$i,length($i)}}' /etc/grub2.cfg

特殊用法:
能够遍历数组中的元素;
语法:for(var in array) {for-body}

next

提前结束对本行的处理而直接进入下一行;
~]# awk -F: '{if($3%2!=0) next; print $1,$3}' /etc/passwd

暂且整理到这里,后面还有数组array+函数,暂时啃不懂,上面的熟悉掌握了,再补充。

原创文章,作者:N24_yezi,如若转载,请注明出处:http://www.178linux.com/62479

(0)
上一篇 2016-12-04 14:46
下一篇 2016-12-04 15:42

相关推荐

  • 进程和计划任务

    1、进程概念 内核的功用:进程管理、文件系统、网络功能、内存管理、驱动程序、安全功能等; 进程是运行中的程序的一个副本,是被载入内存的一个指令集合; 进程ID(PID )号码被用来标记各个进程; UID、GID 和SELinux 语境决定对文件系统的存取和访问权限,这些权限通常从执行进程的用户来继承并且存在生命周期; task struct:Linux内核存…

    Linux干货 2016-09-13
  • 马哥教育网络班21期+第一周课程练习

    1、描述计算机的组成及其功能。   计算机由五个部分组成:运算器、控制器、存储器、输入设备、输出设备。   控制器和运算器合称为中央处理单元,即CPU。   功能:     运算器:也称为算术逻辑单元,是计算机的核心,在控制器的控制下,对取自内存或内部寄存器的数据进行算术运算和逻辑运算。   &nb…

    Linux干货 2016-07-07
  • Linux发展史

    独白:    先来说说我对Linux的认识吧,用一个成语形容:狗屁不通,想了一下,文明社会还是和谐点比较好,算是闻所未闻吧。15年初从朋友那得知Linxu,冲着他那十几K的工资还是挺心动的,说实在很仰慕他,有点计算机基础,自学两个月出山,当时月薪8k;而我还是拿着3,4k的工资,也没什么本领,于是找他要了些有关视频资料,也开始了自学之路,…

    Linux干货 2017-04-08
  • linux三剑客之grep

    linux三剑客之grep        所谓三剑客的工具有“grep”、“sed” 、“awk”,他们都是不谋而合的文本搜索查找处理的强大工具。grep 是 Ken Thompson 写的,他也是 Unix 的创造者。 gerp及正则表达式    grep全称(GLobal search Regu…

    Linux干货 2016-08-08
  • Linux下btrfs子卷的挂载

        对btrfs文件系统的补充:     btrfs文件手动挂载自不必多说,但若想btrfs文件系统开机自动挂载,该如何实现呢?     其实只需添加挂载选项即可,如下: UUID=c99895c8-5b14-4276-80c7-ecf…

    Linux干货 2015-12-19
  • shell脚本执行

    shell脚本执行 对于我们这些小白而讲,shell脚本无疑是最令人头疼的事了,我再这里讲一下shell脚本运行要注意的哪些。 shell脚本就好像c++,java代码一样,按照从上到下然后从左到右的顺序执行。就像我们日常读书一样。如果shell命令遇见了子进程(嵌套代码),程序就会跟着顺序进入子进程。当子进程完成后,回到父进程,并且把父进程所需要的参数提交…

    2017-06-05

评论列表(1条)

  • 马哥教育
    马哥教育 2016-12-07 23:42

    总结的很好,有图有真相,有理解!!!!