三剑客日志处理系列

一、特殊符号

1.引号系列 必会

引号 含义
单引号 所见即所得,单引号里的内容会原封不动输出
双引号 和单引号类似,对双引号里面的特殊符号进行解析,对于{}花括号(通配符)没有解析
不加引号 和双引号类似,支持通配符
反引号 优先执行,先执行反引号里面的命令
[root@lnh ~]# echo '`hostname` 1234 $UID $(whoami) {1..5}'
`hostname` 1234 $UID $(whoami) {1..5}
[root@lnh ~]# echo "`hostname` 1234 $UID $(whoami) {1..5}"
lnh 1234 0 root {1..5}
[root@lnh ~]# echo `hostname` 1234 $UID $(whoami) {1..5}
lnh 1234 0 root 1 2 3 4 5

2.重定向符号

2.1概述

重定向:改变输出方向

2.2 重定向符号

重定向符号 含义 应用场景
> 或 1> 标准输出重定向:先清空文件,然后写入 大部分情况下下清空的时候可以使用,创建文件
>>或 1>> 标准输出追加重定向:直接写入到文件末尾 修改配置文件,表示追加的时候
2> 标准错误输出重定向:先清空文件,然后写入错误信息 较少使用
2>> 标准错误追加输出重定向:直接把错误写入到文件末尾 较少使用
>>oldboy.log 2>&1 无论对错都把结果写入到文件中 定时任务,脚本常用
&>> oldboy.log 无论对错都把结果写入到文件中 定时任务,脚本常用
< 或0< 标准输入重定向 搭配某几个命令使用xargs
<< 或0<< 标准输入追加重定向 与cat搭配使用,表示向文件写入多行内容
[root@lnh ~]# eccho 1>>oldboy.txt
-bash: eccho: command not found
[root@lnh ~]# cat oldboy.txt
[root@lnh ~]#
[root@lnh ~]# echo 1111 1>>oldboy.txt
[root@lnh ~]# cat oldboy.txt
1111
[root@lnh ~]# eccho 2>>oldboy.txt
[root@lnh ~]# cat oldboy.txt
1111
-bash: eccho: command not found
[root@lnh ~]# echo haha >> oldboy.txt 2>> oldboy.txt
[root@lnh ~]# cat oldboy.txt
1111
-bash: eccho: command not found
haha
[root@lnh ~]# eaacho haha >> oldboy.txt 2>> oldboy.txt
[root@lnh ~]# cat oldboy.txt
1111
-bash: eccho: command not found
haha
-bash: eaacho: command not found [root@lnh ~]# eaacho xixi >> oldboy.txt 2>&1
[root@lnh ~]# cat oldboy.txt
1111
-bash: eccho: command not found
haha
-bash: eaacho: command not found
-bash: eaacho: command not found
[root@lnh ~]# echo xixi >> oldboy.txt 2>&1
[root@lnh ~]# cat oldboy.txt
1111
-bash: eccho: command not found
haha
-bash: eaacho: command not found
-bash: eaacho: command not found
xixi [root@lnh ~]# echo lll &> echo.txt
[root@lnh ~]# cat echo.txt
lll
[root@lnh ~]# eqqcho lll &> echo.txt
[root@lnh ~]# cat echo.txt
-bash: eqqcho: command not found

定时任务中常用,同时记录错误信息和正确信息

用于与cat命令实现写入多行内容.
格式:
cat >文件结束标记
结束标记
结束标记两边不要有多余符号
一般都是事先写好,然后粘贴到命令行执行.
EOF End of File文件结束的缩写. [root@lnh ~]# cat >oldboy.txt <<EOF
> I
> LIKE
> Money
> EOF
[root@lnh ~]# cat oldboy.txt
I
LIKE
Money
[root@lnh ~]# cat <<EOF >oldboy.txt
> YOU
> LIKE
> Money
> EOF
[root@lnh ~]# cat oldboy.txt
YOU
LIKE
Money

3.通配符

用于Linux中大部分命令使用,用于批量找文件名

符号 含义
* 星号 所有
{}花括号 输出序列,与echo,touch,mkdir使用
[] 参考正则
[!] 取反
任意一个字符

3.1 {} 必会

[root@lnh ~]# echo {a..z}
a b c d e f g h i j k l m n o p q r s t u v w x y z
[root@lnh ~]# echo {01..10}
01 02 03 04 05 06 07 08 09 10
[root@lnh ~]# seq 1 3 10
1
4
7
10
[root@lnh ~]# echo {1..10..2}
1 3 5 7 9
[root@lnh ~]# touch oldboy.txt
[root@lnh ~]# cp oldboy.txt{,.bak}
[root@lnh ~]# ll
total 0
-rw-r--r-- 1 root root 0 Dec 23 11:29 oldboy.txt
-rw-r--r-- 1 root root 0 Dec 23 11:29 oldboy.txt.bak

3.2 ?

找出/bin目录下面命令,命令仅有2个字符组成.
[root@lnh ~]# ls -l /bin/??
-rwxr-xr-x. 1 root root 52640 Mar 24 2022 /bin/ab
-rwxr-xr-x. 1 root root 62680 Oct 2 2020 /bin/ar
-rwxr-xr-x. 1 root root 386424 Oct 2 2020 /bin/as
-rwxr-xr-x. 1 root root 83424 Jun 10 2014 /bin/bc

