05-文本处理三剑客


grep 

grep -A 显示匹配指定内容及之后的n行

grep -B  显示匹配指定内容及之前的n行

grep -C  显示匹配指定内容及其前后各n行

root@ubuntu2004:~# ifconfig ens33 |grep -o '[0-9]\{1,3\}.[0-9]\{1,3\}.[0-9]\{1,3\}.[0-9]\{1,3\}'
192.168.80.181
255.255.255.0
192.168.80.255

touch {a..z}{A..Z}.txt

留干货

cat /etc/profile |grep [a-Z] |grep -v "#"

cat /etc/profile |grep -v "^$" |grep -v "#"

egrep -v "(^#|^$)" /etc/profile

root@ubuntu2004:/data# echo chuan-du |grep "\"
chua-du
root@ubuntu2004:/data# echo chuan:du |grep "\"
chuan:du
root@ubuntu2004:/data# echo chuandu |grep "\"
root@ubuntu2004:/data# echo chuan_du |grep "\"

 sed

sed 是一种在线编辑器,它一次处理一行内容。处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”(pattern space),接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下一行,这样不断重复,直到文件末尾。文件内容并没有 改变,除非你使用重定向存储输出。Sed主要用来自动编辑一个或多个文件;简化对文件的反复操作;编写转换程序等。

-n 不输出模式空间内容到屏幕,即不自动打印
-e 多点编辑
-f FILE 从指定文件中读取编辑脚本
-r, -E 使用扩展正则表达式
-i.bak 备份文件并原处编辑
-s           将多个文件视为独立文件,而不是单个连续的长文件流
#说明: 
-ir   不支持
-i -r 支持
-ri   支持
-ni   危险选项,会清空文件
sed -i "s/ens33/eth0/g" ./a.sh   #全文搜索替换
sed -i 's/.*swap.*/#&/' /etc/fstab    #永久关闭交换分区
sed -i.bak '/SELINUX=enforcing/c SELINUX=disabled' /etc/sysconfig/selinux  #直接替换并备份
sed -i "/^#/d" fstab   #删除#开头
sed -i '/^$/d' fstab   #删除空行
sed -i "/8ede\-f85b68344815 \/boot/a\CHUAN" /etc/fstab    #boot后怎加一行
sed -i "/8ede\-f85b68344815 \/boot/i\GE" /etc/fstab   #boot前怎加一行
sed -i 's/\' filename.txt   #精准替换 aaoldaa  不会被替换

awk

awk就是把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再进行各种分析处理

awk工作流程是这样的:读入有'\n'换行符分割的一条记录,然后将记录按指定的域分隔符划分域,填充域,$0则表示所有域,$1表示第一个域,$n表示第n个域。默认域分隔符是"空白键" 或 "[tab]键"

awk命令形式: awk [-F|-f|-v] ‘BEGIN{} //{command1; command2} END{}’ file  [-F|-f|-v]   大参数,-F指定分隔符,-f调用脚本,-v定义变量 var=value '  '          引用代码块 BEGIN   初始化代码块,在对每一行进行处理之前,初始化代码,主要是引用全局变量,设置FS分隔符 //           匹配代码块,可以是字符串或正则表达式 {}           命令代码块,包含一条或多条命令 ;          多条命令使用分号分隔 END      结尾代码块,在对每一行进行处理之后再执行的代码块,主要是进行最终计算或输出结尾摘要信息   特殊要点: $0           表示整个当前行 $1           每行第一个字段 NF          字段数量变量 NR          每行的记录号,多文件记录递增 FNR        与NR类似,不过多文件记录不递增,每个文件都从1开始 \t            制表符 \n           换行符 FS          BEGIN时定义分隔符 RS       输入的记录分隔符, 默认为换行符(即文本是按一行一行输入) ~            匹配,与==相比不是精确比较 !~           不匹配,不精确比较 ==         等于,必须全部相等,精确比较 !=           不等于,精确比较 &&      逻辑与 ||             逻辑或 +            匹配时表示1个或1个以上 /[0-9][0-9]+/   两个或两个以上数字 /[0-9][0-9]*/    一个或一个以上数字 FILENAME 文件名 OFS      输出字段分隔符, 默认也是空格,可以改为制表符等 ORS        输出的记录分隔符,默认为换行符,即处理结果也是一行一行输出到屏幕 -F'[:#/]'   定义三个分隔符 -F指定分隔符 $1 指指定分隔符后,第一个字段,$3第三个字段, \t是制表符 一个或多个连续的空格或制表符看做一个定界符,即多个空格看做一个空格 awk -F":" '{print $1}'  /etc/passwd awk -F":" '{print $1 $3}'  /etc/passwd                       //$1与$3相连输出,不分隔 awk -F":" '{print $1,$3}'  /etc/passwd                       //多了一个逗号,$1与$3使用空格分隔 awk -F":" '{print $1 " " $3}'  /etc/passwd                  //$1与$3之间手动添加空格分隔 awk -F":" '{print "Username:" $1 "\t\t Uid:" $3 }' /etc/passwd       //自定义输出   awk -F: '{print NF}' /etc/passwd                                //显示每行有多少字段 awk -F: '{print $NF}' /etc/passwd                              //将每行第NF个字段的值打印出来  awk -F: 'NF==4 {print }' /etc/passwd                       //显示只有4个字段的行 awk -F: 'NF>2{print $0}' /etc/passwd                       //显示每行字段数量大于2的行 awk '{print NR,$0}' /etc/passwd                                 //输出每行的行号 awk -F: '{print NR,NF,$NF,"\t",$0}' /etc/passwd      //依次打印行号,字段数,最后字段值,制表符,每行内容 awk -F: 'NR==5{print}'  /etc/passwd                         //显示第5行 awk -F: 'NR==5 || NR==6{print}'  /etc/passwd       //显示第5行和第6行 route -n|awk 'NR!=1{print}'                                       //不显示第一行   条件表达式 ==   !=   >   >=   awk -F":" '$1=="mysql"{print $3}' /etc/passwd   awk -F":" '{if($1=="mysql") print $3}' /etc/passwd          //与上面相同  awk -F":" '$1!="mysql"{print $3}' /etc/passwd                 //不等于 awk -F":" '$3>1000{print $3}' /etc/passwd                      //大于 awk -F":" '$3>=100{print $3}' /etc/passwd                     //大于等于 awk -F":" '$3<1{print $3}' /etc/passwd                            //小于 awk -F":" '$3<=1{print $3}' /etc/passwd                         //小于等于   逻辑运算符 && ||  awk -F: '$1~/mail/ && $3>8 {print }' /etc/passwd         //逻辑与,$1匹配mail,并且$3>8 awk -F: '{if($1~/mail/ && $3>8) print }' /etc/passwd awk -F: '$1~/mail/ || $3>1000 {print }' /etc/passwd       //逻辑或 awk -F: '{if($1~/mail/ || $3>1000) print }' /etc/passwd 
SRE