正则文本处理

时间:2022-09-12 10:21:40

文本处理常用命令grep cut awk sed:

cat 查看文件内容:

-b 显示行号,空白行不显示行号

-n 显示行号,包括空白行

more 分页查看文件内容,通过空格键查看下一页,q键则退出查看

less 分页查看文件内容,空格(下一页),方向键(上下回键),q键(退出查看)

 

head 查看文件头部内容,默认显示前10行:

-c nK 显示文件前nKB的内容

-n 显示文件前n行的内容

head -c 2K /root/install.log 查看文件前2KB的内容

head -20 /root/install.log  查看文件前20行的内容

 

tail 查看文件的尾部内容,默认显示末尾10行:

-c nK 显示文件末尾nKB的内容

-n 显示文件末尾n行的内容

-f 动态显示文件内容,按Ctrl+C组合键退出

tail -c 2K /root/install.log 查看文件末尾2KB的内容

tail -20 /root/install 查看文件末尾20行的内容

tail -f /var/log/messages 实时查看文件内容

 

wc 显示文件的行、单词与字节的统计信息:

-c 显示文件字节统计信息

-l 显示文件行数统计信息

-w 显示文件单词统计信息

 

sort 对文件内容进行排序

语法:

sort [-bcdfimMnr][-o<输出文件>][-t<分隔字符>][+<起始栏位>-<结束栏位>][--help][--verison][文件]
-b:忽略每行前面开始的空格字符,空格数量不固定时,该选项几乎是必须要使用的("-n"选项隐含该选项,测试发现都隐含) -c:检查文件是否已经按照顺序排序,如未排序,会提示从哪一行开始乱序 -C:类似于"-c",只不过不输出任何诊断信息。可以通过退出状态码1判断出文件未排序 -d:只处理英文字母、数字及空格,忽略其他的字符 -f:将小写字母视为大写字母 -h:使用易读性数字(例如:2K、1G) -i:除了040至176之间的ASCII字符外(八进制0-177),忽略其他的字符(忽略无法打印的字符如退格/换页键/回车) -k:以哪个区间 (field) 来进行排序 -m:将几个排序好的文件进行合并,只是单纯合并,不做排序 -M:将前面3个字母依照月份的缩写进行排序 -n:依照数值的大小排序 -o<输出文件>:将排序后的结果存入指定的文件 -r:降序 -u:忽略相同行 -t<分隔字符>:指定分隔符,默认的分隔符为空白字符和非空白字符之间的空字符


 grep:

-i 是忽略大小写  --color 是加颜色

-n  是输出行号  (同 cat -n)

-ra 深度查找匹配

-E  是grep 的 扩展

^    是以什么开始

$    是以什么结尾

egrep相当于 grep -E

-v 是反选

 

grep Aug /var/log/messages 在文件 ‘/var/log/messages’中查找关键词”Aug” 

grep ^Aug /var/log/messages 在文件 ‘/var/log/messages’中查找以”Aug”开始的词汇 

grep --color "[0-9]" /var/log/messages 选择 ‘/var/log/messages’ 文件中所有包含数字的行 

grep --color "[0-9][0-9][0-9]" /var/log/messages  选择 ‘/var/log/messages’ 文件中所有的数字连续匹配3次

grep -E --color "[0-9]{4}"  /var/log/messages  选择 ‘/var/log/messages’ 文件中所有数字的行能连续匹配4次

grep -E --color "[0-9]{1,3}"  /var/log/messages  选择 ‘/var/log/messages’ 文件中所有数字的行能连续匹配1到3次

grep --color "[a-z]" /var/log/messages

grep --color "[A-Z]" /var/log/messages

grep --color "[Aa-Zz]" /var/log/messages