二、正则表达式与grep

1.正则概述

正则表达式: regular expression regexp

用于给linux三剑客,程序语言使用

使用正则表达式对字符进行过滤,使用三剑客实现日志的过滤

正则表达式本质式一些符号:^ $ ^$. * .* [] [^] | () + {} ? .

正则符号都是英文符号,避免使用中文符号

推荐使用grep/egrep命令,默认设置了别名,自动加上颜色

http://nbre.oldboylinux.cn/playground

2.正则与通配符区别

区别 用途 支持的命令不同
正则 匹配文件内容(匹配字符) 三剑客支持,开发语言
通配符 匹配文件名(命令参数) Linux大部分命令都支持

3.正则分类

分类 符号
基础正则BRE(basic RE) ^ $ ^$. * .* [] [^]
扩展正则ERE(Extended RE) | () + {} ?

4.基础正则

三剑客默认支持的正则

环境准备:

cat >/oldboy/re.txt <<EOF
I am oldboy teacher!
I teach linux.
I like badminton ball ,billiard ball and chinese
chess!
my blog is http:oldboy.blog.51cto.com
our size is http:blog.oldboyedu.com
my qq is 49000448
not 4900000448.
my god ,i am not oldbey,but OLDBOY!
EOF

4.1 ^ 以什么开头的行

#以m开头的行
[root@lnh oldboy]# grep '^m' re.txt
my blog is http://oldboy.blog.51cto.com
my qq is 49000448
my god ,i am not oldbey,but OLDBOY!

4.2 $ 以什么结尾的行

#以数字8结尾的行
[root@lnh oldboy]# grep '8$' re.txt
my qq is 49000448

cat -A 显示出文件中的特殊的隐藏符号

[root@lnh oldboy]# cat -A re.txt
I am oldboy teacher!$
I teach linux.$
$
I like badminton ball ,billiard ball and chinese chess!$
my blog is http://oldboy.blog.51cto.com $
our size is http://blog.oldboyedu.com $
$
my qq is 49000448$
not 4900000448.$
$
my god ,i am not oldbey,but OLDBOY!$

4.3 ^$ 空行,这行中没有任何字符

#过滤出文件中的空行并显示行号
[root@lnh oldboy]# grep -n '^$' re.txt
3:
7:
10:
#排除空行
[root@lnh oldboy]# grep -nv '^$' re.txt
1:I am oldboy teacher!
2:I teach linux.
4:I like badminton ball ,billiard ball and chinese chess!
5:my blog is http://oldboy.blog.51cto.com
6:our size is http://blog.oldboyedu.com
8:my qq is 49000448
9:not 4900000448.
11:my god ,i am not oldbey,but OLDBOY! #正则案例:排除/etc/ssh/sshd_config文件中的空行,然后排除以#号开头的行(可以使用管道)
[root@lnh oldboy]# grep -v '^$' /etc/ssh/sshd_config |grep -v '^#'
HostKey /etc/ssh/ssh_host_rsa_key
HostKey /etc/ssh/ssh_host_ecdsa_key
HostKey /etc/ssh/ssh_host_ed25519_key
SyslogFacility AUTHPRIV
AuthorizedKeysFile .ssh/authorized_keys
PasswordAuthentication yes
ChallengeResponseAuthentication no
GSSAPIAuthentication yes
GSSAPICleanupCredentials no
UsePAM yes
X11Forwarding yes
AcceptEnv LANG LC_CTYPE LC_NUMERIC LC_TIME LC_COLLATE LC_MONETARY LC_MESSAGES
AcceptEnv LC_PAPER LC_NAME LC_ADDRESS LC_TELEPHONE LC_MEASUREMENT
AcceptEnv LC_IDENTIFICATION LC_ALL LANGUAGE
AcceptEnv XMODIFIERS
Subsystem sftp /usr/libexec/openssh/sftp-server

4.4 . 任意一个字符,不匹配空行

[root@lnh oldboy]# grep '.$' re.txt
I am oldboy teacher!
I teach linux.
I like badminton ball ,billiard ball and chinese chess!
my blog is http://oldboy.blog.51cto.com
our size is http://blog.oldboyedu.com
my qq is 49000448
not 4900000448.
my god ,i am not oldbey,but OLDBOY!

4.5 \撬棍 转义字符,脱掉马甲打回原形,去掉特殊符号的含义

#找出文件中以.(点)结尾的行
[root@lnh oldboy]# grep '\.$' re.txt
I teach linux.
not 4900000448.

4.6 * 前一个字符连续出现0次或0次以上

[root@lnh oldboy]# grep '0*' re.txt
I am oldboy teacher!
I teach linux. I like badminton ball ,billiard ball and chinese chess!
my blog is http://oldboy.blog.51cto.com
our size is http://blog.oldboyedu.com my qq is 49000448
not 4900000448. my god ,i am not oldbey,but OLDBOY!

4.7 .* 所有,任何字符

  • . 任意一个字符
  • * 前一个字符连续出现0次或0次以上
  • .* 表示所有
#以任意内容开头直到匹配到am字符的行
[root@lnh oldboy]# grep '^.*am' re.txt
I am oldboy teacher!
my god ,i am not oldbey,but OLDBOY!

