三剑客grep、awk、sed;第二篇章主讲awk

文本处理篇

本章节写的是文本处理,文本处理就是对想要查询的信息进行筛选过滤整合为目的,这些的查询命令对后续的脚本编写起到非常关键的作用…在文本处理的同时配合着正则表达式的运用提高我们对文本信息过滤的效率和准确率…


- “三剑客” 信息收索处理(grep、awk、sed)

  • awk 工作模式
    逐行读取文件,在 awk 内部空间进行“切片”操作,(自身就包含分隔符号,默认是“空格”)
awk -F 'BEGIN{cdm1;cmd2} {cmd3;cmd4} END{cmd5;cmd6}'
awk的基本用法
         参数        预处理       模式/条件         动作/命令集          扫尾处理   操作对象
awk   [-F|-f|-v]  ‘BEGIN{cmd}  /模式空间 /   {command1; command2}    END{cmd}’  file
  • awk 常用变量用法 : FS , RS
    FS : field separator 读取文本时默认区分列所使用的 依据默认是“空格”(没有使用 -F 指定的时候)
    RS : Record separator 读取文本时 默认区分行所使用的依据,默认是 \n 换行符
    解析:
    FS -> field : 字段 ===》 列
    RS -> record : 记录 ===》 行

FS:察看 /etc/passwd 文件,寻找第一行,以冒号(:)为分隔符切割,同时打印第一列

[root@deng-120 ~]# cat /etc/passwd | awk 'BEGIN{FS=":"}{print $1}'
root
bin
daemon
adm
lp

RS:察看 /etc/passwd 文件,以冒号(/)为分隔符切割,$0 表示处理该行,进行打印

[root@deng-120 ~]# cat /etc/passwd | awk 'BEGIN{RS="/"}{print $0}'
root:x:0:0:root:
root:
  • awk 常用变量用法 : OFS
    OFS : Output Filed Separator: 可以指定输出文本时使用的字段分隔符,默认是 空格,可以修改

OFS:察看 /etc/passwd 文件,以冒号(:)为分隔符切割,OFS切割内容的分割,打印123列

[root@deng-120 ~]# cat /etc/passwd | awk 'BEGIN{FS=":";OFS="###"}{print $1,$2,$3}'
root###x###0
bin###x###1
daemon###x###2
adm###x###3
  • awk 常用变量用法 :NR , NF
    NR :The number of input records 显示出当前正则处理的 行的编号。
    NF : Number of Field 在有效分隔符下(默认是空格),每一行总共有多少列,注意 $NF 是打印具体的一列,默认是最后一列

NR , NF:察看 /etc/passwd 文件,以冒号(:)为分隔符切割,OFS切割内容的分割,打印13列,显示正在处理的 NR 行编号和 NF 列编号

[root@deng-120 ~]# cat /etc/passwd | awk 'BEGIN{FS=":";OFS=" # "}{print $1,$3,"NR="NR,"NF="NF }'
root # 0 # NR=1 # NF=7
bin # 1 # NR=2 # NF=7
daemon # 2 # NR=3 # NF=7
  • awk 用户自定义变量

对打印行号进行赋值 var 变量

[root@deng-120 ~]# cat /etc/passwd |  awk 'BEGIN{FS=":" ; var="1"}{print NR,$var}' 
1 root
2 bin
3 daemon
4 adm
  • awk 字符串比对
    ~ 匹配 ##多用于字符串
    !~ 不匹配
    == 等于 ##多用于数值
    != 不等于
    小于< ;大于 >;大于等于 >=; 小于等于<=;等于==;不等于 !=;匹配 ~ ;不匹配!~

察看 /etc/passwd 文件,以冒号(:)为分隔符切割,寻找 $3 第3列大于500,并且打印第13列

[root@deng-120 ~]# cat /etc/passwd |  awk 'BEGIN{FS=":"}$3>500{print $1,$3}'
polkitd 999
chrony 998
rosen 1000
li4 1001

察看 /etc/passwd 文件,以冒号(:)为分隔符切割,寻找第1列匹配 mail,并且打印第13列和最后一列

