一、ls -l | grep ^d
二、shell强大的awk 文件搜索分析刷选工具
参考:https://www.cnblogs.com/chenhuan001/p/6297615.html
1、 awk '{pattern + action}' {filenames} pattern查找的内容 action命令 filenames要查找的对象
尽管操作可能会很复杂,但语法总是这样,其中 pattern 表示 AWK 在数据中查找的内容,而 action 是在找到匹配内容时所执行的一系列命令。花括号({})不需要在程序中始终出现,但它们用于根据特定的模式对一系列指令进行分组。 pattern就是要表示的正则表达式,用斜杠括起来。
awk语言的最基本功能是在文件或者字符串中基于指定规则浏览和抽取信息,awk抽取信息后,才能进行其他文本操作。完整的awk脚本通常用来格式化文本文件中的信息。
通常,awk是以文件的一行为处理单位的。awk每接收文件的一行,然后执行相应的命令,来处理文本。
有三种方式调用awk
- .命令行方式
- awk [-F field-separator] 'commands' input- file(s)
- 其中,commands 是真正awk命令,[-F域分隔符]是可选的。 input- file(s) 是待处理的文件。
- 在awk中,文件的每一行中,由域分隔符分开的每一项称为一个域。通常,在不指名-F域分隔符的情况下,默认的域分隔符是空格。
-
- .shell脚本方式
- 将所有的awk命令插入一个文件,并使awk程序可执行,然后awk命令解释器作为脚本的首行,一遍通过键入脚本名称来调用。
- 相当于shell脚本首行的:#!/bin/sh
- 可以换成:#!/bin/awk
-
- .将所有的awk命令插入一个单独文件,然后调用:
- awk -f awk-script- file input- file(s)
- 其中,-f选项加载awk-script- file中的awk脚本,input- file(s)跟上面的是一样的。
实例:
显示/etc/passwd的账户
2、#cat /etc/passwd |awk -F ':' '{print $1}' awk工作流程
awk工作流程是这样的:读入有'\n'换行符分割的一条记录,然后将记录按指定的 域分隔符 -F指定域分隔符为':' (单词域的缩写)。划分域,填充域,$0则表示所有域,$1表示第一个域,$n表示第n个域。默认域分隔符是"空白键" 或 "[tab]键",所以$1表示登录用户
这种是awk+action的示例,每行都会执行action{print $1}。
如果只是显示/etc/passwd的账户和账户对应的shell,而账户与shell之间以tab键分割
3、#awk -F: '/root/' /etc/passwd 搜索/etc/passwd有root关键字的所有行
这种是pattern的使用示例,匹配了pattern(这里是root)的行才会执行action(没有指定action,默认输出每行的内容)。
4、shell编程统计某个文件夹下的文件占用的字节数,过滤4096大小的文件(if语句):
ls -l |awk ' BEGIN { size= ;print "[ start] size is ", size} {if($5!=4096){size=size+$5;}} END{print "[ end] size is ", size/1024/1024,"M "}' [end]size is 8.22339 M
awk中的条件语句 if 是从C语言中借鉴来的:
- if (expression) {
- statement;
- statement;
- ... ...
- }
-
- if (expression) {
- statement;
- } else {
- statement2;
- }
-
- if (expression) {
- statement1;
- } else if (expression1) {
- statement2;
- } else {
- statement3;
- }
5、 awk编程
这里没有初始化count,虽然默认是0,但是妥当的做法还是初始化为0:
以M为单位无非就是除于1024再除于1024
- if (expression) {
- statement;
- statement;
- ... ...
- }
-
- if (expression) {
- statement;
- } else {
- statement2;
- }
-
- if (expression) {
- statement1;
- } else if (expression1) {
- statement2;
- } else {
- statement3;
- }
显示/etc/passwd的账户
- awk - F ':' ' BEGIN { count= ;} {name[ count] = $ ; count++;}; END{ for (i = ; i < NR; i++) print i, name[i]}' /etc/passwd
- root
- daemon
- bin
- sys
- sync
- games
- ......