三剑客日志处理系列
一、特殊符号
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
标签:oldboy,sbin,sed,lnh,Linux,日志,txt,root,三剑客
From: https://www.cnblogs.com/world-of-yuan/p/17013588.html