Linux文本处理三剑客应用
Linux 系统中文本处理有多种不同的方式,系统为我们提供了三个实用命令,来实现对行列的依次处理功能,grep命令文本过滤工具,cut列提取工具,sed文本编辑工具,以及awk文本报告生成工具,利用这三个工具可以灵活的过滤截取任何系统文本内容。
Grep 文本过滤工具
grep 是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹配的行打印出来,在Linux系统中是最常用的行匹配提取工具.
[root@localhost ~]# grep --help |
匹配任意多次字符: 使用*
实现匹配前一个字符出现0次或任意多次(本例则是匹配g字符出现0次或任意多次)
[root@localhost ~]# ls |
匹配任意一个字符: 使用.
实现匹配除换行符以外的任意一个字符,(只匹配一个字符),一般我们把这种匹配模式叫做贪婪匹配
[root@localhost ~]# ls |
匹配行首行尾字符: 使用^
匹配行首是指定字符的文本,相反使用$
匹配行尾是指定字符的文本
[root@localhost ~]# ls |
匹配括号范围以内字符: 使用[]
匹配中括号内任意一个字符,只匹配其中一个
[root@localhost ~]# ls |
匹配括号范围以外字符: 使用[^]
匹配除了中括号字符以外的任意一个字符,符号^
取反的意思.
[root@localhost ~]# ls |
匹配行首某字符: 使用^[^]
匹配行首是与不是指定字符的行,匹配行首是否是或不是某一个字符的记录.
[root@localhost ~]# ls |
匹配恰好出现次数行: 使用\{n}\
匹配前面的字符恰好出现了n次的行
[root@localhost ~]# ls |
匹配不小于出现次数行: 使用\{n,}\
匹配前面字符出现,不小于n次的行
[root@localhost ~]# ls |
匹配不小于且不大于次数行: 使用\{n,m}\
匹配前面的字符出现,不小于n次,最多出现m次的行
[root@localhost ~]# ls |
匹配出现1次或任意多次的行: 使用+
匹配前一个字符出现1次或任意多次的行
[root@localhost ~]# ls |
匹配出现0次或1次的行: 使用?
匹配前一个字符出现过0次或1次,最少0次,最多1次.
[root@localhost ~]# ls |
匹配分支选择行: 使用|
匹配两个或多个分支选择,从特定分支内选择不同的关键词匹配查询
[root@localhost ~]# ls |
匹配模式单元行: 使用()
将字符作为一个整体匹配,即模式单元匹配
[root@localhost ~]# ls |
匹配日期与时间行: 使用正则匹配文本中的日期与时间
# 匹配24小时时间 |
过滤空白行与注释行: 过滤掉开头是#号的,和开头是空行的行,实现去掉注释与空白行
[root@localhost ~]# cat lyshark.log | grep -v "^#" | grep -v "^$" |
匹配开头结尾的行: 匹配开头是0-9
且结尾是点的行
[root@localhost ~]# cat lyshark.log |grep -n -E "^[0-9]+\." |
匹配IP/MAC相关地址行: 正则匹配IP地址,与匹配MAC地址
# 匹配IPV4地址 |
Cut 列提取工具
cut命令用来显示行中的指定部分,删除文件中指定字段,cut经常用来显示文件的内容,类似于type命令.该命令显示文件的内容,它依次读取由参数file所指明的文件,将它们的内容输出到标准输出上.
[root@localhost ~]# cut --help |
手动创建一个文本,添加内容列之间用tab分隔,用来测试后续内容
[root@localhost ~]# cat lyshark.log |
通过使用 -f
选项指定过滤的列,并显示到屏幕
[root@localhost ~]# cut -f 2 lyshark.log |
通过使用 --complement
选项提取指定字段之外的列,(打印除了第2列之外的列)
[root@localhost ~]# cut -f 2 --complement lyshark.log |
通过使用 -c
选项过滤/etc/passwd,并打印第1个到第3个字符
[root@localhost ~]# cut -c 1-3 /etc/passwd |
通过使用 -c -2
选项过滤/etc/passwd
,并打印前2个字符
[root@localhost ~]# cut -c -2 /etc/passwd |
通过使用 -c 5-
选项过滤/etc/passwd
,打印从第5个字符开始到结尾
[root@localhost ~]# cut -c 5- /etc/passwd |
通过使用 -d
指定分隔符 -f
指定打印第个字段,以下我们分别截取第1和第7个字段
[root@localhost ~]# cut -d ":" -f 1,7 /etc/passwd |
通过使用 -c -3
指定截取前3个字符,还可以通过 -c 3
截取第3个字符
[root@localhost ~]# cut -c -3 /etc/passwd |
Sed 文本流编辑器
sed是一种流编辑器,它是文本处理中非常中的工具,能够完美的配合正则表达式使用,sed主要是来进行数据选取,替换,删除,新增的命令.
[root@localhost ~]# sed --help |
在进行实验之前,首先创建一个文件,来做测试用
[root@localhost ~]# cat lyshark.log |
使用 sed '2p'
重复打印第二行数据
[root@localhost ~]# sed '2p' lyshark.log |
使用 sed -n
限定,只选取指定的行进行显示
[root@localhost ~]# sed -n '2p' lyshark.log ←只打印第2行数据 |
使用 sed '2,4d'
删除掉文件2-4行,并显示到屏幕,(原文件内容并没有被修改)
[root@localhost ~]# sed '2,4d' lyshark.log ←删除2-4行的数据并打印 |
使用 sed '2[a|i]'
追加,或者插入数据指定数据
[root@localhost ~]# sed '2a hello lyshark' lyshark.log ←在第2行后面追加数据 |
使用 \
换行符,一次插入多行数据
[root@localhost ~]# sed '2a hello \ ←在第二行下面,插入一段话,用\隔开 |
使用 sed 'c'
实现整行替换数据
[root@localhost ~]# cat lyshark.log | sed '5c 5 WRS 99 m 111' ←整行替换第5行内容 |
使用 sed
后面跟上 -i
选项,将第5行的修改,保存进文件,(-i选项是回写)
[root@localhost ~]# sed -i '5c 5 WRS 99 m 111' lyshark.log |
字符串的替换 sed 's/旧文本/新文本/g'
进行整行替换
[root@localhost ~]# sed '2s/WR/LyShark/g' lyshark.log ←将第2行的,WR替换成LyShark |
将第3行数据的开头添加#注释
[root@localhost ~]# sed '3s/^/#/g' lyshark.log |
将第4和第5行的内容替换成空
[root@localhost ~]# sed -e '4s/LY//g ; 5s/WRS//g' lyshark.log |
通过使用grep命令定位到指定行,然后使用sed替换无用字符串,最后实现IP地址的过滤.
[root@localhost ~]# ifconfig | grep "inet 192" |sed 's/^.*inet //g' |
Awk 文本报告生成器
awk是一种编程语言,用于在Linux下对文本和数据进行处理,数据可以来自标准输入(stdin),一个或多个文件,或其它命令的输出,它支持用户自定义函数和动态正则表达式等先进功能,此处我们只需要了解一些基础即可.
[root@localhost ~]# awk --help |
在进行实验之前,首先创建lyshark.log
测试文件,后续使用该文件练习过滤.
[root@localhost ~]# cat lyshark.log |
简单使用,awk格式化输出文本的第二列和第三列的内容.
[root@localhost ~]# awk '{ printf $2 "\t" $3 "\n" }' lyshark.log |
指定分隔符,通过使用-F
参数可以用于指定一个分隔符.
[root@localhost ~]# awk -F ":" '{printf $1 "\t" $6 "\n"}' /etc/passwd |
Bengin/End关键字: BEGIN的执行时机是在awk程序开始过滤之前执行,BEGIN定义的动作只能被执行一次.
[root@localhost ~]# awk 'BEGIN{ printf "执行语句前,执行我 \n" }{ printf $2 "\t" $4 "\n" }' lyshark.log |
至于END则刚好和BEGIN相反,END是在awk程序处理完所有数据,即将结束时执行,END后的动作只在程序结束时执行一次.
[root@localhost ~]# awk 'END{ printf "执行语句结束后,执行我 \n" }{ printf $2 "\t" $4 "\n" }' lyshark.log |
当然了BEGIN与END是可以连用的,以下例子也就是实现了连用的效果.
[root@ ~]# awk 'BEGIN{ printf "执行语句前,先执行我 \n" }END{ printf "执行语句后,在执行我 \n"}{ printf $2 "\t" $4 "\n" }' lyshark.log |
关系运算符: 设定条件,符合执行不符合不执行,下面设定条件为AGE字段>=25岁的列出
[root@localhost ~]# cat lyshark.log | grep -v ID | awk '$3 >=25 {print $1 "\t" $2}' |
awk正则匹配: awk是列提取命令,其每次读入一行,并进行判断,重复赋值变量,并打印数据.
指定搜索:
正则搜索第2列NAME字段,包含XDL的行,并打印出AGE列对应的值.
[root@localhost ~]# cat lyshark.log |
全局搜索:
正则全局搜索包含WR的字段行,并打印本行$0
全部数据.
[root@localhost ~]# cat lyshark.log |
正则查找相应行:
正则全局查找满足开头范围是[0-2]的行,并打印出全部数据.
[root@localhost ~]# cat lyshark.log |
awk内置变量: 接下来将来看几个比较重要的内置变量的使用,以及简单实现判断功能
通过内置变量 FS=":"
定义分隔符,打印/etc/passwd
文件的第1列和第7列
[root@localhost ~]# cat /etc/passwd |grep "/bin/bash" | awk '{print $0}' |
打印行内容的同时,打印出行号(NR变量),和本行的字段数(NF变量)
[root@localhost ~]# cat /etc/passwd |grep "/bin/bash" | awk 'BEGIN {FS=":"} {print $1 "\t" "行号:" NR "\t"}' |
打印内容的同时,首先判断 $1==sshd
然后再打印本行的行号等信息
[root@localhost ~]# cat /etc/passwd | awk 'BEGIN{FS=":"}$1=="sshd" {print $0}' |
简单判断功能:
将第2行,到第4行,的内容加起来,最后输出结果相加的结果
[root@localhost ~]# cat lyshark.log |
简单判断功能:
统计AGE列,将年龄小于25岁的任过滤出来,并显示 is young man!
[root@localhost ~]# cat lyshark.log |
简单判断功能:
统计LINUX列,当出现大于80分的,打印到屏幕上 is good man!
[root@localhost ~]# cat lyshark.log |