grep Aug -R /var/log/* 在目录 ‘/var/log’ 及随后的目录中搜索字符串”Aug”

grep -i --color "com" test.txt  在test.txt文件里忽略大小写搜索“com”并颜色显示

grep -i -n --color "com" test.txt  在test.txt文件里忽略大小写搜索“com”,显示所在行号并颜色显示

egrep -n --color "[0-9]" /etc/passwd    显示/etc/passwd里所有内容的行号

grep -v "root" /etc/passwd  显示文件中root之外的所有内容(反选)

grep -v "^$" test.txt    去掉文件里的空行

grep -v "^#" test.txt   去掉文件里的注释行

 

sed:

选项与参数:
-n :使用安静(silent)模式,加上 -n 参数后,则只有经过sed 特殊处理的那一行(或者动作)才会被列出来,但不会真正去修改原文件。
-e :直接在命令列模式上进行 sed 的动作编辑;
-f :直接将 sed 的动作写在一个文件内, -f filename 则可以运行 filename 内的 sed 动作;
-r :sed 的动作支持的是延伸型正规表示法的语法。(默认是基础正规表示法语法)
-i :直接修改读取的文件内容,而不是输出到终端。

function:
a :新增行, a 的后面可以是字串,而这些字串会在新的一行出现(目前的下一行)
c :取代行, c 的后面可以接字串,这些字串可以取代 n1,n2 之间的行
d :删除行,因为是删除,所以 d 后面通常不接任何参数,直接删除地址表示的行;
i :插入行, i 的后面可以接字串,而这些字串会在新的一行出现(目前的上一行);
p :打印,亦即将某个选择的数据印出。通常 p 会与参数 sed -n 一起运行
s :替换,可以直接进行替换的工作,通常这个 s 的动作可以搭配正规表示法,例如 1,20s/old/new/g 一般是替换符合条件的字符串而不是整行

g :替换当前模板块中文本,直接修改

^ 匹配行开始,如:/^sed/匹配所有以sed开头的行。
$ 匹配行结束,如:/sed$/匹配所有以sed结尾的行。
. 匹配一个非换行符的任意字符,如:/s.d/匹配s后接一个任意字符,最后是d。
* 匹配0个或多个字符,如:/*sed/匹配所有模板是一个或多个空格后紧跟sed的行。

 

sed -i '/192.168.1.115/d' awk.text   直接删除文件内的192.168.1.115
sed -i 's/192.168.1.115/192.168.1.114/g' awk.text    直接修改文件内的192.168.1.115为114
sed -i 's/serername/servername:/g' awk.text
sed -i '3s/serername/servername:/g' awk.text    修改文件种第3行(修改第几行在s前面加上修改的行数,不加默认全局)
sed -i '/server/s/serername/servername:/g' awk.text    先找到那一行的关键词,然后再修改
sed -i '/^SELINUX/s/enforcing/disabled/g' /etc/sysconfig/selinux    修改selinux文件永久关闭,^号是以什么为开头
sed -i '$s/server name:192.168.1.1/192.168.12/g' awk.text    $号  代表结尾,修改最后一行
sed -i ‘s/stringa1/stringa2/g’ example.txt   将example.txt文件中的 “string1” 替换成 “string2”
sed -n ‘/stringa1/p’    查看只包含词汇 “string1”的行(grep stringa1)
sed -n ‘1,5p;5q’ example.txt    查看从第一行到第5行内容
sed -n ‘5p;5q’ example.txt    查看第5行
sed ‘/^$/d’ example.txt 从example.txt  文件中删除所有空白行
sed -n '1p' awk.text    打印第一行
sed -n '2p' awk.text    打印第二行
sed '/^#/d' example.txt|sed '/^$/d'   从example.txt文件中删除所有注释和空白行
df -h |sed -n '/\/$/p'|sed 's/2%/20/g'    打印磁盘分区信息
cat awk.text |sort|sed 's/ /\n/g'|sort -nr |sed -n '1p;$p' sort -nr   是从小到大的顺序排序 反之-n  \n 是换行的意思

sed -n "/`(date -d "-10min" +%Y:%T)`/,/`(date +%Y:%T)`/p" /usr/local/nginx/logs/access.log                    分析前十分钟的日志

sed -n ‘/2015:12:00:*/,/2015:12:30:*/’p /data/log/nginx.log|awk ‘{print $1}’|sort|uniq –c|sort –nr|head -20      打印中午12点到12点半的前20行的日志信息访问ip最多的

 

awk:

特殊要点:
$0           表示整个当前行
$1           每行第一个字段
$NF          字段数量变量,最后一个
$NF-1  字段数量变量,倒数第二个
NR          每行的记录号,多文件记录递增
FNR        与NR类似,不过多文件记录不递增,每个文件都从1开始
\t            制表符
\n           换行符
FS          BEGIN时定义分隔符
RS        输入的记录分隔符, 默认为换行符(即文本是按一行一行输入)
~            匹配,与==相比不是精确比较
!~           不匹配,不精确比较
==         等于,必须全部相等,精确比较
!=           不等于,精确比较
&&      逻辑与
||             逻辑或
+            匹配时表示1个或1个以上
/[0-9][0-9]+/   两个或两个以上数字
/[0-9][0-9]*/    一个或一个以上数字
FILENAME 文件名
OFS      输出字段分隔符, 默认也是空格,可以改为制表符等
ORS        输出的记录分隔符,默认为换行符,即处理结果也是一行一行输出到屏幕
-F'[:#/]'   定义三个分隔符

 