补充:贪婪性

正则表示连续出现的时候或者表示所有的是后续,正则体现出贪婪性,尽可能多的匹配

#匹配开头一直到o的内容
[root@lnh oldboy]# grep '.*o' re.txt
I am oldboy teacher!
I like badminton ball ,billiard ball and chinese chess!
my blog is http://oldboy.blog.51cto.com
our size is http://blog.oldboyedu.com
not 4900000448.
my god ,i am not oldbey,but OLDBOY!

4.8 [] [abc] 表示匹配任意1个字符,a或b或c,中括号相当于一个字符

[root@lnh oldboy]# grep '[abc]' re.txt
I am oldboy teacher!
I teach linux.
I like badminton ball ,billiard ball and chinese chess!
my blog is http://oldboy.blog.51cto.com
our size is http://blog.oldboyedu.com
my god ,i am not oldbey,but OLDBOY! #匹配数字
[root@lnh oldboy]# grep '[0-9]' re.txt
#匹配大小写字母
[root@lnh oldboy]# grep '[a-Z]' re.txt
#匹配大小写字母和数字
[root@lnh oldboy]# grep '[0-Z]' re.txt #匹配出以字母m或n开头的行
[root@lnh oldboy]# grep '^[mn]' re.txt
my blog is http://oldboy.blog.51cto.com
my qq is 49000448
not 4900000448.
my god ,i am not oldbey,but OLDBOY!
#匹配出以.或空格或!结尾的行
[root@lnh oldboy]# grep '[. !]$' re.txt
I am oldboy teacher!
I teach linux.
I like badminton ball ,billiard ball and chinese chess!
my blog is http://oldboy.blog.51cto.com
our size is http://blog.oldboyedu.com
not 4900000448.
my god ,i am not oldbey,but OLDBOY!

提示:

[] 中会自动去掉符号的特殊含义

4.9 [^] [^abc] 表示匹配任意1个字符,排除abc,中括号相当于一个字符

[root@lnh oldboy]# grep '[^abc]' re.txt
I am oldboy teacher!
I teach linux.
I like badminton ball ,billiard ball and chinese chess!
my blog is http://oldboy.blog.51cto.com
our size is http://blog.oldboyedu.com
my qq is 49000448
not 4900000448.
my god ,i am not oldbey,but OLDBOY!

grep -w 精确匹配

[root@lnh ~]# cat num.txt
22
333344422
2222
222222
[root@lnh ~]# grep '22' num.txt
22
333344422
2222
222222
[root@lnh ~]# grep -w '22' num.txt
22

小结:

基础正则 含义
^ 以什么开头
$ 以什么结尾
^$ 空行
. 任意一个字符
\ 转义字符,撬棍
* 前一个字符出现0次或0次以上
.* 所有
[] [abc]a或b或c
[^] [^abc]匹配除了abc之外的内容

5.扩展正则

Linux三剑客如何支持扩展正则

#grep
egrep '0+' re.txt
grep -E '0+' re.txt
grep '0\+' re.txt
#sed
需要使用-r选项
#awk
直接支持扩展正则

5.1 + 前一个字符连续出现1次或1次以上

#取出连续出现的0
[root@lnh oldboy]# egrep '0+' re.txt
my qq is 49000448
not 4900000448. #取出连续出现的数字
[root@lnh oldboy]# egrep '[0-9]+' re.txt
my blog is http://oldboy.blog.51cto.com
my qq is 49000448
not 4900000448. #取出连续出现的字母(单词)
[root@lnh oldboy]# egrep '[a-Z]+' re.txt
I am oldboy teacher!
I teach linux.
I like badminton ball ,billiard ball and chinese chess!
my blog is http://oldboy.blog.51cto.com
our size is http://blog.oldboyedu.com
my qq is 49000448
not 4900000448.
my god ,i am not oldbey,but OLDBOY! #案例: 统计re.txt文件中每个单词的出现次数.
[root@lnh oldboy]# egrep -o '[a-Z]+' re.txt |sort|uniq -c |sort -rn|head
3 my
3 is
3 I
3 blog
2 oldboy
2 not
2 http
2 com
2 ball
2 am

5.2 | 或者

#文件中包含oldboy或linux的行
[root@lnh oldboy]# egrep 'oldboy|linux' re.txt
I am oldboy teacher!
I teach linux.
my blog is http://oldboy.blog.51cto.com
our size is http://blog.oldboyedu.com
#在/etc/services过滤出包含ssh或http或smtp的行
[root@lnh oldboy]# egrep 'ssh|http|smtp' /etc/services
# http://www.iana.org/assignments/port-numbers
ssh 22/tcp # The Secure Shell (SSH) Protocol
ssh 22/udp # The Secure Shell (SSH) Protocol
smtp 25/tcp mail
smtp 25/udp mail #排除/etc/ssh/sshd_config中的空行或注释,输出的时候显示行号
[root@lnh oldboy]# grep -v '^$' /etc/ssh/sshd_config |grep -v '^#'
[root@lnh oldboy]# egrep -nv '^$|^#' /etc/ssh/sshd_config
#一些配置文件中有空行,以#开头的行,不带注释的正常的行以字母开头的行
[root@lnh oldboy]# grep '^[a-Z]' /etc/ssh/sshd_config

