Linux三剑客及使用介绍
Linux 三剑客是(grep,sed,awk)三者的简称,他们通常结合正则一起使用。
grep擅长查找,sed擅长修改文件。awk擅长取列。
一、正则表达式
正则表达式:REGular EXPression, REGEXP
元字符:所谓元字符就是指那些在正则表达式中具有特殊意义的专用字符
元字符 | 功能 |
---|---|
. | 匹配任意单个字符 |
* | X* 匹配0或多个X字符 |
+ | X+ 匹配至少1个X字符 |
.* | 匹配任意多个字符 |
^ | 匹配首行 |
$ | 匹配行尾 |
^$ | 空行 |
\ | 屏蔽一个元字符的特殊含义 |
\< | 锚定词首,其后面的任意字符必须作为单词首部出现 |
\> | 锚定词尾,其前面的任意字符必须作为单词的尾部出现 |
\b | 单词界定符 |
test{n} | 匹配前面为tes后面接n个t的字符串 |
test{n,m} | 匹配前面为tes后面接n~m个t的字符串 |
test{n,} | 匹配前面为tes后面有n个以上(包含n)的t的字符串 |
(test){n} | 将test做完整体匹配有n个test相连的字符串 |
[abc] | 包含abc中任意一个字符 |
[^abc] | 不包含abc中的任意一个字符(取反) |
二、grep的介绍
grep 是一个文本过滤工具
egrp 支持扩展正则
options部分
- -v 显示不被pattern匹配到的行
- -o 仅显示匹配到的字符串
- -n 显示匹配的行号
- -i 忽略字符大小写
- -A n 显示后n行
- -B n 显示前n行
- -C n 显示上下n行
- -r 递归查找
案列:
[root@ou ~]# grep -n root /etc/passwd
1:root:x:0:0:root:/root:/bin/bash
10:operator:x:11:0:operator:/root:/sbin/nologin
过滤出行首为root的行:
[root@ou ~]# grep '^root' /etc/passwd
root:x:0:0:root:/root:/bin/bash
1、查找出当前passwd文件中以ftp或者mail开头的行,在屏幕上输出。
cat passwd|egrep "^ftp|^mail"|xargs echo
2、查找出来/etc/passwd文件里用户名包含liu同时使用bash的用户
awk -F: '$1 ~ /liu/&& $7 ~ /bash/ {print $0}' passwd
3、查找出不包含数字的行
grep -v "[0-9]"
4、查找出/var/log/secure里的ip地址出来
255.255.255.255
egrep "(([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])" /var/log/secure
5、写一个表示下面网址的正则表达式出来。例如:
http://www.baidu.com
http://www.sina.com
http://www.163.com
http://www.12306.cn
http://www.qillu.edu
egrep "http://([a-zA-Z0-9]+.)+[a-zA-Z]+"
egrep "https?://([a-zA-Z0-9]+.)+[a-zA-Z]+"
三、awk介绍
AWK 是一种处理文本文件的语言,是一个强大的文本分析工具。
awk
输入分隔符
-F 默认空白
输出分隔符
, 默认空格
-F : :指定分隔符
FS :输入分隔符
OFS :输出分隔符
$0 :整行
NR :行号 number of record
NF :一行的字段数量 number of field
cat /etc/passwd|tail -1|awk -F[:/] '{print $8}'
cat /etc/passwd |awk -F : 'BEGIN{num=0;print "开始统计 /etc/passwd文件"} $1 ~/root/ ||$3 > 1005 {print NR,NF,$1,length($1),$(NF-1),$NF,$3,++num}END{print "统计结束",num}'
awk和shell变量交换的问题
- 使用 -v选项
name=root
cat passwd |awk -F: -v name=$name '$1~name{print $0}'
- 使用双引号 ,但是awk内部的$0 1 等 1 等 1等符号前需要使用\转义
name=root
cat passwd| awk -F: “/^$name/{print $1, $3}”
- 使用单引号,将变量引起来,然后前面加一个$符号再次引用变量的值,相当于取2次值
sg=3
awk -F : '/root/{print $1,$'$sg'}' /etc/passwd
awk内置的函数:
-
length()
-
int()
-
sqrt()
-
system()
String Functions
-
sub()
-
index()
-
length()
-
split()
三元运算
先使用ifconfig,使用awk显示eth0的入站流量和出站流量(字节)
ifconfig |grep -A 7 "eth0"| awk '$4=="bytes"{print $1 == "RX"? "入站流量:": "出站流量:";print $5}'
练习
cat passwd |awk -F: '{print $(NF-1)}'
cat passwd |awk -F: 'NR >=5 && NR <=10{print $1}'
cat passwd |awk -F: '$7!~/bash/ {print $1}'
cat passwd |awk -F: 'NR~/5$/{print NR,$0}'
ifconfig|awk '$1=="inet"{print $2}'
ifconfig |grep -A 7 "eth0"| awk '$4=="bytes"{print $1 == "RX"? "入站流量:": "出站流量:";print $5}'
cat passwd |awk -F: 'BEGIN{sum=0; print "查询结果"}$1 ~ /^r/{print $1;sum++ }END{print sum}'
四、sed 介绍
是一种支持正则表达式的非交互式流编辑器
sed 可依照脚本的指令来处理、编辑文本文件。
Sed 主要用来自动编辑一个或多个文件、简化对文件的反复操作、编写转换程序等。
sed的常用选项
- -n: 只显示匹配处理的行(否则输出所有)
- -i: 直接在文件中进行修改,而不是输出到屏幕
- -r: 支持扩展正则表达式
- -e: 执行多个编辑命令时(一般用 ; 代替)
sed动作说明:
- s :替换 通常这个 s 的动作可以搭配正规表示法!例如 1,20s/old/new/g
- p :打印匹配行。通常 p 会与参数 sed -n 一起运行~
- d :删除指定行
- i :插入, i 的后面可以接字串,而这些字串会在新的一行出现(目前的上一行)
- a :新增, a 的后面可以接字串,而这些字串会在新的一行出现(目前的下一行)~
- c :取代, c 的后面可以接字串,这些字串可以取代 n1,n2 之间的行!
p命令输出的时候
- 1,5p 连续
- 1p;5p 不连续
- cat passwd -n |sed -n ‘5,+3p’ 后三行
- cat passwd -n |sed -n ‘5,100!p’ 取反
- cat passwd -n |sed -n ‘1~2p’ 从第一行开始,步长为2
sed 的空间模式
-
pattern space --》处理数据的地方–》处理一行数据后,模式空间会清空
-
hold space --》临时存放数据的地方
题目:查找nginx日志的access.log日志文件 09/Jan/2021:16:37:12 到 09/Jan/2021:16:51:45
cat access.log|sed -n '/09\/Jan\/2021:16:37:12/,/09\/Jan\/2021:16:51:45/p'
access.log中09/Jan/2021:16:37:12 和 09/Jan/2021:16:51:45 必须存在