df -h |awk '{print $1}'       打印第一竖行的数据

df -h |awk '{pring $1,$2}'   打印第二竖行的数据

df -h |awk '{print $1":"$2}'     打印数据的$1,$2之间加个:号

df -h |awk '{print $1"------>"$2}'

ifconfig eth0|grep "Bcast"|awk '{print $2}'|sed 's/addr://g'      取出eth0网卡ip

ifconfig eth0|grep "Bcast"|awk '{print $2}'|awk -F: '{print $2}'  取出eth0网卡ip

ifconfig eth0|grep "Bcast"|awk '{print $2}'|awk -F: '{print $2}'|awk -F. '{print "addr:"$1"."$2"."$3".""0"}'

df -h|awk '/\/$/ {print $0}'        匹配以/为结尾分区所有内容($ 为结尾,\  防止窜意)同grep "\/$"

 

(1) 取出/分区使用大小

df -h|awk '/\/$/ {print $0}'|sed 's/%//g'|awk '{print $5}' 

(2) 监控判断磁盘大小        

df -h|awk '/\/$/ {print $0}'|sed 's/%//g'|awk '{if($5>80)print "ture";else print "fales"}'      

df -h|awk '/\/$/ {print $0}'|sed 's/%//g'|awk '{if($5>80){print "ture"}else{print "fales"}}'    

(3) 搜索这条数据加起来有多少,再进行判断

cat tsc-xcall.log|grep "send msd to tmp ok"|awk '{a+=1}END{if(a>10)print "t";else print "f"}'

(4) 统计Nginx服务器总PV量。    

awk  '{print $7}' access.log |wc -l     

(5) 统计Nginx服务器UV统计。  

awk  '{print $11}' access.log |sort -r|uniq -c |wc -l     

(6) 打印这段时间内有多少条200的数据记录 

cat /usr/local/nginx/logs/access.log|sed -n "/2016:09:00:00/,/2016:10:00:00/"p|grep "200"|awk '{print $10}'|awk '{sum += $1} END {print sum}'     
cat /usr/local/nginx/logs/access.log|sed -n "/2016:09:00:00/,/2016:10:00:00/"p|awk '{print $NF}' |sed 's/"/" /'g|awk '{print $2}'|sed 's/"/ "/'g|awk '{if ($1>3)print $1}'|wc -l

awk  '/2017:09:00/,/2017:12:00/' access.log|wc –l

(7) 分析截止目前为止访问量最高的IP排行并且访问量超过100的ip。

awk '{print $1}' /usr/local/nginx/logs/access.log|sort |uniq -c |sort -nr |awk ‘{if($1>=100) print $0}’|head -10     

 (8) 分析前十分钟的日志  

sed -n "/`(date -d "-10min" +%Y:%T)`/,/`(date +%Y:%T)`/p" /usr/local/nginx/logs/access.log                   

access.log|awk ‘{print $1,$7}’|sort|uniq –c |sort –nr

(9) 查找访问请求超过0.5秒的url

awk ‘{if ($NF>0.5) print $1,$7,$NF}’ access.log|more      

(10) 找到当前日志中502或者404错误的页面并统计。

awk‘{if(($9=502)||($9=404)) print $1,$7,$9 }’ /usr/local/nginx/logs/access.log|sort|uniq –c|sort -nr    

(11) 分析Nginx访问日志状态码404、502、503、500、499等错误信息页面,打印错误出现次数大于20的IP地址。   

awk‘{if($9~/502|499|500|503|404/) print $1,$7,$9 }’/usr/local/nginx/logs/access.log|sort|uniq –c|sort -nr |awk '{if($1>20) print $2}'   

(12) 找到当前日志中502或者404错误的页面并统计。   

awk '{print $0}' /usr/local/nginx/logs/access.log|egrep "404|502"|awk '{print $1,$7,$9}'|more  

(13) 统计netstat -anp 状态为CONNECT的连接数量是多少  

netstat -anlp|grep java|awk '/^tcp/ && /ESTABLISHED/{t++}END{print t}')        

 

cut:

-d   以什么为分隔符

-f    打印

cat /etc/passwd | cut -d : -f 3   #以:分割,取第三段

a=daemon:x:2:2:daemon:/sbin:/sbin/nologin

echo $a | cut -d: -f 1

daemon