【SRE笔记 2022.8.29 linux 三剑客】

练习题

  • 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
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

学习使我清醒

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值