SRE笔记 2022.8.29&8.30&8.31&9.1
练习题
- 1 添加mysql用户指定登录shell为/sbin/nologin,不创建家目录(即创建虚拟用户)
[root@aaa zhk]# useradd -s /sbin/nologin -M mysql
- 2 添加用户hd,指定UID为5000,并且30天后过期
[root@aaa zhk]# useradd -u 5000 -e "2022/9/30"
- 3 故障分析 permisson denied 的意思 权限不足
- 4 给用户zhk授权,能够运行useradd命令
[root@aaa zhk]# visudo # 进入之后100gg,添加如下内容
100 root ALL=(ALL) ALL
101 zhk ALL=(ALL) /usr/sbin/useradd # 添加项
- 5 用数字权限修改/app/的目录权限,为dr–x-wxr-x(535)
[root@aaa zhk]# chmod - R 0535 /app
- 6 找到/var/log 7天前 的以.log结尾的文件并删除
# 三种方法
[root@aaa zhk]# find /var/log/ -type f -name "*.log" -mtime +7 | xargs rm -f
[root@aaa zhk]# find /var/log/ -type f -name "*.log" -mtime +7 | xargs -i rm -rf {} \;
[root@aaa zhk]# rm -rf ' find /var/log/ -type f -name "*.log" -mtime +7 '
- 7 环境变量
[root@aaa /]# ll /etc/skel/ -a
total 24
drwxr-xr-x. 2 root root 62 Aug 16 00:54 .
drwxr-xr-x. 81 root root 8192 Aug 30 23:44 ..
-rw-r--r--. 1 root root 18 Nov 25 2021 .bash_logout
-rw-r--r--. 1 root root 193 Nov 25 2021 .bash_profile
-rw-r--r--. 1 root root 231 Nov 25 2021 .bashrc
文件比较工具
vimdiff 命令
- 演示 查看文件差异
[root@aaa zhk]# cat -n zhk.txt
1 I am zhk teacher!
2 I learn linux.
3
4 my qq is 12000345
5
6 not 1200000345
7 my god ,i am not uncle , i am younger brothER!
[root@aaa zhk]# cat -n zhk.txt.bak
1 I am zhk teacher!
2 I learn linux.
3
4 I like badminton ball ,billiard ball and chinese chess!
5 my qq is 12000345
6
7 not 1200000345
8 my god ,i am not uncle , i am younger brothER!
[root@aaa zhk]# vimdiff zhk.txt zhk.txt.bak
diff 命令
[root@aaa zhk]# diff zhk.txt zhk.txt.bak
3a4
> I like badminton ball ,billiard ball and chinese chess!
正则表达式
- 正则表达式仅支持该三剑客命令,特殊字符适用于大部分。
- grep筛选到关键自后会加颜色,原因在于别名,centos7解决了该问题,centos6需要再次添加变量。
[root@aaa ~]# alias
alias cp='cp -i'
alias egrep='egrep --color=auto' # 此处
alias fgrep='fgrep --color=auto'
alias grep='grep --color=auto' # 此处
alias l.='ls -d .* --color=auto'
........
- 注意LC_ALL环境变量的设置,否侧会出现莫名其妙的匹配问题(centos 7),如下 在73行之后添加。
[root@aaa ~]# export LC_ALL=C # 定义该变量
[root@aaa ~]# vim /etc/profile # 永久生效
70 . "$i" >/dev/null
71 fi
72 fi
73 done
74 export LC_ALL_C # 添加项
75 unset i
76 unset -f pathmunge
[root@aaa ~]# . /etc/profile # . 或者source加载立刻生效 source /etc/profile
[root@aaa ~]# echo $LC_ALL # 再次查看、
C
正则表达式分类
基本正则表达式
- BRE,basic regular expression ,对应元字符 “^ $ . [ ]”等。
符号 | 用途 |
---|---|
^ | ^aaa,表示匹配以aaa单词开头的行 |
$ | aaa$,表示匹配以aaa单词结尾的行 |
^$ | 组合符,表示空行,逻辑解释为以^结尾的行,或者以$开头的行 |
. | 匹配任意1个且只有1个字符(不能匹配空行) |
\ | 转义符,让有特殊含义的字符只显示其本身如 . 只表示为小数点 |
* | 匹配前1个字符(连续出现)0次或1次以上(当重复0次的时候,表示为空,即匹配所有内容) |
.* | 组合符,匹配所有内容 |
^.* | 组合符,匹配以任意多个字符开头的内容 |
.*$ | 组合符,以任意多个字符结尾的内容 |
[abc] | 匹配中括号中的任意1个字符 |
[^abc] | 匹配不包含后的任意字符,代表取反,不能用!替代。 |
示例
[root@aaa zhk]# cat -n zhk.txt
1 I am zhk teacher!
2 I learn linux.
3
4 I like badminton ball ,billiard ball and chinese chess!
5 my qq is 12000345
6
7 not 1200000345
8 my god ,i am not uncle , i am younger brothER!
- ^$ 匹配空行,并打印行号。
[root@aaa zhk]# grep -n ^$ zhk.txt
3:
6:
- ^I 匹配以I开头的行
- 示例1
[root@aaa zhk]# grep ^I zhk.txt
I am zhk teacher!
I learn linux.
I like badminton ball ,billiard ball and chinese chess!
- 示例2
[root@aaa zhk]# ll
total 8
-rw-r--r--. 1 root root 162 Aug 30 18:15 \
drwxr-xr-x. 2 root root 6 Aug 30 18:30 hehe
-rw-r--r--. 1 root root 172 Aug 30 18:16 zhk.txt
[root@aaa zhk]# ll | grep ^d # 抓取文件夹
drwxr-xr-x. 2 root root 6 Aug 30 18:30 hehe
- $ !$匹配以 ! 结尾的行
[root@aaa zhk]# grep \!$ zhk.txt
I am zhk teacher!
I like badminton ball ,billiard ball and chinese chess!
my god ,i am not uncle , i am younger brothER!
- . 点号
[root@aaa zhk]# grep . zhk.txt
I am zhk teacher!
I learn linux.
I like badminton ball ,billiard ball and chinese chess!
my qq is 12000345
not 1200000345
my god ,i am not uncle , i am younger brothER!
- \ 转义字符
[root@aaa zhk]# grep \. zhk.txt
I am zhk teacher!
I learn linux.
I like badminton ball ,billiard ball and chinese chess!
my qq is 12000345
not 1200000345
my god ,i am not uncle , i am younger brothER!
[root@aaa zhk]# grep "\." zhk.txt # 双引号的作用!
I learn linux.
- 星号* ,匹配星号前一个字符0次或多次,如l*,匹配大于等于0个l的字符。
- 示例1
[root@aaa zhk]# grep l* zhk.txt
I am zhk teacher!
I learn linux.
I like badminton ball ,billiard ball and chinese chess!
my qq is 12000345
not 1200000345
my god ,i am not uncle , i am younger brothER!
- 示例2
[root@aaa zhk]# grep 00* zhk.txt # 至少1个0,因为是00!
my qq is 12000345
not 1200000345
- .* 匹配所有
[root@aaa zhk]# grep ".*" zhk.txt
I am zhk teacher!
I learn linux.
I like badminton ball ,billiard ball and chinese chess!
my qq is 12000345
not 1200000345
my god ,i am not uncle , i am younger brothER!
- ^.* 任意多个字符开头的内容
[root@aaa zhk]# grep "^.*" zhk.txt
I am zhk teacher!
I learn linux.
I like badminton ball ,billiard ball and chinese chess!
my qq is 12000345
not 1200000345
my god ,i am not uncle , i am younger brothER!
- .*$ 任意多个字符结束
[root@aaa zhk]# grep ".*$" zhk.txt
I am zhk teacher!
I learn linux.
I like badminton ball ,billiard ball and chinese chess!
my qq is 12000345
not 1200000345
my god ,i am not uncle , i am younger brothER!
- [abc] ,和特殊字符效果一样。
- 和特殊字符效果一样,但是尖角号不能用!代替,[^abc]
- [a-zA-Z] 表示匹配所有单个大小写字母。
- [a-zA-Z0-9] 表示匹配所有数字和字母。
练习
- 过滤/etc/passwd 中以nologin结尾的行。
[root@aaa zhk]# grep nologin$ /etc/passwd
- 过滤/etc/passwd 中以o开头的行。
[root@aaa ~]# grep ^o /etc/passwd
- 过滤/etc/passwd 中至少含有1个0字符串的行。
[root@aaa zhk]# grep "00*" /etc/passwd
- 过滤/etc/passwd 中的空行
[root@aaa zhk]# grep ^$ /etc/passwd
- 过滤/etc/目录中(不含子目录)下的所有文件。
[root@aaa zhk]# ls -l /etc/ | grep ^-
- 过滤/etc/services 中含有点号的行。
[root@aaa zhk]# grep "\." /etc/services
- 匹配/etc/passwd中文件的所有
[root@aaa zhk]# cat /etc/passwd | grep [a-zA-Z0-9:\.$/]
扩展正则表达式
- ERE extend regular expression,在BRE的基础上增加了“{},(),?,+,|”等字符。
- 语法grep -E 或egrep。
符号 | 作用 |
---|---|
+ | 匹配前1个字符1次或多次 |
[ : /]+ | 匹配括号内的:或/字符1次或多次(主机冒号和斜杠之间没有空格) |
? | 匹配前1个字符0次或1次 |
竖线 | 表示或者,即同时过滤多个字符 |
() | 分组过滤被括起来的东西表示一个整体,另外()的内容可以被后面的\n引用,n为数字,表示引用第几个括号内容。 |
\n | 引用前面小括号的内容,如(aa)\1,匹配aa |
a{n,m} | 匹配前1个字符最少n次,最多m次 |
a{n,} | 匹配前1个字符最少n次 |
a{n} | 匹配前1个字符正好n次 |
a{,m} | 匹配前1个字符最多次。 |
- 加号(+)和*相比,星号可以匹配0次。
[root@aaa zhk]# egrep '0+' zhk.txt
my qq is 49000448
not 4900000448
- [: /]+
[root@aaa zhk]# cat /etc/passwd | egrep [:/]+
- o参数竖行显示 egrep
[root@aaa zhk]# cat /etc/passwd | egrep [:/]+ -o
:
:
:
:
:/
:/
/
- 可将字符串竖行显示
[root@aaa zhk]# echo afkdasjfkdsfl > zzz.txt
[root@aaa zhk]# cat zzz.txt
afkdasjfkdsfl
[root@aaa zhk]# egrep -o "." zzz.txt
a
f
k
d
a
s
j
f
....
- ?
[root@aaa zhk]# egrep "0?" zhk.txt
- | 或者
[root@aaa zhk]# egrep "000|l" zhk.txt
预定义特殊中括号表达式(了解)
正则表达式 | 描述 | 示例 |
---|---|---|
[:alnum:] | 匹配任意1个数字或字母,相当于[a-zA-Z0-9] | [[:alnum:]] |
[:alpha:] | 匹配任意1个大小写字母字符,相当于[a-zA-Z] | [[:alpha:]] |
[:blank:] | 空格与制表符(横向和纵向) | [[:blank:]] |
[:digit:] | 匹配任意1个数字字符,相当于[0-9] | [[:digit:]] |
[:lower:] | 匹配小写字母 | [[;lower;]] |
[:upper:] | 匹配大写字母 | [[:upper:]] |
[:punct:] | 匹配标点符号 | [[:punct:]] |
[:space:] | 匹配1个包括换行符、回车等内的所有空白符 | [[:space:]] |
[:graph:] | 匹配任何1个可以看的见的且可以打印的字符 | [[:graph:]] |
[:xdigit:] | 任何1个十六进制数(0-9,a-f,A-F) | [[:xdigit:]] |
[:cntrl:] | 任何1个控制字符(ASCII字符集中的前32个字符) | [[:cntrl:]] |
[:print:] | 任何1个可以打印的字符 | [[:print:]] |
元字符表达式(了解)
- \b 匹配单词边界,如\bzhk\b只匹配zhk单词不匹配zhk*
[root@aaa zhk]# tail -n 2 /etc/passwd
zhk:x:8014:8016::/home/zhk:/bin/bash
zhk01:x:8015:8017::/home/zhk01:/bin/bash
[root@aaa zhk]# egrep zhk /etc/passwd
zhk:x:8014:8016::/home/zhk:/bin/bash
zhk01:x:8015:8017::/home/zhk01:/bin/bash
[root@aaa zhk]# egrep "zhk\b" /etc/passwd
zhk:x:8014:8016::/home/zhk:/bin/bash
[root@aaa zhk]# egrep "\bzhk\b" /etc/passwd
zhk:x:8014:8016::/home/zhk:/bin/bash
grep
命令总结
- v 取反
- i 部分大小写
- E =egrep
- –color=auto 过滤的内容加颜色
- n 显示行号
- w 以单词为单位过滤
- o 只输出匹配内容
- A after 显示过滤的字符串和它之后的多少行
[root@aaa zhk]# seq 10
1
2
3
4
5
6
7
8
9
10
[root@aaa zhk]# egrep -A 5 5 AAA.txt
5
6
7
8
9
10
- B before 显示过滤的字符串和它之前的多少行
- C context 显示过滤的字符串和它之前之后的多少行
- P 用于过滤perl兼容正则表达式
单词拆分字母
[root@aaa zhk]# cat zzz.txt
afkdasjfkdsfl
[root@aaa zhk]# grep -o . zzz.txt
a
f
k
d
a
s
j
f
k
d
s
f
l
sed
- Sed是Stream Editor(字符流编辑器)的缩写,简称流编辑器
- Sed是操作、过滤和转换文本内容的强人工具,常用功能有对文什实现快速增删改查,其中查询的功能中最常用的过滤(过滤指定字符串)和取行(取出指定行)。
语法格式
- sed[选项] sed内置命令 输入文件
参数
- n 取消sed的默认输出,常与sed内置命令p连用,效果如下
[root@aaa zhk]# sed '1p' zhk.txt
I am zhk teacher! # 匹配到的行
I am zhk teacher! # 显示整个文本
I learn linux.
I like badminton ball ,billiard ball and chinese chess!
my qq is 12000345
not 1200000345
my god ,i am not uncle , i am younger brothER!
[root@aaa zhk]# sed -n '1p' zhk.txt
I am zhk teacher!
- e 允许多次编辑(用的少)
[root@aaa zhk]# ifconfig eth0 | sed -ne 's#^.*inet ##g' -ne 's# netmask.*$# #gp' # 注意用法
10.0.0.128
[root@aaa zhk]# ifconfig eth0 | sed -rn 's#^.*inet ##gp' | sed -rn 's# netmask.*$# #gp'
10.0.0.128
- a append,追加文本,在指定行后添加一行或多行文本,配合i使用,a也可用i替换
[root@aaa zhk]# cat -n zhk.txt
1 I is zhk teacher!
2 I learn linux.
3
4 my qq is 12000345
5
6 not 1200000345
7 my god ,i is not uncle , i is younger brothER!
[root@aaa zhk]# sed -i '2a good' zhk.txt
[root@aaa zhk]# cat -n zhk.txt
1 I is zhk teacher!
2 I learn linux.
3 good
4
5 my qq is 21000345
6
7 not 1200000345
8 my god ,i is not uncle , i is younger brothER!
- i insert 修改文件内容,插入文本,而不是输出到终端 插入到当前行命令如下
[root@aaa zhk]# cat -n zhk.txt
1 I is zhk teacher!
2 I learn linux.
3 good,at 3i
4 good
5 good
6
7 my qq is 12000345
8
9 not 1200000345
10 my god ,i is not uncle , i is younger brothER!
[root@aaa zhk]# sed -i '1i sougou,at 1i.' zhk.txt
[root@aaa zhk]# cat -n zhk.txt
1 sougou,at 1i.
2 I is zhk teacher!
3 I learn linux.
4 good,at 3i
5 good
6 good
7
8 my qq is 12000345
9
10 not 1200000345
11 my god ,i is not uncle , i is younger brothER!
- i 也可用于修改内容并备份原文件
[root@aaa zhk]# cat zhk.txt -n
1 I am zhk teacher!
2 I learn linux.
3
4 I like badminton ball ,billiard ball and chinese chess!
5 my qq is 12000345
6
7 not 1200000345
8 my god ,i am not uncle , i am younger brothER!
[root@aaa zhk]# sed -i.bak '/like/d' zhk.txt
[root@aaa zhk]# cat zhk.txt -n
1 I am zhk teacher!
2 I learn linux.
3
4 my qq is 12000345
5
6 not 1200000345
7 my god ,i am not uncle , i am younger brothER!
[root@aaa zhk]# ll
total 28
-rw-r--r--. 1 root root 21 Aug 30 23:15 AAA.txt
-rw-r--r--. 1 root root 162 Aug 30 18:15 \
-rw-r--r--. 1 root root 26 Aug 30 23:10 aaa.txt
drwxr-xr-x. 2 root root 6 Aug 30 18:30 hehe
-rw-r--r--. 1 root root 116 Aug 31 18:31 zhk.txt
-rw-r--r--. 1 root root 172 Aug 31 18:31 zhk.txt.bak
-rw-r--r--. 1 root root 172 Aug 31 00:31 zhk.txt.ort
-rw-r--r--. 1 root root 14 Aug 30 22:17 zzz.txt
[root@aaa zhk]# cat zhk.txt.bak -n
1 I am zhk teacher!
2 I learn linux.
3
4 I like badminton ball ,billiard ball and chinese chess!
5 my qq is 12000345
6
7 not 1200000345
8 my god ,i am not uncle , i am younger brothER!
- d delete 表示删除匹配行的文本,配合i使用
删除含有字符串的行
[root@aaa zhk]# cat zhk.txt -n
1 I learn linux.
2
3 I like badminton ball ,billiard ball and chinese chess!
4 my qq is 12000345
5
[root@aaa zhk]# sed -i '/qq/d' zhk.txt
[root@aaa zhk]# cat zhk.txt -n
1 I learn linux.
2
3 I like badminton ball ,billiard ball and chinese chess!
4
删除行
[root@aaa zhk]# cat zhk.txt
I am zhk teacher!
I learn linux.
I like badminton ball ,billiard ball and chinese chess!
my qq is 12000345
not 1200000345
my god ,i am not uncle , i am younger brothER!
[root@aaa zhk]# sed -i '1d' zhk.txt
[root@aaa zhk]# cat zhk.txt -n
1 I learn linux.
2
3 I like badminton ball ,billiard ball and chinese chess!
4 my qq is 12000345
5
6 not 1200000345
7 my god ,i am not uncle , i am younger brothER!
[root@aaa zhk]sed -i '6,7d' zhk.txt
[root@aaa zhk]# cat zhk.txt -n
1 I learn linux.
2
3 I like badminton ball ,billiard ball and chinese chess!
4 my qq is 12000345
5
- = 显示行号
[root@aaa zhk]# sed '=' zhk.txt
1
2
I like badminton ball ,billiard ball and chinese chess!
3
``
- s/regexp/repalcement/g 用replalcement 的内容替换regexp
- r 支持正则表达式
- p print 打印,打印匹配行,通常与n一起用。
```bash
[root@aaa zhk]# cat -n aaa.txt
1 a
2 f
3 k
4 d
5 a
6 s
7 j
8 f
9 k
10 d
11 s
12 f
13 l
[root@aaa zhk]# sed -n '2,3p' aaa.txt
f
k
[root@aaa zhk]# sed -n '4p' aaa.txt
d
过滤字符串
[root@aaa zhk]# sed -n '/am/p' zhk.txt
I am zhk teacher!
my god ,i am not uncle , i am younger brothER!
- 替换 s 全局 g -i 可用-n也可用
[root@aaa zhk]# cat -n zhk.txt
1 I am zhk teacher!
2 I learn linux.
3
4 my qq is 12000345
5
6 not 1200000345
7 my god ,i am not uncle , i am younger brothER!
[root@aaa zhk]# sed -i 's#am#is#g' zhk.txt # #号也可用@或/替换,依据实际情况
[root@aaa zhk]# cat -n zhk.txt
1 I is zhk teacher!
2 I learn linux.
3
4 my qq is 12000345
5
6 not 1200000345
7 my god ,i is not uncle , i is younger brothER!
- r 支持正则表达式
sed练习
- 1 取/etc/passwd中的5-15行,重定向到/test.txt
[root@aaa zhk]# sed -n '5,15p' /etc/passwd > /test.txt
- 2 把/test.txt中以/sbin/nologin结尾的,修改为/bin/bash
[root@aaa zhk]# sed -i 's#/sbin/nologin#/bin/bash#g' /test.txt
- 3 查找包含nobody的行
[root@aaa zhk]# sed -n '/nobody/p' /test.txt
nobody:x:99:99:Nobody:/:/bin/bash
- 4 在第8行插入#i am good
[root@aaa zhk]# sed -i '8i i am good' /test.txt
- 5 删除9-14行。
[root@aaa zhk]# sed -i '9,14d' /test.txt
- 6 sed 中 等号显示调整
[root@aaa zhk]# sed = zhk.txt
1
sougou,at 1i.
2
I is zhk teacher!
3
I learn linux.
4
good,at 3i
5
good
6
good
7
8
my qq is 12000345
9
10
not 1200000345
11
my god ,i is not uncle , i is younger brothER!
[root@aaa zhk]# sed = zhk.txt | sed 'N;s/\n/ /' # 回车键调整为空行
1 sougou,at 1i.
2 I is zhk teacher!
3 I learn linux.
4 good,at 3i
5 good
6 good
7
8 my qq is 12000345
9
10 not 1200000345
11 my god ,i is not uncle , i is younger brothER!
sed企业案例
- 1 sed 追加两行文本 \n 换行符
[root@aaa zhk]# cat zhk.txt -n
1 sougou,at 1i.
2 I is zhk teacher!
3 I learn linux.
4 good,at 3i
5 good
6 good
7
8 my qq is 12000345
9
10 not 1200000345
11 my god ,i is not uncle , i is younger brothER!
[root@aaa zhk]# sed -i '2a aaa\nbbb' zhk.txt
[root@aaa zhk]#
[root@aaa zhk]# cat zhk.txt -n
1 sougou,at 1i.
2 I is zhk teacher!
3 aaa
4 bbb
5 I learn linux.
6 good,at 3i
7 good
8 good
9
10 my qq is 12000345
11
12 not 1200000345
13 my god ,i is not uncle , i is younger brothER!
- 2 生产场景ssh 服务加固
[root@aaa zhk]# egrep "#Port|PermitRootLogin yes|GSSAPIAuthen|#UseDNS" /etc/ssh/sshd_config
#Port 22 # ssh服务端口号
#PermitRootLogin yes # 禁止root用户远程登录
GSSAPIAuthentication yes # ssh连接有的比较慢的情况,可解决ssh远程连接慢
#UseDNS yes # 解决ssh远程连接慢
yes全部改为no ,端口号修改为其他不常用端口,修改完毕 用systemctl restart sshd
服务命令
- 3 取IP地址
[root@aaa zhk]# ifconfig eth0
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 10.0.0.128 netmask 255.255.255.0 broadcast 10.0.0.255
inet6 fe80::4667:1113:8033:46d9 prefixlen 64 scopeid 0x20<link>
ether 00:0c:29:1f:1b:19 txqueuelen 1000 (Ethernet)
RX packets 10914 bytes 943288 (921.1 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 6539 bytes 854344 (834.3 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
步骤:匹配第二行;删除IP前部内容(以任意多个字符开头,给一个唯一结尾的内容);删除IP后面的内容(给定唯一开头内容,以任意多个字符结尾),查找过程如下
[root@aaa zhk]# ifconfig eth0 | sed -n '2p'
inet 10.0.0.128 netmask 255.255.255.0 broadcast 10.0.0.255
[root@aaa zhk]# ifconfig eth0 | sed -n '2s#^.* inet##gp'
10.0.0.128 netmask 255.255.255.0 broadcast 10.0.0.255
[root@aaa zhk]# ifconfig eth0 | sed -rn '2s#^.* inet##gp'| sed -rn 's#netmask.*$##p'
10.0.0.128
[root@aaa zhk]# ifconfig eth0 | sed -rn '2s#^.* inet##gp'| sed -rn 's#netmask.*$##p'
ip a取eth0网卡 ip命令同理
[root@aaa zhk]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 00:0c:29:1f:1b:19 brd ff:ff:ff:ff:ff:ff
inet 10.0.0.128/24 brd 10.0.0.255 scope global noprefixroute eth0
valid_lft forever preferred_lft forever
inet6 fe80::4667:1113:8033:46d9/64 scope link noprefixroute
valid_lft forever preferred_lft forever
3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 00:0c:29:1f:1b:23 brd ff:ff:ff:ff:ff:ff
inet 10.0.0.129/24 brd 10.0.0.255 scope global noprefixroute eth1
valid_lft forever preferred_lft forever
inet6 fe80::cb2f:74b0:62d8:e25/64 scope link noprefixroute
valid_lft forever preferred_lft forever
[root@aaa zhk]# ip a | sed -rn '/eth0/s#^.*inet (.*)/24 brd.*$#\1#gp'
10.0.0.128
后向引用
- 想要的内容用括号匹配,\1代表括号内容
- 取IP
[root@aaa zhk]# ifconfig eth0
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 10.0.0.128 netmask 255.255.255.0 broadcast 10.0.0.255
inet6 fe80::4667:1113:8033:46d9 prefixlen 64 scopeid 0x20<link>
ether 00:0c:29:1f:1b:19 txqueuelen 1000 (Ethernet)
RX packets 16780 bytes 1455848 (1.3 MiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 10274 bytes 1261494 (1.2 MiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
[root@aaa zhk]# ifconfig eth0 | sed -rn 's#^.*inet (.*) net.*$#\1#gp' # 小括号匹配的内用用\1后向引用并显示
10.0.0.128
- 4 取文件的数字权限
[root@aaa zhk]# stat /etc/hosts
File: '/etc/hosts'
Size: 158 Blocks: 8 IO Block: 4096 regular file
Device: fd00h/64768d Inode: 16778307 Links: 1
Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root)
Context: system_u:object_r:net_conf_t:s0
Access: 2022-09-01 00:00:26.748000756 +0800
Modify: 2013-06-07 22:31:32.000000000 +0800
Change: 2022-08-14 18:07:45.830007598 +0800
Birth: -
[root@aaa zhk]# stat /etc/hosts | sed -rn 's#^.*\(0##gp'
644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root)
[root@aaa zhk]# stat /etc/hosts | sed -rn 's#^.*\(0(.*)/.*$#\1#gp'
644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0
[root@aaa zhk]# stat /etc/hosts | sed -rn 's#^.*\(0(.*)/-.*$#\1#gp'
644
awk
awk介绍
- awk是三剑客的老大,核心作用是取列,查、删。
- 自身也是一门变成语言,善于处理大量文本
- 格式: awk 参数 ‘条件(动作)’ 文件
参数
参数 | 说明 |
---|---|
-F | 指定字段分隔符 |
-v | 定义或修改1个awk内部的变量 |
变量
变量名 | 属性 |
---|---|
$0 | 当前整行记录 |
$n | 当前记录的第n个列,字段间由FS或-F参数指定分隔符 |
NF | 当前记录中的列的个数,即有多少列 |
$NF | 打印最后一行 |
$(NF-n) | 倒数第n列,n为数字 |
NR | 已经读出的记录数,就是行号,从1开始 ,记录有多少行 |
命令演示
- $n
[root@aaa zhk]# cat a.txt
01 02 03
[root@aaa zhk]# awk '{print $1}' a.txt
01
多列用逗号分割
[root@aaa zhk]# awk '{print $1,$3}' a.txt
01 03
- 打印整行$0
[root@aaa zhk]# awk '{print $0}' a.txt
01 02 03
- $NF $(NF-n)
[root@aaa zhk]# awk '{print $NF}' a.txt
03
[root@aaa zhk]# awk '{print $(NF-1)}' a.txt
02
- 参数F
[root@aaa zhk]# cd /
[root@aaa /]# cat test.txt
lp:x:4:7:lp:/var/spool/lpd:/bin/bash
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:/bin/bash
operator:x:11:0:operator:/root:/bin/bash
games:x:12:100:games:/usr/games:/bin/bash
i am good
[root@aaa /]# awk -F ":" '{print $1}' test.txt #指定:为分隔符
lp
sync
shutdown
halt
mail
operator
games
i am good
- NF 每行多少列打印
[root@aaa /]# awk -F ":" '{print $1,NF}' test.txt
lp 7
sync 7
shutdown 7
halt 7
mail 7
operator 7
games 7
i am good 1
- NR
[root@aaa /]# awk 'NR==2,NR==3' test.txt
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
[root@aaa /]# awk 'NR>=2&&NR<=3' test.txt
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
awk练习
- 1 取test.txt文件的第2-3行内容
[root@aaa /]# awk 'NR==2,NR==3{print NR,$0}' test.txt
2 sync:x:5:0:sync:/sbin:/bin/sync
3 shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
grep -A, head- 3|tail -2 , sed 等等都可实现;
!取反;&&,并且;||,或者;等号,赋值;==等于
- 2 过滤出含有root字符串的行
[root@aaa /]# awk '/root/' test.txt
operator:x:11:0:operator:/root:/bin/bash
匹配内容:过滤第1列内容匹配root字符串,把符合的行的最后一列输出。
[root@aaa /]# awk -F ":" '$1~/root/{print $NF}' test.txt # 匹配第一列含有root的字符串行。
/bin/bash
- 3 删除含有root字符串的行
[root@aaa /]# awk '/^[^r]/' test.txt # 打印出不是以r开头的行
lp:x:4:7:lp:/var/spool/lpd:/bin/bash
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:/bin/bash
operator:x:11:0:operator:/root:/bin/bash
games:x:12:100:games:/usr/games:/bin/bash
i am good
打印行
[root@aaa /]# awk '/root/' test.txt
operator:x:11:0:operator:/root:/bin/bash
- 4 取文件的第1列,第3列和最后一列并打印行号
[root@aaa /]# awk -F ":" '{print NR,$1,$3,$NF}' test.txt
1 lp 4 /bin/bash
2 sync 5 /bin/sync
3 shutdown 6 /sbin/shutdown
4 halt 7 /sbin/halt
5 mail 8 /bin/bash
6 operator 11 /bin/bash
7 games 12 /bin/bash
8 i am good i am good
- 5 取出ifconfig eth0中的ip地址。
[root@aaa /]# hostname -I
10.0.0.128 10.0.0.129
[root@aaa /]# ifconfig eth0 | awk 'NR==2{print $2}'
10.0.0.128
多分隔符用法
[root@aaa /]# cat test.txt
root:x:0:0:root:/root:/bin/bash
lp:x:4:7:lp:/var/spool/lpd:/bin/bash
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:/bin/bash
operator:x:11:0:operator:/root:/bin/bash
games:x:12:100:games:/usr/games:/bin/bash
i am good
[root@aaa /]# awk -F "[:/]" 'NR==1{print $7}' test.txt # 指定:和/为分隔符
var
连续多个相同的字符作为1个分隔符用+号
[root@aaa /]# cat b.txt
1:::::2======3-----4
[root@aaa /]# awk -F "[:=-]+" '{print $4}' b.txt
4
- 6 取出/etc/hosts的数字权限: 先取行,再取列
[root@aaa /]# stat /etc/hosts | awk -F "[0/]" 'NR==4{print $2}'
644
- 7 过滤分数大于60小于100的人的姓名
[root@aaa zhk]# cat aaa.txt
name gender score
AAA man 10
BBB man 29
CCC woman 100
DDD woman 70
EEE man 60
FFF woman 59
[root@aaa zhk]# awk '$3>60&&$3<100{print $1}' aaa.txt
DDD
- 8 awk用字符集做分隔符
[root@aaa zhk]# ifconfig eth0 | awk -F "(inet )|( netmask )" 'NR==2{print $2}'
10.0.0.128
中文乱码问题
- 首先尝试修改#lLANG,为中文
export LANG='zh_CN.UTF8'
同样编辑/etc/profile文件,修改完毕, 用.或者source使其生效 - 如果修改中文和英文均不生效,通过调整Xshell字符集解决。
三剑客试题
- 1用sed将/etc/passwd文件的第1行至最后1行重定向到AAA.txt
[root@aaa zhk]# sed -n '1,$p' /etc/passwd > AAA.txt # $ 表示最后一行
- 2 显示AAA.txt第3-7行
[root@aaa zhk]# sed -n '3,7p' AAA.txt
[root@aaa zhk]# awk 'NR==3,NR==7' AAA.txt
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
- 3 使用sed取出AAA.txt中虚拟用户dbus的[备注说明]信息部分
[root@aaa zhk]# sed -rn 's#^.*1:(.*):/:.*$#\1#gp' AAA.txt
System message bus
- 4 使用awk取出AAA.txt中的用户名及家目录列并显示行号
[root@aaa zhk]# awk -F ":" '{print NR,$1,$6}' AAA.txt
- 5 使用awk取出UID大于10的用户行
[root@aaa zhk]# awk -F ":" '$3>10{print $0}' AAA.txt
- 6 将AAA文件中的root更改为hd
[root@aaa zhk]# sed -i 's#/root/#/hd/#gp' AAA.txt
- 7 在AAA文件的第11行新增一行“”hello world“
[root@aaa zhk]# sed -i '11i hello world' AAA.txt | sed -n '10,12p'
- 8 在AAA.txt文件中第三行和第四行分别插入333,444
[root@aaa zhk]# sed -i '3i 333\n444' AAA.txt | sed -n '3,4p'
- 9 用tar打包压缩/home/目录所有文件为一个压缩文件home.tat.gz,并放到/root/目录的完程命令,并写出解压的完整命令
[root@aaa zhk]# tar zcf /root/home.tar.gz /home/*
tar: Removing leading `/' from member names # 该报错忽略
[root@aaa zhk]# tar zcf /root/home.tar.gz /home
tar: Removing leading `/' from member names
[root@aaa zhk]# tar xf /root/home.tar.gz
- 10 批量创建 hd{00…10}用户,并创建密码:优先明确单条命令,再批量
[root@aaa zhk]# seq -w 10
01
02
03
04
05
06
07
08
09
10
[root@aaa zhk]# seq -w 10|sed -r 's#(.*)#\1#g' # 需要+r匹配正则,且不打印不加p,+p后会出现两个01 02...
01
02
03
04
05
06
07
08
09
10
[root@aaa zhk]# seq -w 10|sed -r 's#(.*)#useradd \1#g'
useradd 01
useradd 02
useradd 03
useradd 04
useradd 05
useradd 06
useradd 07
useradd 08
useradd 09
useradd 10
[root@aaa zhk]# seq -w 10|sed -r 's#(.*)#useradd hd\1;echo \1|passwd --stdin hd\1 #g' | bash # 最后给bash处理
Changing password for user hd01.
passwd: all authentication tokens updated successfully.
Changing password for user hd02.
passwd: all authentication tokens updated successfully.
Changing password for user hd03.
passwd: all authentication tokens updated successfully.
Changing password for user hd04.
passwd: all authentication tokens updated successfully.
Changing password for user hd05.
passwd: all authentication tokens updated successfully.
Changing password for user hd06.
passwd: all authentication tokens updated successfully.
Changing password for user hd07.
passwd: all authentication tokens updated successfully.
Changing password for user hd08.
passwd: all authentication tokens updated successfully.
Changing password for user hd09.
passwd: all authentication tokens updated successfully.
Changing password for user hd10.
passwd: all authentication tokens updated successfully.
- 11 awk批量
[root@aaa zhk]# ps -ef | grep ^root | awk '{print "kill "$2}'|bash
命令拼接
[root@aaa zhk]# ps -ef | grep ^root | awk '{print "kill ","ID "$2}' # &&并且也可用
- 12 过滤出/etc/passwd文件中所有虚拟用户
[root@aaa zhk]# awk -F: '$3>0&&$3<1000{print $1}' AAA.txt
- 13 查看磁盘分区的inode总量以及inode使用百分比 ,不要%(设定%和空格同时为分隔符)
[root@aaa zhk]# df -i |awk -F "[ %]+" '{print $1":"$2,$5}'
Filesystem:Inodes IUse
devtmpfs:229891 1
tmpfs:232870 1
tmpfs:232870 1
tmpfs:232870 1
/dev/mapper/centos-root:8910848 1
/dev/sda1:524288 1
tmpfs:232870 1
cut
- 主要是取列,与awk相比比较简单。
- d 指定分隔符
- f 指定列
- c 按字符取内容
[root@aaa zhk]# cut -d: -f1 /etc/passwd # 指定:为分隔符,1位第1列
取多列
[root@aaa zhk]# cut -d: -f1-3 /etc/passwd
root:x:0
bin:x:1
daemon:x:2
按字符取
[root@aaa zhk]# echo huida | cut -c 1-3
hui
[root@aaa zhk]# echo huidadfsaad | cut -c 1-3,6-9
huidfsa