当前位置:网站首页>Shell入门终章
Shell入门终章
2022-08-02 01:07:00 【学AI的二哈】
文章目录
一、函数
1.系统函数
1.basename
基本语法:basename [string / pathname] [suffix] (功能描述:basename 命令会删掉所有的前缀包括最后一个(‘/’)字符,然后将字符串显示出来。 basename 可以理解为取路径里的文件名称选项:suffix 为后缀,如果 suffix 被指定了,basename 会将 pathname 或 string 中的 suffix 去掉。
案例实操:截取该/home/atguigu/banzhang.txt 路径的文件名称。
$ basename /home/atguigu/banzhang.txt banzhang.txt
$ basename /home/atguigu/banzhang.txt .txt banzhang
2. dirname
基本语法:dirname 文件绝对路径 (功能描述:从给定的包含绝对路径的文件名中去除文件名(非目录的部分),后返回剩下的路径(目录的部分)) dirname 可以理解为取文件路径的绝对路径名称
案例实操:获取 banzhang.txt 文件的路径
$ dirname /home/wtx/banzhang.txt
/home/wtx
2.自定义函数
基本语法:
[ function ] funname[()]
{
Action;
[return int;] }
经验技巧:(1) 必须在调用函数地方之前,先声明函数,shell 脚本是逐行运行。不会像其它语言一样先编译(2) 函数返回值,只能通过$?系统变量获得,可以显示加:return 返回,如果不加,将以最后一条命令运行结果,作为返回值。return 后跟数值 n(0-255)
案例实操:计算两个输入参数的和。
$ touch fun.sh
$ vim fun.sh
#!/bin/bash function sum()
{
s=0 s=$[$1+$2] echo "$s"
}
read -p "Please input the number1: " n1; read -p "Please input the number2: " n2; sum $n1 $n2;
$ chmod 777 fun.sh
$ ./fun.sh
Please input the number1:
2
Please input the number2:
5 7
二、正则表达式入门
正则表达式使用单个字符串来描述、匹配一系列符合某个语法规则的字符串。在很多文
本编辑器里,正则表达式通常被用来检索、替换那些符合某个模式的文本。在 Linux 中,grep, sed,awk 等文本处理工具都支持通过正则表达式进行模式匹配。
1.常规匹配
一串不包含特殊字符的正则表达式匹配它自己,例如:
$ cat /etc/passwd | grep helloworld就会匹配所有包含 helloworld 的行。
2.常用特殊字符
1.^
匹配一行的开头,例如:
$ cat /etc/passwd | grep ^a
会匹配出所有以 a 开头的行。
2.$
匹配一行的结束,例如
$ cat /etc/passwd | grep t$
会匹配出所有以 t 结尾的行
3.“.”
. 匹配一个任意的字符,例如
$ cat /etc/passwd | grep r..t
会匹配包含 rabt,rbbt,rxdt,root 等的所有行,r开头,t结尾
4.*
*不单独使用,他和上一个字符连用,表示匹配上一个字符 0 次或多次,例如
$ cat /etc/passwd | grep ro*t
会匹配 rt, rot, root, rooot, roooot 等所有行。
5.字符区间(中括号):[ ]
[ ] 表示匹配某个范围内的一个字符,例如
[6,8]------匹配 6 或者 8
[0-9]------匹配一个 0-9 的数字
[0-9]------匹配任意长度的数字字符串
[a-z]------匹配一个 a-z 之间的字符
[a-z] ------匹配任意长度的字母字符串
[a-c, e-f]-匹配 a-c 或者 e-f 之间的任意字符
$ cat /etc/passwd | grep r[a,b,c]*t
会匹配 rt,rat, rbt, rabt, rbact,rabccbaaacbt 等等所有行。
6.特殊字符:\
\ 表示转义,并不会单独使用。由于所有特殊字符都有其特定匹配模式,当我们想匹配某一特殊字符本身时(例如,我想找出所有包含 ‘$’ 的行),就会碰到困难。此时我们就要将转义字符和特殊字符连用,来表示特殊字符本身,例如
$ cat /etc/passwd | grep ‘a\$b’
就会匹配所有包含 a$b 的行。注意需要使用单引号将表达式引起来。
三、文本处理工具
1.cut
cut 的工作就是“剪”,具体的说就是在文件中负责剪切数据用的。cut 命令从文件的每一行剪切字节、字符和字段并将这些字节、字符和字段输出。
- 基本用法:cut [选项参数] filename
说明:默认分隔符是制表符 - 选项参数说明
| 选项参数 | 功能 |
|---|---|
| -f | 列号,提取第几列 |
| -d | 分隔符,按照指定分隔符分割列,默认是制表符“\t” |
| -fc | 按字符进行切割后加加 n 表示取第几列 比如 -c 1 |
- 案例实操
- [1]数据准备
$ touch cut.txt
$ vim cut.txt
dong shen guan zhen wo wo lai lai le le
- [2]切割 cut.txt 第一列
$ cut -d " " -f 1 cut.txt
dong guan wo lai le
- [3]切割 cut.txt 第二、三列
$ cut -d " " -f 2,3 cut.txt
shen zhen wo lai le
- [4] 在 cut.txt 文件中切割出 guan
$ cat cut.txt |grep guan | cut -d " " -f 1
guan
- [5] 选取系统 PATH 变量值,第 2 个“:”开始后的所有路径:
$ echo $PATH
/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/home/wtx/.local/bin:/
home/wtx/bin
$ echo $PATH | cut -d ":" -f 3-
/usr/local/sbin:/usr/sbin:/home/wtx/.local/bin:/home/wtx/bin
- [6] 切割 ifconfig 后打印的 IP 地址
$ ifconfig ens33 | grep netmask | cut -d " " -f 10
192.168.0.105
2.awk
一个强大的文本分析工具,把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再进行分析处理。
基本用法
awk [选项参数] ‘/pattern1/{action1} /pattern2/{action2}…’ filename
pattern:表示 awk 在数据中查找的内容,就是匹配模式 action:在找到匹配内容时所执行的一系列命令选项参数说明
| 选项参数 | 功能 |
|---|---|
| -F | 指定输入文件分隔符 |
| -v | 赋值一个用户定义变量 |
- 案例实操
- [1] 数据准备
$ sudo cp /etc/passwd ./ passwd数据的含义
用户名:密码(加密过后的):用户id:组id:注释:用户家目录:shell解析器
- [2] 搜索 passwd 文件以 root 关键字开头的所有行,并输出该行的第 7 列
$ awk -F : '/^root/{print $7}' passwd
/bin/bash
- [3] 搜索 passwd 文件以 root 关键字开头的所有行,并输出该行的第 1 列和第 7 列,中间以“,”号分割
$ awk -F : '/^root/{print $1","$7}' passwd
root,/bin/bash
注意:只有匹配了 pattern 的行才会执行 action。
- [4] 只显示/etc/passwd 的第一列和第七列,以逗号分割,且在所有行前面添加列名 user,
shell 在最后一行添加"dahaige,/bin/zuishuai"
$awk-F:'BEGIN{print"user,shell"}{print$1","$7} END{print "dahaige,/bin/zuishuai"}' passwd user, shell root,/bin/bash
bin,/sbin/nologin
。。。
wtx,/bin/bash dahaige,/bin/zuishuai
注意:BEGIN 在所有数据读取行之前执行;END 在所有数据执行之后执行。
- [5] 将 passwd 文件中的用户 id 增加数值 1 并输出
$ awk -v i=1 -F : '{print $3+i}' passwd
1
2
3
4
- awk的内置变量
| 变量 | 说明 |
|---|---|
| FILENAME | 文件名 |
| NR | 已读的记录数(行号) |
| NF | 浏览记录的域的个数(切割后,列的个数) |
- 实操
(1) 统计 passwd 文件名,每行的行号,每行的列数
$ awk -F : '{print "filename:" FILENAME ",linenum:"NR ",col:"NF}'
passwd filename:passwd,linenum:1,col:7 filename:passwd,linenum:2,col:7 filename:passwd,linenum:3,col:7 ...
(2) 查询 ifconfig 命令输出结果中的空行所在的行号
$ ifconfig | awk '/^$/{print NR}'
9
18
26
(3) 切割 IP
$ ifconfig ens33 | awk '/netmask/ {print $2}'
192.168.0.105
四、综合应用案例
1.归档文件
实际生产应用中,往往需要对重要数据进行归档备份。
需求:实现一个每天对指定目录归档备份的脚本,输入一个目录名称(末尾不带/),将目录下所有文件按天归档保存,并将归档日期附加在归档文件名上,放在/root/archive 下。这里用到了归档命令:tar 后面可以加上-c 选项表示归档,加上-z 选项表示同时进行压缩,得到的文件后缀名为.tar.gz。
脚本实现如下:
#!/bin/bash
# 首先判断输入参数个数是否为1
if [ $# -ne 1 ]
then
echo "参数个数错误!应该输入一个参数,作为归档目录名" exit
fi
# 从参数中获取目录名称
if [ -d $1 ]
then echo else
echo
echo "目录不存在!"
echo exit fi
DIR_NAME=$(basename $1)
DIR_PATH=$(cd $(dirname $1); pwd)
# 获取当前日期
DATE=$(date +%y%m%d)
# 定义生成的归档文件名称
FILE=archive_${DIR_NAME}_$DATE.tar.gz
DEST=/root/archive/$FILE
# 开始归档目录文件
echo "开始归档..."
echo tar -czf $DEST $DIR_PATH/$DIR_NAME
if [ $? -eq 0 ]
then
echo
echo "归档成功!"
echo "归档文件为:$DEST"
echo
else
echo "归档出现问题!"
echo fi exit
2.发送消息
我们可以利用 Linux 自带的 mesg 和 write 工具,向其它用户发送消息。
需求:实现一个向某个用户快速发送消息的脚本,输入用户名作为第一个参数,后面直接跟要发送的消息。脚本需要检测用户是否登录在系统中、是否打开消息功能,以及当前发送消息是否为空。
脚本实现如下:
#!/bin/bash login_user=$(who | grep -i -m 1 $1 | awk '{print $1}')
if [ -z $login_user ] then
echo "$1 不在线!"
echo "脚本退出.."
exit
fi is_allowed=$(who -T | grep -i -m 1 $1 | awk '{print $2}')
if [ $is_allowed != "+" ] then
echo "$1 没有开启消息功能"
echo "脚本退出.."
exit
fi
if [ -z $2 ]
then
echo "没有消息发出"
echo "脚本退出.."
exit
fi
whole_msg=$(echo $* | cut -d " " -f 2- ) user_terminal=$(who | grep -i -m 1 $1 | awk '{print $2}') echo $whole_msg | write $login_user $user_terminal
if [ $? != 0 ]
then
echo "发送失败!"
else
echo "发送成功!"
fi exit
边栏推荐
猜你喜欢

【软件工程之美 - 专栏笔记】34 | 账号密码泄露成灾,应该怎样预防?

力扣 1374. 生成每种字符都是奇数个的字符串

FlinkSQL CDC实现同步oracle数据到mysql

ERROR 1064 (42000) You have an error in your SQL syntax; check the manual that corresponds to your

Redis和MySQL数据一致性问题,有没有好的解决方案?

Use flex-wrap to wrap lines in flex layout

pcie inbound和outbound关系

Oracle data to mysql FlinkSQL CDC to achieve synchronization

DCM 中间件家族迎来新成员

C语言:打印整数二进制的奇数位和偶数位
随机推荐
go泛型使用方法
"Introduction to Natural Language Processing Practice" Question Answering Robot Based on Knowledge Graph
Day.js 常用方法
期货开户调整交易所保证金标准
微信支付软件架构,这也太牛逼了!
input禁止输入
C语言实验八 字符数组程序设计
接口(第九天)
期货公司开户实力经纪业务的规模
fastjson详解
力扣 1161. 最大层内元素和
管理基础知识16
flask获取post请求参数
外包干了三年,废了...
Reflex WMS中阶系列7:已经完成拣货尚未Load的HD如果要取消拣货,该如何处理?
Entry name ‘org/apache/commons/codec/language/bm/gen_approx_greeklatin.txt’ collided
C语言实验九 函数(一)
Markdown (CSDN) MD编辑器(四)- 漂亮表格(表格背景色、跨行、跨列)
管理基础知识15
力扣 1374. 生成每种字符都是奇数个的字符串