signed

QiShunwang

“诚信为本、客户至上”

Linux正则表达式与文本处理命令

2021/6/8 23:45:16   来源:

一、正则表达式

正则表达式:是一类字符所书写出的模式(pattern)

​ 元字符:类似通配符,不表示字符本身的意义,用于额外功能性的描述

基本正则表达式(BRE)和扩展正则表达式(ERE)

基本正则元字符:

字符匹配:
     . : 任意单个字符
    [] : 指定范围内的任意单个字符
    [^] : 指定范围外的任意单个字符
    [0-9],[:digit:] : 数字
    [a-z],[:lower:] : 小写字母
    [A-Z],[:upper:] : 大写字母
    [:alpha:] : 大小写字母
    [:alnum:] : 字母+数字
    [:space:] : 空格
    [:putct:] : 标点符号
    
匹配次数:
    * : 匹配前一个字符的任意次(包括0次)
    .* : 匹配任意长度的任意次
    \? : 0次或1次
    \+ : 至少1次
    \{n\} : n次
    \{n,\} : 至少n次
    \{,n\} : 至多n次
    \{n,x\} : 至少n次至多x次
    
位置锚定:
    ^ : 锚定行首
    $ : 锚定行尾
    ^$ : 表示空行
        ^[[:space:]]*$ : 空白行
    \<,\b : 锚定词首
    \>,\b : 锚定词尾
    
分组:
    \(\) 
    引用:
        \1:后向引用,引用第一个括号左匹配到的字符串。1.2.3.4.5.6.7.8.9.10.11.12.13.14.15.16.17.18.19.20.21.22.23.24.25.26.27.28.29.30.31.32.33.34.

扩展正则表达式:

字符匹配:
    . : 任意单个字符
    [] : 指定范围内的任意单个字符
    [^] : 指定范围外的任意单个字符
匹配次数:
    * : 匹配前一个字符的任意次(包括0次)
    .* : 匹配任意长度的任意次
    ? : 0次或1次
    + : 至少1次
    {n} : n次
    {n,}: 至少n次
    {,n} : 至多n次
    {n,x} : 至少n次至多x次
位置锚定:
    ^ : 锚定行首
    $ : 锚定行尾
    ^$ : 表示空行
        ^[[:space:]]*$ : 空白行
    \<,\b : 锚定词首
    \>,\b : 锚定词尾
分组:
    () 
    引用:
        \1:后向引用,引用第一个括号左匹配到的字符串。
或:
   ac|bc : ac或者bc1.2.3.4.5.6.7.8.9.10.11.12.13.14.15.16.17.18.19.20.21.22.23.24.25.26.

二、文本处理命令

grep : 文本过滤

grep [option] file
选项:
    -v : 取反
    -i : 忽略大小写
    -n : 显示匹配行的行号
    -c : 统计匹配的行数
    -q : 静默模式,不输出任何信息
    -o : 仅显示匹配到的字符串
    -A n : 匹配搜索到的字符串的后n行
    -B n :匹配搜索到的字符串的前n行
    -C n :匹配搜索到的字符串的前后n行
    -e :实现多个选项间的逻辑or关系
        grep -e 'str0' -e 'str1' file
    -w : 匹配整个单词
    -E : 支持扩展正则表达式1.2.3.4.5.6.7.8.9.10.11.12.13.14.15.

wc : 统计文件

wc [option] file
选项:
    -l :行数
    -w :单词数
    -c :字节数
    -m :字符数
    -L :最长行的字符数1.2.3.4.5.6.7.

sort : 排序

选项
    -t : 指定分隔符
    -k : 指定以第N列进行排序
    -n : 以数字大小排序
    -r : 倒序排序
    -u : 去除重复行1.2.3.4.5.6.

uniq :去除文件中相邻的重复行

选项:
    -c :显示每行重复出现的次数
    -d : 仅显示重复过的行
    -u : 仅显示不曾重复的行1.2.3.4.
cat : 查看文件内容
cat [options] file
选项:
    -n : 显示行号
    -b : 显示行号,空行不显示行号
    -E : 显示结束符 $
    -A : 显示所有特殊符号
    -s : 将连续空行压缩成一行
    