5.3 () 表示一个整体 ,用于表示后向引用

#检查系统中tree,vim,sl软件是否安装.
[root@lnh oldboy]# rpm -qa |egrep '^(tree|vim|sl)'
tree-1.6.0-10.el7.x86_64
slang-2.2.4-11.el7.x86_64
vim-minimal-7.4.629-7.el7.x86_64
vim-common-7.4.629-8.el7_9.x86_64
vim-filesystem-7.4.629-8.el7_9.x86_64
vim-enhanced-7.4.629-8.el7_9.x86_64
sl-5.02-1.el7.x86_64

5.4 {} a{n,m} 前一个字符连续出现至少n次,最多m次

格式 应用
a{n,m} 前一个字符连续出现至少n次,最多m次 表示连续出现的范围
a{n} 前一个字符连续出现n次 匹配固定的次数
a{n,} 前一个字符连续出现至少n次
a{,m} 前一个字符出现最多m次
[root@lnh oldboy]# egrep '0{1,5}' re.txt
my qq is 49000448
not 4900000448.
[root@lnh oldboy]# egrep -o '0{2,3}' re.txt
000
000
00
#匹配身份证的正则
18位 数字或X
X在最后一位 [root@lnh oldboy]# cat id.txt
谈媚轩 230189199012251659
庾菲刚 23018199012015108
桑春 23018215507074953
范惠融 230182197510240695
霍莎 23018219590413055X
单燕可 230182197007233320
雷聪 23018215709180586
郑芬澜 23018199402088233
阙宁茜 230182198305100379
赵璧桂 23018195312204747
史勤 23018218107207651
项珠 230182195305221943
季艳盛 230182195604045725
吕进 230182196412284021
翟竹静 230182196102271858
翟竹静 23018219610227
翟竹静 2301821922
翟竹静 230181922 [root@lnh oldboy]# egrep '[0-9]{17}[0-9X]$' id.txt
谈媚轩 230189199012251659
范惠融 230182197510240695
霍莎 23018219590413055X
单燕可 230182197007233320
阙宁茜 230182198305100379
项珠 230182195305221943
季艳盛 230182195604045725
吕进 230182196412284021
翟竹静 230182196102271858
#匹配ip的正则
#创建环境
[root@lnh oldboy]# echo 10.0.0.{1..254} |xargs -n1 > ip.txt
[root@lnh oldboy]# egrep '[0-9]{1,3}$' ip.txt

5.5 ? 前一个字符 出现0次或1次

一般用于匹配的内容可能有(出现1次)或者没有出现(出现0次)

[root@lnh oldboy]# cat good.txt
gd
goood
god
good
[root@lnh oldboy]# egrep 'go?d' good.txt
gd
god

小结

扩展正则 含义
+ 前一个字符连续出现1次或多次
| 或者
() 表示整体, 后向引用或反向引用
{} a{n,m} 前一个字符连续出现至少n次,最多m次
前一个字符出现0次或1次

6.perl语言正则表达式

符号 含义
\d digit 数字 [0-9]
\s 匹配的空字符 空格 tab 等等
\w word 数字,字母[0-9a-zA-Z_]
\D [^0-9] 排除数字
\S 非空字符
\W 排除数字,大小写字母和_
[root@lnh ~]# grep -P '\d' /oldboy/re.txt
my blog is http:oldboy.blog.51cto.com
my qq is 49000448
not 4900000448.

7. 零碎的正则 括号表达式 了解

[root@lnh ~]# grep '[[:alnum:]]' /oldboy/re.txt
I am oldboy teacher!
I teach linux.
I like badminton ball ,billiard ball and chinese
chess!
my blog is http:oldboy.blog.51cto.com
our size is http:blog.oldboyedu.com
my qq is 49000448
not 4900000448.
my god ,i am not oldbey,but OLDBOY!

三、 sed命令

1.概述

核心功能:取行、过滤、替换修改文件内容

后向引用(截取)

sed stream editor 流编辑器

2.格式

命令 选项 详细格式 参数
sed 选项 '条件动作' <br /
条件,匹配哪一行,哪些行
文件
'找谁干啥'
动作,增删改查
选项 说明
-n 取消默认输出
-r sed支持扩展正则
-i 修改文件内容,这个选项放在最后
-i.bak 先进行备份,然后修改文件内容

3.sed 如何运行

4.sed增删改查---查找

一种是类似于grep的模糊查找

一种是精确查找,行号

#取出文件的第3行
[root@lnh ~]# sed -n '3p' passwd
daemon:x:2:2:daemon:/sbin:/sbin/nologin -n表示取消默认输出,sed处理文件的时候会默认的输出每一行内容 #取出/etc/passwd的第2行到第5行
[root@lnh ~]# sed -n '2,5p' passwd
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin #过滤出/etc/passwd中包含root的行
[root@lnh ~]# sed -n '/root/p' passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin

sed进行过滤的时候需要使用 // 并且支持基础正则

如果需要使用扩展正则则需要sed -r 选项

