工具之awk、find

awk

awk是以行或者列为单位进行处理文件的。awk缺省的行分隔符是\n,缺省的列分割符是连续的空格,列分隔符和行分隔符可以自定义。

awk是一门复杂的脚本语言,有像C语言一样的分支和循环结构。

命令格式:

/pattern/{actions}
condition{actions}

print命令

输出符合正则表达式或者条件的结果行。
这里写图片描述
其中, 0 1、 2 3、$4分别代表指定的域。这里的域分割符默认是空格或Tab键。
这里写图片描述
输出多个域时,用逗号作为分隔符。

根据条件进行输出

awk支持printf,语法使用基本和C是一样的。
这里写图片描述

awk定制输入输出符

awk默认的输入输出符是空格,要想自己定义分隔符,用-f选项。
这里写图片描述
从以上的结果可以看出,awk用-f指定域分隔符后,再输出第一列就有所不同了。默认的域分隔符是空格。

awk的-F选项可以支持多种符号定制分隔符,用[分隔符1分隔符2…]来表示
这里写图片描述

BEGIN & END

BEGIN和END可以做文本处理之前的准备工作,之后的收尾工作。常用BEGIN来显示变量和初始化变量,使用END来输出最终的结果。

格式:

BEGIN{} /REG{} END{}
BEGIN{} condition{} END{}

统计及格的人数
这里写图片描述
统计文本中空行的个数
这里写图片描述

awk脚本

awk脚本和命令行是差不多的,语法也是类C的。
我们可以自己编写一个awk脚本,用来记录各个成绩段的学生个数。

 #!/usr/bin/awk -f                                               

 BEGIN{
     FS=":"
     excellent=0;
     good=0;
     mid=0;
     bad=0;
 }
 {
     if($2 > 90)
         excellent++;
     else if($2 > 80)
         good++;
     else if($2 > 60)
         mid++;
     else
         bad++;
 }
 END{
     printf("excellent: %d\n",excellent);
     printf("good: %d\n", good);
     printf("mid: %d\n", mid);
}

这里写图片描述
在BEGIN{}中使用了一个FS,用来设置分隔符,这个FS叫做awk的内置变量,类似于shell脚本里边的内置变量。

awk的内置命令

内置命令 解释
ARGC 命令行参数的个数
ENVIRON 支持队列中系统环境变量的使用
FILENAME awk浏览的文件名
FNR 浏览文件的记录数
FS 设置输入域分隔符,等价于命令行的-F选项
NF 浏览记录的域的个数
NR 已读的记录数
OFS 输出域分隔符
ORS 输出记录分隔符
RS 控制记录分隔符

常用的有FS,OFS,NF,其中NF-1表示倒数第二个域。
这里写图片描述

find

find命令在目录结构中搜索文件。

命令格式:

find path -option [ -print -exec -ok …]

参数 说明
path 路径
-print 将匹配的文件输出到标准输出。print0
-exec 对匹配的文件执行该参数所给的shell命令,形式为’command’ {} \;
-ok 和exec的作用相同,是以一种更为安全的模式来执行该参数所给的shell命令,在执行命令前都会给出提示。
常见选项 解释
-name 按照文件名查找文件
-perm 按照文件权限查找文件
-prune 可以不在当前目录中查找文件
-depth 首先查找当前目录中的文件,然后在其子目录中查找,若和-prune共同使用,则-prune被忽略
-user 按照文件属主来查找
-group 按照文件所属的组查找文件
-nogroup 查找无有效所属组的文件,即在/etc/groups中不存在该文件所属的组
-nouser 查找无有效属主的文件,即在/etc/passwd中不存在
-newer file1!newer file2 查找更改时间比文件file1新但比文件file2旧
-type 查找某一类型的文件(-b、-d、-c、-p、-l、-f)
-size 查找文件长度为n块的文件,带c时表示文件长度为字节

猜你喜欢

转载自blog.csdn.net/zwe7616175/article/details/80991328
今日推荐