awk
awk是以行或者列为单位进行处理文件的。awk缺省的行分隔符是\n,缺省的列分割符是连续的空格,列分隔符和行分隔符可以自定义。
awk是一门复杂的脚本语言,有像C语言一样的分支和循环结构。
命令格式:
/pattern/{actions}
condition{actions}
print命令
输出符合正则表达式或者条件的结果行。
其中,
1、
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 | 路径 |
将匹配的文件输出到标准输出。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时表示文件长度为字节 |