#获取范围内的日志
cat >/oldboy/sed.txt<<EOF
101,oldboy,CEO
102,bigbao,CTO
103,李导996,COO
104,yy,CFO
105,feixue,CIO
110,lidao,COCO
EOF [root@lnh ~]# sed -n '/102/,/105/p' /oldboy/sed.txt
102,bigbao,CTO
103,李导996,COO
104,yy,CFO
105,feixue,CIO sed -n '/从哪里来/,/到哪里去/p' sed.txt
#只显示第3行和第5行
[root@lnh ~]# sed -n '1p;5p' /etc/passwd
root:x:0:0:root:/root:/bin/bash
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin #有规律的查找
[root@lnh ~]# seq 10 |sed -n '1~2p' #从1开始,每次增加2行
1
3
5
7
9

5.sed增删改查---修改(替换)

#把sed.txt文件中lidao替换为oldboy
[root@lnh ~]# cd /oldboy/
[root@lnh oldboy]# cat sed.txt
101,oldboy,CEO
102,bigbao,CTO
103,李导996,COO
104,yy,CFO
105,feixue,CIO
110,lidao,COCO
[root@lnh oldboy]# sed 's#lidao#oldboy#g' sed.txt
101,oldboy,CEO
102,bigbao,CTO
103,李导996,COO
104,yy,CFO
105,feixue,CIO
110,oldboy,COCO [root@lnh oldboy]# sed 's#[0-9]##g' sed.txt #全局替换
,oldboy,CEO
,bigbao,CTO
,李导,COO
,yy,CFO
,feixue,CIO
,lidao,COCO
[root@lnh oldboy]# sed 's#[0-9]##' sed.txt #非全局替换
01,oldboy,CEO
02,bigbao,CTO
03,李导996,COO
04,yy,CFO
05,feixue,CIO
10,lidao,COCO

sed命令替换格式说明:

sed 's#找谁#替换成什么#g' sed.txt

推荐使用:### @@@ ///

s substitute 替换

g global 全局替换,这一行中把所有匹配到的内容都进行替换,否则只替换每一行第1个

#修改文件内容
[root@lnh oldboy]# sed -i 's#lidao#oldboy#g' sed.txt
[root@lnh oldboy]# cat sed.txt
101,oldboy,CEO
102,bigbao,CTO
103,李导996,COO
104,yy,CFO
105,feixue,CIO
110,oldboy,COCO -i 修改文件内容
#修改文件内容之前进行备份,然后修改文件内容
[root@lnh ~]# ll
total 28
-rw------- 1 root root 2791 Dec 17 18:35 nohup.out
-rw-r--r-- 1 root root 1262 Dec 26 19:20 passwd
-rw-r--r-- 1 root root 90 Dec 27 14:42 sed.txt
-rwxr-xr-x 1 root root 8648 Dec 15 10:04 zombine
-rw-r--r-- 1 root root 591 Dec 15 09:56 zombine.c
[root@lnh ~]# sed -i.bak 's#103#999#g' sed.txt
[root@lnh ~]# ll
total 32
-rw------- 1 root root 2791 Dec 17 18:35 nohup.out
-rw-r--r-- 1 root root 1262 Dec 26 19:20 passwd
-rw-r--r-- 1 root root 90 Dec 27 14:42 sed.txt
-rw-r--r-- 1 root root 90 Dec 27 14:42 sed.txt.bak
-rwxr-xr-x 1 root root 8648 Dec 15 10:04 zombine
-rw-r--r-- 1 root root 591 Dec 15 09:56 zombine.c
[root@lnh ~]# cat sed.txt
101,oldboy,CEO
102,bigbao,CTO
999,李导996,COO
104,yy,CFO
105,feixue,CIO
110,oldboy,COCO
[root@lnh ~]# cat sed.txt.bak
101,oldboy,CEO
102,bigbao,CTO
103,李导996,COO
104,yy,CFO
105,feixue,CIO
110,oldboy,COCO 一般用于替换某一个文件,如果是多个文件就打包压缩进行备份即可

-i 一般放在sed命令最后

6.sed增删改查---替换进阶

6.1 后向引用格式

应用说明:

后向引用或反向引用:适用于sed命令处理/提取一行中的某一部分。sed命令配合正则实现取列

使用格式:

使用替换的形式 s###g

前2个#之间通过正则与(),对数据进行分组

后2个#之间通过\数字,去调用前面分组的内容

整体是后面调用前面分组的内容,称之为反向引用/后向引用

应用场景:

某一行中对部分数据进行加工与处理,提取某一部分的数据

6.2 基本使用

#输出12345678,通过sed加工变成1<234567>8
[root@lnh ~]# echo 12345678 |sed -r 's#(1)(.*)(8)#\1 <\2> \3#g'
1 <234567> 8 #调换/etc/passwd第1列和最后一列内容
[root@lnh ~]# sed -r 's#^(.*)(:.*:)(.*)$#\3\2\1#g' passwd
/bin/bash:/root:root:x:0:0:root
/sbin/nologin:/bin:bin:x:1:1:bin
/sbin/nologin:/sbin:daemon:x:2:2:daemon
/sbin/nologin:/var/adm:adm:x:3:4:adm #取出网卡ip地址
[root@lnh ~]# ip a s eth0 #ip address show eth0
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 00:0c:29:72:55:cf brd ff:ff:ff:ff:ff:ff
inet 10.0.0.200/24 brd 10.0.0.255 scope global noprefixroute eth0
valid_lft forever preferred_lft forever
inet6 fe80::c78c:d46d:5579:381f/64 scope link noprefixroute
valid_lft forever preferred_lft forever
[root@lnh ~]# ip a s eth0 |sed -n '3p'|sed -r 's#^.*net (.*)/.*$#\1#g'
10.0.0.200
[root@lnh ~]# hostname -I |awk '{print $1}'
10.0.0.200 # 取出stat /etc/hosts中的0644或644
[root@lnh ~]# stat /etc/hosts |sed -n '4p'|sed -r 's#^.*\(([0-9]+)(/.*)$#\1#g'
0644
[root@lnh ~]# stat /etc/hosts |sed -n '4p'|sed -r 's#^.*\(0([0-9]+)(/.*)$#\1#g'
644 [root@lnh ~]# echo {1..9} |sed 's# [0-9] #<&>#g'
<1> <2> <3> <4> <5> <6> <7> <8> <9>

