目录
1. 前言
要想学好shell脚本编程,对于文档的处理是无法避免的,例如:当你撰写一个脚本部署nginx时,你需要修改配置文件中的内容,你无法通过vim或vi命令手动修改,这时sed命令就可以满足你的需求。使用sed命令针对字符串进行替换,或根据匹配前缀在后方进行补充输入等。
除sed命令外,grep与awk命令在文本处理与输入输出上也起着至关重要的作用,好啦,让我们来学习一下我们shell的三剑客grep sed awk吧!希望通过本章的学习可以使你在工作中,更快的处理相关工作,同时也为后续的shell编程打下夯实的基础。
2. grep命令
- 简介
grep: Gloabal Search Regular Expression and Print out the line,意为全局搜索正则表达式并打印文本行。所以grep是一个强大的文本搜索工具并且grep与正则表达式联系紧密
- 语法格式
grep [option] pattern files
- 常用参数
参数选项 | 解释说明 |
---|---|
-c | 只统计匹配的行数 |
-v | 排除匹配结果 |
-n | 显示匹配行与行号 |
-i | 不区分大小写 |
-E | 使用egrep命令 |
-color = auto | 为grep过滤结果添加颜色 |
-w | 只匹配过滤的单词 |
-o | 只输出匹配的内容 |
- 创建测试文件
[root@CentOS_7 ~]# cat >> test.txt << EOF
> this is my first file
> print "hello world !"
> list = {1,2,3,4,5,6,7,8,9,10}
> print(list[1])
> print "HELLO WORLD !"
> List={1,2,3,4,5,6,7,8}
> x=List[1]
> y=List[2]
> EOF
[root@CentOS_7 ~]# cat test.txt
this is my first file
print "hello world !"
list = {1,2,3,4,5,6,7,8,9,10}
print(list[1])
print "HELLO WORLD !"
List={1,2,3,4,5,6,7,8}
x=List[1]
y=List[2]
过滤文件中的内容grep hello test.txt
[root@CentOS_7 ~]# grep hello test.txt
print "hello world !"
[root@CentOS_7 ~]# grep list test.txt
list = {1,2,3,4,5,6,7,8,9,10}
print(list[1])
输出匹配查找统计的行数grep -c list test.txt
[root@CentOS_7 ~]# grep -c list test.txt
2
[root@CentOS_7 ~]# grep -c hello test.txt
1
[root@CentOS_7 ~]# grep -c print test.txt
3
输出匹配查找所在的行数grep -n print test.txt
[root@CentOS_7 ~]# grep -n print test.txt
2:print "hello world !"
4:print(list[1])
5:print "HELLO WORLD !"
不区分大小写输出匹配查找的内容grep -i hello test.txt
[root@CentOS_7 ~]# grep -i hello test.txt
print "hello world !"
print "HELLO WORLD !"
输出除匹配外的所有内容grep -v print test.txt
[root@CentOS_7 ~]# grep -v print test.txt
this is my first file
list = {1,2,3,4,5,6,7,8,9,10}
List={1,2,3,4,5,6,7,8}
x=List[1]
y=List[2]
3. sed命令
- 简介
Linux sed 命令是利用脚本来处理文本文件。
sed 可依照脚本的指令来处理、编辑文本文件。
Sed 主要用来自动编辑一个或多个文件、简化对文件的反复操作、编写转换程序等。
- 语法格式
sed [-hnV][-e<script>][-f<script文件>][文本文件]
- 语法说明
参数选项 | 解释说明 |
---|---|
-e<script>或--expression=<script> | 以选项中指定的script来处理输入的文本文件 |
-f<script文件>或--file=<script文件> | 以选项中指定的script文件来处理输入的文本文件 |
-h或--help | 显示帮助 |
-n或--quiet或--silent | 仅显示script处理后的结果 |
-V或--version | 显示版本信息 |
-i | 直接修改读取的文件内容 |
- 动作说明
动作选项 | 解释说明 |
---|---|
a :新增 | a 的后面可以接字串,而这些字串会在新的一行出现(目前的下一行) |
c :取代 | c 的后面可以接字串,这些字串可以取代 n1,n2 之间的行! |
d :删除 | 因为是删除啊,所以 d 后面通常不接任何东东; |
i :插入 | i 的后面可以接字串,而这些字串会在新的一行出现(目前的上一行); |
p :打印 | 亦即将某个选择的数据印出。通常 p 会与参数 sed -n 一起运行~ |
s :取代 | 可以直接进行取代的工作哩!通常这个 s 的动作可以搭配正则表达式! 例如 1,20s/old/new/g 就是啦! |
要注意的是, sed 后面接的动作,请务必以 '...' 两个单引号括住喔!
- 示例文件
[root@CentOS_7 ~]# cat >> test.txt << EOF
> this is my first file
> print "hello world !"
> list = {1,2,3,4,5,6,7,8,9,10}
> print(list[1])
> print "HELLO WORLD !"
> List={1,2,3,4,5,6,7,8}
> x=List[1]
> y=List[2]
> EOF
[root@CentOS_7 ~]# cat test.txt
this is my first file
print "hello world !"
list = {1,2,3,4,5,6,7,8,9,10}
print(list[1])
print "HELLO WORLD !"
List={1,2,3,4,5,6,7,8}
x=List[1]
y=List[2]
在第2行后新增内容sed -e '2aSED config' test.txt
[root@CentOS_7 ~]# sed -e '2aSED config' test.txt
this is my first file
print "hello world !"
SED config
list = {1,2,3,4,5,6,7,8,9,10}
print(list[1])
print "HELLO WORLD !"
List={1,2,3,4,5,6,7,8}
x=List[1]
y=List[2]
将第2行和第3行替换为所输入的内容sed -e '2,3cSED config' test.txt
[root@CentOS_7 ~]# sed -e '2,3cSED config' test.txt
this is my first file
SED config
print(list[1])
print "HELLO WORLD !"
List={1,2,3,4,5,6,7,8}
x=List[1]
y=List[2]
将第1行与第2行的内容删除sed -e '1,2d' test.txt
[root@CentOS_7 ~]# sed -e '1,2d' test.txt
list = {1,2,3,4,5,6,7,8,9,10}
print(list[1])
print "HELLO WORLD !"
List={1,2,3,4,5,6,7,8}
x=List[1]
y=List[2]
在第1行上方插入内容sed -e '1ithis is my first file' test.txt
[root@CentOS_7 ~]# sed -e '1ithis is my first file' test.txt
this is my first file
this is my first file
print "hello world !"
list = {1,2,3,4,5,6,7,8,9,10}
print(list[1])
print "HELLO WORLD !"
List={1,2,3,4,5,6,7,8}
x=List[1]
y=List[2]
在将hello world替换为hello shell sed 's/hello world/hello shell/' test.txt
[root@CentOS_7 ~]# sed 's/hello world/hello shell/' test.txt
this is my first file
print "hello shell !"
list = {1,2,3,4,5,6,7,8,9,10}
print(list[1])
print "HELLO WORLD !"
List={1,2,3,4,5,6,7,8}
x=List[1]
y=List[2]
4. awk命令
- 简介
在Linux中,awk
是一种强大的文本处理工具,用于从文件或标准输入中读取数据,并按照指定的规则进行处理和操作。
- 语法格式
awk options 'pattern {action}' filename
- 语法示例
下面是awk
命令的一些常用选项和用法示例:
(1)打印整行
awk '{print}' filename
默认情况下,awk
会按行读取文件,并将整行内容打印出来。
(2)指定分隔符
awk -F':' '{print $1, $3}' filename
使用-F
选项来指定字段的分隔符(冒号在此示例中)。然后使用$1
、$2
、$3
等变量来引用每个字段的值。
(3)根据条件进行过滤
awk '/pattern/ {print}' filename
使用斜线(/
)将模式(pattern)括起来,并在{}
中指定要执行的动作。这个例子会打印出包含匹配模式的行。
(4)运算和计算
awk '{sum += $1} END {print sum}' filename
进行数值运算和计算。在此示例中,awk
会将每一行的第一个字段的值加到sum
变量中,并在处理完所有行后打印出总和(sum)。
(5)自定义输出格式
awk '{printf "%s\t%s\n", $1, $3}' filename
使用printf
函数来自定义输出格式。本例中,将使用制表符(\t
)分隔字段,并在每行结束时添加换行符(\n
)。
(6)使用脚本文件
awk -f script.awk filename
将awk
命令和处理规则存储在一个独立的脚本文件中(例如script.awk
),并使用-f
选项来指定脚本文件。
上述示例只是awk
命令的一部分,它还有更多高级功能和选项,比如条件语句、循环、函数等。你可以查阅awk
的官方文档或输入man awk
命令在终端上查看完整的用法和选项列表。
5. 练习
初步学完Linux三剑客后,咱们就使用这三个命令来撰写一个简单的shell脚本吧。
脚本作用:修改SSH端口号
脚本要求:用户输入的端口号要符合端口范围,并限制在10000以上,否则要弹出提示,若用户输入的端口号超出端口号范围则提示输入错误,并给出正确的端口号范围。
脚本代码:
#!/bin/bash
cat << EOF
本程序适用CentOS系统
作用是用来修改SSH端口号
请根据提示进行选择
(1)修改端口号
(2)退出程序
EOF
read -p "请输入1 or 2:" var
if [ $var -eq 1 ];then
read -p "请输入您要改成的端口号(建议修改端口号值在10000~65535之间):" ssh_port
if [ "$ssh_port" -ge 10000 ] && [ "$ssh_port" -le 65535 ];then
grep "Port 22" /etc/ssh/sshd_config > temp_port
old_port=$(<temp_port)
new_port=$ssh_port
sed -i "{ s/$old_port/Port $new_port/}" /etc/ssh/sshd_config
echo "您已成功将端口号修改为:$(awk '/Port/ && !matched {print $2;matched=1}' /etc/ssh/sshd_config)"
echo "正在重启SSH服务"
systemctl restart sshd
fi
if [ "$ssh_port" -ge 65535 ] || [ "$ssh_port" -le 10000 ];then
echo "您输入的端口未在有效范围内,程序即将退出。"
exit
fi
fi
if [ $var -eq 2 ];then
exit
fi
脚本功能测试:
[root@CentOS_7 ~]# systemctl status sshd
● sshd.service - OpenSSH server daemon
Loaded: loaded (/usr/lib/systemd/system/sshd.service; enabled; vendor preset: enabled)
Active: active (running) since Wed 2023-07-12 00:07:01 CST; 4s ago
Docs: man:sshd(8)
man:sshd_config(5)
Main PID: 1951 (sshd)
CGroup: /system.slice/sshd.service
└─1951 /usr/sbin/sshd -D
Jul 12 00:07:01 CentOS_7 systemd[1]: Stopped OpenSSH server daemon.
Jul 12 00:07:01 CentOS_7 systemd[1]: Starting OpenSSH server daemon...
Jul 12 00:07:01 CentOS_7 sshd[1951]: Server listening on 0.0.0.0 port 22.
Jul 12 00:07:01 CentOS_7 sshd[1951]: Server listening on :: port 22.
Jul 12 00:07:01 CentOS_7 systemd[1]: Started OpenSSH server daemon.
[root@CentOS_7 ~]#
[root@CentOS_7 ~]#
[root@CentOS_7 ~]#
[root@CentOS_7 ~]#
[root@CentOS_7 ~]#
[root@CentOS_7 ~]#
[root@CentOS_7 ~]#
[root@CentOS_7 ~]#
[root@CentOS_7 ~]#
[root@CentOS_7 ~]#
[root@CentOS_7 ~]#
[root@CentOS_7 ~]#
[root@CentOS_7 ~]# clear
[root@CentOS_7 ~]#
[root@CentOS_7 ~]# ./reset_ssh_port.sh
本程序适用CentOS系统
作用是用来修改SSH端口号
请根据提示进行选择
(1)修改端口号
(2)退出程序
请输入1 or 2:1
请输入您要改成的端口号(建议修改端口号值在10000~65535之间):100
您输入的端口未在有效范围内,程序即将退出。
[root@CentOS_7 ~]# ./reset_ssh_port.sh
本程序适用CentOS系统
作用是用来修改SSH端口号
请根据提示进行选择
(1)修改端口号
(2)退出程序
请输入1 or 2:1
请输入您要改成的端口号(建议修改端口号值在10000~65535之间):680000
您输入的端口未在有效范围内,程序即将退出。
[root@CentOS_7 ~]# ./reset_ssh_port.sh
本程序适用CentOS系统
作用是用来修改SSH端口号
请根据提示进行选择
(1)修改端口号
(2)退出程序
请输入1 or 2:1
请输入您要改成的端口号(建议修改端口号值在10000~65535之间):12222
您已成功将端口号修改为:12222
正在重启SSH服务
[root@CentOS_7 ~]# systemctl status sshd
● sshd.service - OpenSSH server daemon
Loaded: loaded (/usr/lib/systemd/system/sshd.service; enabled; vendor preset: enabled)
Active: active (running) since Wed 2023-07-12 00:07:37 CST; 12s ago
Docs: man:sshd(8)
man:sshd_config(5)
Main PID: 1972 (sshd)
CGroup: /system.slice/sshd.service
└─1972 /usr/sbin/sshd -D
Jul 12 00:07:37 CentOS_7 systemd[1]: Stopped OpenSSH server daemon.
Jul 12 00:07:37 CentOS_7 systemd[1]: Starting OpenSSH server daemon...
Jul 12 00:07:37 CentOS_7 sshd[1972]: Server listening on 0.0.0.0 port 12222.
Jul 12 00:07:37 CentOS_7 sshd[1972]: Server listening on :: port 12222.
Jul 12 00:07:37 CentOS_7 systemd[1]: Started OpenSSH server daemon.
[root@CentOS_7 ~]#
学无止境!希望小伙伴可以共同努力,加油!