Linux三剑客日志处理系列
三剑客日志处理系列
一、特殊符号
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类案例
- 类似于 wc -l统计次数
- 进行求和,累加
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三剑客日志处理系列的更多相关文章
- Linux实战教学笔记12:linux三剑客之sed命令精讲
第十二节 linux三剑客之sed命令精讲 标签(空格分隔): Linux实战教学笔记-陈思齐 ---更多资料点我查看 1,前言 我们都知道,在Linux中一切皆文件,比如配置文件,日志文件,启动文件 ...
- 明明白白你的Linux服务器——日志篇
日志对于安全来说,非常重要,它记录了系统每天发生的各种各样的事情,你可以通过他来检查错误发生的原因,或者受到攻击时攻击者留下的痕迹.日志主要的功能有:审计和监测.他还可以实时的监测系统状态,监测和追踪 ...
- 就linux三剑客简单归纳
就linux三剑客简单归纳: :awk 习题1:用 awk 中查看服务器连接状态并汇总 netstat -an|awk '/^tcp/{++s[$NF]}END{for(a in s)print a, ...
- (转)不看绝对后悔的Linux三剑客之sed实战精讲
不看绝对后悔的Linux三剑客之sed实战精讲 原文:http://blog.51cto.com/hujiangtao/1923718 二.Linux三剑客之sed命令精讲 1,前言 我们都知道,在L ...
- Linux(8):linux三剑客sed和awk & Shell 编程(1)
linux 三剑客 之 sed # sed 是什么? # sed : 字符流编辑器 Stream Editor: sed 擅长 替换.取行等 # sed 的功能与版本: 处理纯文本文件.日志.配置文件 ...
- Linux学习日志——基本指令②
文章目录 Linux学习日志--基本指令② 前言 touch cp (copy) mv (move) rm vim 输出重定向(> 或 >>) cat df(disk free) f ...
- Linux 三剑客之 awk 实战详解教程
我们知道 Linux 三剑客,它们分别是:grep.sed.awk.在前边已经讲过 grep 和 sed,没看过的同学可以直接点击阅读,今天要分享的是更为强大的 awk. sed 可以实现非交互式的字 ...
- 性能工具之linux常见日志统计分析命令
引言 我前几天写过的性能工具之linux三剑客awk.grep.sed详解,我们已经详细介绍 linux 三剑客的基本使用,接下来我们看看具体在性能测试领域的运用,本文主要介绍的是在 Tomcat 和 ...
- 【linux草鞋应用编程系列】_6_ 重定向和VT100编程
一.文件重定向 我们知道在linux shell 编程的时候,可以使用文件重定向功能,如下所示: [root@localhost pipe]# echo "hello world&q ...
- 【linux草鞋应用编程系列】_5_ Linux网络编程
一.网络通信简介 第一部分内容,暂时没法描述,内容实在太多,待后续专门的系列文章. 二.linux网络通信 在linux中继承了Unix下“一切皆文件”的思想, 在linux中要实现网 ...
随机推荐
- 聊聊消息队列(MQ)那些事
每年的双十一期间,各大电商平台流量暴增,同时,电商平台系统的负载压力也会很大.譬如订单支付的场景,每个订单支付成功后,服务器可能要完成扣减积分.扣减优惠券.扣减商品库存.发短信等一系列操作.单个用户请 ...
- 轻量级领域驱动设计DDD Lite在嵌入式系统重构中的应用
前言 目前,关于领域驱动设计(Domain Driven Design)DDD的培训,材料,视频都比较多,大家对DDD的一些概念都有所了解,但是在实际使用过程中,有很多的问题.例如 为什么DDD的架构 ...
- go slice不同初始化方式性能&数组比较
go语言开发中,slice是我们常用的数据类型之一,也是因为它的灵活性,自己也很少使用数组,当然我也知道它的一些特性,不过没有真实的去验证它,因为大多数使用场景没必要对code太过苛刻,但是如果封装作 ...
- 将 Vue.js 项目部署至静态网站托管,并开启 Gzip 压缩
摘要:关于使用 Nginx 开启静态网站 Gzip 压缩的教程已经有很多了,但是好像没几个讲怎么在对象存储的静态网站中开启 Gzip 压缩.其实也不复杂,我们一起来看下~ 本文分享自华为云社区< ...
- uni 结合vuex 编写动态全局配置变量 this.baseurl
在日常开发过程,相信大家有遇到过各种需求,而我,在这段事件便遇到了一个,需要通过用户界面配置动态接口,同时,因为是app小程序开发,所以接口中涉及到了http以及websocket两个类型的接口. 同 ...
- MAUI Blazor (Windows) App 动态设置窗口标题
接着上一篇"如何为面向 Windows 的 MAUI Blazor 应用程序设置窗口标题?" Tips: 总所周知,MAUI 除了 Windows App 其他平台窗口是没有 Ti ...
- 【SQL进阶】【表默认值、自增、修改表列名、列顺序】Day02:表与索引操作
一.表的创建.修改与删除 1.创建一张新表 [设置日期默认值.设置id自增] [注意有备注添加备注COMMENT] CREATE TABLE user_info_vip( id int(11) pri ...
- 从一个 issue 出发,带你玩图数据库 NebulaGraph 内核开发
如何 build NebulaGraph?如何为 NebulaGraph 内核做贡献?即便是新手也能快速上手,从本文作为切入点就够了. NebulaGraph 的架构简介 为了方便对 NebulaGr ...
- vba 数组判断与转换
Private Function CountArr(arr)'*****************************'计算数组是几维数组'***************************** ...
- jQuery基本使用
目录 一:jQuery查找标签 1.基本选择器 二:分组与嵌套 三:组合选择器 四:jQuery基本筛选器 五:属性选择器 1.属性标签 六:JQuery表单筛选器 1.type属性 2.表单对象属性 ...