7.增删改查---删除

d delete sed命令删除功能按照行为单位进行

如果仅仅删除某一行的一些字符,推荐使用's#[a-z]##g'

[root@lnh ~]# cat sed.txt
101,oldboy,CEO
102,bigbao,CTO
999,李导996,COO
104,yy,CFO
105,feixue,CIO
110,oldboy,COCO
[root@lnh ~]# sed '3d' sed.txt
101,oldboy,CEO
102,bigbao,CTO
104,yy,CFO
105,feixue,CIO
110,oldboy,COCO #排除/删除文件中的空行和带注释的行
[root@lnh ~]# sed -r '/^$|^#/d' /etc/ssh/sshd_config
HostKey /etc/ssh/ssh_host_rsa_key
HostKey /etc/ssh/ssh_host_ecdsa_key
HostKey /etc/ssh/ssh_host_ed25519_key
SyslogFacility AUTHPRIV
AuthorizedKeysFile .ssh/authorized_keys
PasswordAuthentication yes
ChallengeResponseAuthentication no
GSSAPIAuthentication yes
GSSAPICleanupCredentials no
UsePAM yes
X11Forwarding yes
AcceptEnv LANG LC_CTYPE LC_NUMERIC LC_TIME LC_COLLATE LC_MONETARY LC_MESSAGES
AcceptEnv LC_PAPER LC_NAME LC_ADDRESS LC_TELEPHONE LC_MEASUREMENT
AcceptEnv LC_IDENTIFICATION LC_ALL LANGUAGE
AcceptEnv XMODIFIERS
Subsystem sftp /usr/libexec/openssh/sftp-server
[root@lnh ~]# sed -nr '/^$|^#/!p' /etc/ssh/sshd_config

8.增删改查---增加

cai:

a append 在指定的行后面追加内容

i insert 在指定的行上面插入一行

c replace 替换指定行的内容

[root@lnh ~]# cat sed.txt
101,oldboy,CEO
102,bigbao,CTO
999,李导996,COO
104,yy,CFO
105,feixue,CIO
110,oldboy,COCO
[root@lnh ~]# sed '3a hahahaha' sed.txt
101,oldboy,CEO
102,bigbao,CTO
999,李导996,COO
hahahaha
104,yy,CFO
105,feixue,CIO
110,oldboy,COCO
[root@lnh ~]# sed '3i hahahaha' sed.txt
101,oldboy,CEO
102,bigbao,CTO
hahahaha
999,李导996,COO
104,yy,CFO
105,feixue,CIO
110,oldboy,COCO
[root@lnh ~]# sed '3c hahahaha' sed.txt
101,oldboy,CEO
102,bigbao,CTO
hahahaha
104,yy,CFO
105,feixue,CIO
110,oldboy,COCO

四、awk命令

1.概述

四剑客 特点 擅长
find 查找文件 查找文件
grep/egrep 过滤 过滤速度最快
sed 过滤,取行,替换,删除 替换,修改文件内容,取行
awk 过滤,取行,取列,统计计算,判断,循环 取列,取行,统计计算

2.格式

awk 选项 '条件{动作}' 文件名

条件 找谁

动作 干啥

3.执行流程

4.取行

#取出/etc/passwd的第1行
[root@lnh ~]# awk 'NR==1{print $0}' passwd
root:x:0:0:root:/root:/bin/bash
[root@lnh ~]# awk 'NR==1' passwd
root:x:0:0:root:/root:/bin/bash #输出行号
[root@lnh ~]# awk 'NR==1{print NR,$0}' passwd

NR Number of Record 记录号,行号

== 表示等于

{print $0} 输出整行内容 $0 表示当前行的内容。 awk满足条件后默认的动作,输出这一行的内容

#取出第2行到第5行的内容
[root@lnh ~]# awk 'NR>=2 && NR<=5' passwd
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
awk常用的运算符 说明
== 等于
!= 不等于
> 大于
>= 大于等于
< 小于
<= 小于等于
&& 并且
|| 或者
#过滤出/etc/passwd文件中包含root或nobody的行
[root@lnh ~]# awk '/root|nobody/' passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
nobody:x:99:99:Nobody:/:/sbin/nologin #从包含root的行到包含nobody的行
[root@lnh ~]# awk '/root/ , /nobody/' passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
nobody:x:99:99:Nobody:/:/sbin/nologin

5.取列