[root@deng-120 ~]# cat /etc/passwd |  awk 'BEGIN{FS=":"}$1 ~ "mail"{print $1,$3,$NF }'
mail 8 /sbin/nologin
  • awk 支持的 赋值 操作符
    ++ 变量加1
    - - 变量减1
    += 将加的结果赋给 变量

计算 /etc 一级目录下,普通文件和目录的总大小, 使用 KB 作为单位

[root@deng-120 ~]# ll /etc/ | awk 'BEGIN{A=0}{A+=$5}END{print A}'
821167
[root@deng-120 ~]# ll /etc/ | awk 'BEGIN{A=0}{A+=$5}END{print A/1024,"KB"}'
801.921 KB

计算 /etc 目录下 ,平均每个文件有多大 ,已 “-” 开头为文件

[root@deng-120 ~]# ll /etc/ | grep "^-" | awk 'BEGIN{A=0}{A+=$5;B++}END{print "平均值是:"A/B}'
平均值是:8740.73
  • awk 支持的 逻辑运算符 :&& ||
    && 表示并且; || 表示或者

察看 /etc/passwd 文件,以冒号(:)为分隔符切割,寻找第1列匹配 mail同时第三列大于5,并且打印一整行

[root@deng-120 ~]# cat /etc/passwd | awk -F ":"  '$1 ~ /mail/ && $3>5{print $0}'
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin

察看 /etc/passwd 文件,以冒号(:)为分隔符切割,寻找第1列匹配 mail 或者第三列大于500,并且打印第13列

[root@deng-120 ~]# cat /etc/passwd | awk -F ":"  '$1 ~ /mail/ || $3>500{print $1,$3}'
mail 8
polkitd 999
chrony 998
rosen 1000

正则表达式

  • 基本正则表达式 元字符
^   行首定位符       ^love   
$   行尾定位符	    love$       
.   匹配单个字符      l..e      
*   匹配前一个字符    0次或多次

.*      匹配任意长度的任意字符
[ - ]   匹配指定范围内的一个字符    [a-zA-Z0-9]ove    
[ ^ ]   匹配不在指定组内的字符      [^a-Z0-9]ove  
^[ ]    匹配开头指定组内的字符      ^[a-zA-Z ]ove

===单词匹配
\<  词首定位符   \<love      锚定词首                    
\>  词尾定位符   love\>      锚定词尾
\<pattern\> : 锚定单词

===重复次数 
x\{m\}      字符x重复出现m次        o\{5\}
x\{m,\}     字符x重复出现m次以上     o\{5,\}                     
x\{m,n\}    字符x重复出现m到n次      o\{5,10\}
  • 扩展正则 表达式元字符
+   匹配前一个字符一次或多次       [a-z]+ove    ## 与基础正则 * 0次到多次
?   匹配前一个字符 0次 或 多次     o?ve         ## 与基础正则 *  任意
a|b 匹配a或b                     love|hate

===POSIX  字符类
[[:space:]]     空格符号  
[[:punct:]]     标点符号  

正则表达式的运用

找到 /etc/login.defs 文件中,默认生效行,和备用行。注:字母开头为生效行,#加字母为备用行
正向思维:寻找以 字母开头,#开头接着不是空格

[root@deng-120 ~]# cat /etc/login.defs | grep -E "(^[a-zA-Z])|(^#[^[:space:]+])"
#QMAIL_DIR  Maildir
MAIL_DIR    /var/spool/mail
#MAIL_FILE  .mail
PASS_MAX_DAYS   99999

逆向思维:寻找不是以 #接着空格、#开头结束和空行直接结束的

[root@deng-120 ~]# cat /etc/login.defs | grep -vE "(^#[[:space:]+])|^#$|^$"
#QMAIL_DIR  Maildir
MAIL_DIR    /var/spool/mail
#MAIL_FILE  .mail
PASS_MAX_DAYS   99999

本章节精讲 awk 加上正则表达式有适当的难度,掌握了本章节的内容文本处理篇已经会了一半。。。

你们的阅读就是我的继续创作动力,欢迎阅读评论!!!

猜你喜欢

转载自blog.csdn.net/weixin_42867972/article/details/81607737