tac :反向显示	


rev : 反向显示字符串,abc > cba


nl  : 显示行号,空行不添加行号

 
more : 分页显示,不能向前翻页
more [option] file
选项:
    +n : 从第n行开始显示
    -n : 每次显示n行数据
    -c :清屏再现实
    -p : 换页时清屏

        
less : 分页显示,不自动退出
 -N : 显示行号
    查看文件时:	
    /str : 向下搜索字符串
    ?str : 向上搜索字符串

        
head : 显示文件的前几行
    -c n : 取字符的前n个

        
tail : 显示文件的后几行
    -f : 实时显示
    -F : 跟踪文件名

        
tailf :类似tail -f,当文件不增长时不访问文件,减少磁盘I/O


cut:显示行中的指定部分,删除文件中指定字段。
    -d : 指定分隔符
    -f : 与-d一起使用,显示第n列
    -c : 按字符切割
    
paste :合并两个文件相同行号的行到一行
    -d :指定分隔符,默认用TAB
    -s :所有行合并成一行显示

AWK简介:awk是一个强大的文本分析工具,相对于grep的查找,sed的编辑,awk在其对数据分析并生成报告时,显得尤为强大。简单来说awk就是把文件逐行的读入, 以空格为默认分隔符将每行切片,切开的部分再进行各种分析处理;awk有3个不同版本: awk、nawk和gawk,未作特别说明,一般指gawk,gawk 是 AWK 的GNU版本。

(1)域分隔符:awk在没有使用-F指定分割符时,默认以空格为分割符;
           域分割 

$0代表文本内容全文显示;

$1 代表分割第一个域;

$2 代表分割第二个域;
         ......
awk -F: 分割符为‘:’
eg: cat /etc/passwd | awk -F: '{print $1,$2}'

 (2) 打印报告头
eg: 

cat /etc/passwd | awk -F: 'BEGIN{print "This is system user"}{print $1}' | more      

 打印结尾:
eg:

cat /etc/passwd |awk -F: 'BEGIN{print "==============="}{print $1}END{print "=========="}'  |more



(3) awk 中的正则表达式:

​    1>匹配 ~          eg:cat /etc/passwd |awk -F:  '{if($1~/root/) print $0}'         



   2>精确匹配:       eg: cat /etc/passwd | awk -F: '$1=="root"{print $0}'  

​               

   3> 不匹配:        eg: cat /etc/passwd |awk '{if($1!~/root/) print $0}'  



   4>小于,小于或等于:  eg: cat /etc/passwd | awk -F: '{if($3<200) print $3}'



   5>大于,大于或等于:  eg: cat /etc/passwd | awk -F: '{if($3>500) print $3}'



​    6> 匹配多个关键字:    eg: cat /etc/passwd | awk -F: '$1 ~ /(root|user)/ {print $0}'



​     7> 匹配行首:      eg: cat /etc/passwd |awk -F:  '{if($1~/^root/) print $0}'



​      8> awk 使用 && ||   eg: cat /etc/passwd | awk -F: '{if($1=="root" && $5=="root") print $0}'



​    (4) awk 中的NF与NR: 

​    NF:浏览记录的域的个数(统计列的段数)

​    NR:统计列的行号

​    eg:

​       cat test |awk -F: ‘{print NF}’ 输出一共有多少列     

​       cat test |awk -F: ‘{print NF,NR}’ 输出一共有多少列及其行号     

​       cat test |awk -F: ‘{print NR,$0}’ 输出全部内容,并在其前输出行号     

​       awk '{if(NR<10 && $1~/root/) print $1}' /etc/passwd 行号小于10的,使用$1匹配root关键字    

​        cat /etc/passwd | awk -F: '{print $NF}' 打印每段的最后一段*  



(5)awk替换:

  eg:

​          cat /etc/passwd | awk 'gsub(/root/,"alvinzeng") ' 

​          将文中所有的root替换成alvinzeng,并输出了所有匹配的行