#使用awk取出ls -lh 的 大小列 和 最后一列
[root@lnh ~]# ll -h |awk '{print $5,$9}' 60 blank.txt
2.1K datafile
551 df.txt
477 fstab
2.8K nohup.out
1.3K passwd
93 sed.txt
90 sed.txt.bak
145 shouji.txt
8.5K zombine
591 zombine.c
[root@lnh ~]# ll -h |awk '{print $5"\t"$9}' 60 blank.txt
2.1K datafile
551 df.txt
477 fstab
2.8K nohup.out
1.3K passwd
93 sed.txt
90 sed.txt.bak
145 shouji.txt
8.5K zombine
591 zombine.c [root@lnh ~]# ll -h |awk '{print $5,$9}'|column -t
60 blank.txt
2.1K datafile
551 df.txt
477 fstab
2.8K nohup.out
1.3K passwd
93 sed.txt
90 sed.txt.bak
145 shouji.txt
8.5K zombine
591 zombine.c

awk取列说明:

$数字,表示取列

$NF 最后一列

NF Number of Field 每行有多少列

$(NF-1) 取出倒数第2列

awk 输出与对齐

使用column 命令或者使用\t

#取出/etc/passwd中的第1列,第3列和最后一列
[root@lnh ~]# awk -F ':' '{print $1,$3,$NF}' passwd |column -t
root 0 /bin/bash
bin 1 /sbin/nologin
daemon 2 /sbin/nologin
adm 3 /sbin/nologin
lp 4 /sbin/nologin
sync 5 /bin/sync
shutdown 6 /sbin/shutdown #指定复杂分隔符取出ip
[root@lnh ~]# ip a s eth0|awk 'NR==3'|awk -F '[ /]+' '{print $3}'
10.0.0.200 inet前面有4个空格,所以正则要有加号

6.取行取列

#取行+取列 取ip地址
[root@lnh ~]# ip a s eth0|awk -F '[ /]+' 'NR==3{print $3}'
10.0.0.200 #取出权限部分 stat /etc/hosts的0644部分
[root@lnh ~]# stat /etc/hosts|awk -F '[(/]' 'NR==4{print $2}'
0644 #取出/etc/passwd文件中第3列大于大于1000的行,取出这行的第1列,第3列和最后一列
[root@lnh ~]# awk -F ':' '$3>1000{print $1,$3,$NF}' passwd #如果系统swap使用超过0则输出"异常系统开始占用swap"
[root@lnh ~]# free |awk 'NR==3 && $3==0 {print "swap占用,系统异常,请尽快排查"}'
swap占用,系统异常,请尽快排查 #过滤出/etc/passwd第4列的数字是以0或1开头的行,输出第1列,第4列,最后一列
[root@lnh ~]# awk -F ':' '$4 ~ /^[01]/ {print $1,$4,$NF}' passwd |column -t
root 0 /bin/bash
bin 1 /sbin/nologin
sync 0 /bin/sync
shutdown 0 /sbin/shutdown
halt 0 /sbin/halt
mail 12 /sbin/nologin
operator 0 /sbin/nologin
games 100 /sbin/nologin
systemd-network 192 /sbin/nologin
abrt 173 /sbin/nologin
mysql 1314 /sbin/nologin
oldboy 1315 /bin/bash

提示: awk 中,通过~可以实现对某一列进行过滤

某一列中含有XXXX内容

  • ~ 表示包含的意思 $1 ~ /root/ 表示第1列中包含root
  • !~ 表示不包含

7.awk 统计与计算

awk进行统计有2类案例

  1. 类似于 wc -l统计次数
  2. 进行求和,累加

7.1 统计次数

i=i+1  先计算i+1然后把结果存放到i中

i=i+1     i值      i=i+1值    i计算后的内容
第1行 空/0 i=0+1 i=1
第2行 1 i=1+1 i=2
第3行 2 i=2+1 i=3 [root@lnh ~]# awk '{i=i+1}END{print i}' passwd
27
[root@lnh ~]# awk '{i++}END{print i}' passwd
27

END{} 内容会在awk读取完成文件的时候执行

END{} 一般用于输出执行结果

i=i+1 ==== i++

7.2 计算总和

i=i+$1
$1 i i=i+$1 i结果
第1行 1 空 i=0+1 i=1
第2行 2 1 i=1+2 i=3
第3行 3 3 i=3+3 i=6
第4行 4 6 i=6+4 i=10 [root@lnh ~]# seq 10 |awk '{sum=sum+$1}END{print sum}'
55 i=i+$1 === i+=$1

