Linux Shell从入门到精通之shell必学三剑客grep;sed;awk

目录

🎱1. 前言

🎱2. grep命令

🎱3. sed命令

🎱4. awk命令

🎱5. 练习


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 ~]#

 学无止境!希望小伙伴可以共同努力,加油!

  • 5
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 8
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值