Linux三剑客日志处理系列的更多相关文章

  1. Linux实战教学笔记12:linux三剑客之sed命令精讲

    第十二节 linux三剑客之sed命令精讲 标签(空格分隔): Linux实战教学笔记-陈思齐 ---更多资料点我查看 1,前言 我们都知道,在Linux中一切皆文件,比如配置文件,日志文件,启动文件 ...

  2. 明明白白你的Linux服务器——日志篇

    日志对于安全来说,非常重要,它记录了系统每天发生的各种各样的事情,你可以通过他来检查错误发生的原因,或者受到攻击时攻击者留下的痕迹.日志主要的功能有:审计和监测.他还可以实时的监测系统状态,监测和追踪 ...

  3. 就linux三剑客简单归纳

    就linux三剑客简单归纳: :awk 习题1:用 awk 中查看服务器连接状态并汇总 netstat -an|awk '/^tcp/{++s[$NF]}END{for(a in s)print a, ...

  4. (转)不看绝对后悔的Linux三剑客之sed实战精讲

    不看绝对后悔的Linux三剑客之sed实战精讲 原文:http://blog.51cto.com/hujiangtao/1923718 二.Linux三剑客之sed命令精讲 1,前言 我们都知道,在L ...

  5. Linux(8):linux三剑客sed和awk & Shell 编程(1)

    linux 三剑客 之 sed # sed 是什么? # sed : 字符流编辑器 Stream Editor: sed 擅长 替换.取行等 # sed 的功能与版本: 处理纯文本文件.日志.配置文件 ...

  6. Linux学习日志——基本指令②

    文章目录 Linux学习日志--基本指令② 前言 touch cp (copy) mv (move) rm vim 输出重定向(> 或 >>) cat df(disk free) f ...

  7. Linux 三剑客之 awk 实战详解教程

    我们知道 Linux 三剑客,它们分别是:grep.sed.awk.在前边已经讲过 grep 和 sed,没看过的同学可以直接点击阅读,今天要分享的是更为强大的 awk. sed 可以实现非交互式的字 ...

  8. 性能工具之linux常见日志统计分析命令

    引言 我前几天写过的性能工具之linux三剑客awk.grep.sed详解,我们已经详细介绍 linux 三剑客的基本使用,接下来我们看看具体在性能测试领域的运用,本文主要介绍的是在 Tomcat 和 ...

  9. 【linux草鞋应用编程系列】_6_ 重定向和VT100编程

    一.文件重定向     我们知道在linux shell 编程的时候,可以使用文件重定向功能,如下所示: [root@localhost pipe]# echo "hello world&q ...

  10. 【linux草鞋应用编程系列】_5_ Linux网络编程

    一.网络通信简介   第一部分内容,暂时没法描述,内容实在太多,待后续专门的系列文章.   二.linux网络通信     在linux中继承了Unix下“一切皆文件”的思想, 在linux中要实现网 ...

随机推荐

  1. 可编程渲染管线(Scriptable Render Pipeline, SRP)

    原文链接 可编程渲染管线处理数据的流程可分为以下3大阶段 1. 应用阶段 这个阶段大概会由CPU处理4件事情.首先会对模型数据进行可见性判断.模型数据由顶点位置.法线方向.顶点颜色.纹理坐标等构成.然 ...

  2. 1.docker的基本使用

    1.简介 Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的镜像中,然后发布到任何流行的 Linux或Windows操作系统的机器上,也可以实现虚拟化.容器是完 ...

  3. MLP(SGD or Adam) Perceptron Neural Network Working by Pytorch(including data preprocessing)

    通过MLP多层感知机神经网络训练模型,使之能够根据sonar的六十个特征成功预测物体是金属还是石头.由于是简单的linearr线性仿射层,所以网络模型的匹配度并不高. 这是我的第一篇随笔,就拿这个来练 ...

  4. springboot使用jira-rest-java-client-api集成jira,自定义对查询board和sprint的支持

    公司内部使用jira作项目管理,我接到新的需求,要在测试报告上获取jira的所有项目,再根据项目获取board看板,再根据看板获取Sprint,最后获取未完成的bug信息.效果如下: 第一次接入jir ...

  5. Go语言核心36讲27

    在前面的文章中,我们一起学习了Go程序测试的基础知识和基本测试手法.这主要包括了Go程序测试的基本规则和主要流程.testing.T类型和testing.B类型的常用方法.go test命令的基本使用 ...

  6. linux内核中的likely与unlikely

    前言 内核版本:linux 4.9.x.在linux内核中,经常可以看见if( likely(x))或if( unlikely(x))的语句,本文将基于likely和unlikely的定义和作用进行一 ...

  7. CAP 7.0 版本发布通告 - 支持延迟消息,性能炸了?

    前言 今天,我们很高兴宣布 CAP 发布 7.0 版本正式版,我们在这个版本中带来了大批新特性以及对性能的优化和改进. 自从今年 1月份发布 6.0 版本以来,已经过去了快1年的时间.在过去的将近1年 ...

  8. Spring03:案例转账功能(事务问题)、动态代理解决、AOP

    今日内容--核心2AOP 完善Account案例 分析案例中的问题 回顾之前讲过的技术--动态代理 动态代理的另一种实现方式 解决案例中的问题 AOP的概念 Spring中的AOP相关术语 Sprin ...

  9. 【大数据面试】Flink 03-窗口、时间语义和水印、ProcessFunction底层API

    三.窗口 1.窗口的介绍 (1)含义 将无限的流式数据切割为有限块处理,以便于聚合等操作 (2)图解 2.窗口的分类 (1)按性质分 Flink 支持三种划分窗口的方式,time.count和会话窗口 ...

  10. HDOJFatmouse肥鼠交易//c++控制保留小数

    贪心算法.我就不贴题了//no.1009 但是我的代码运行超时了-改了好久都不对- 看别人代码,顺便学习c++控制保留小数怎么操作; 我的错误代码:(时间占用可能是多次调用findmax造成的) #i ...