文章目录
- 一、grep命令
- 二、sed命令
- 2.1 选项参数
- 2.2 常用命令
- 三、AWK命令
- 3.1 常用参数
- 3.2 常用示例
- 四、find与xargs
- 五、date命令
- 六、对话框
- 6.1 消息框
- 6.2 yes/no对话框
- 6.3 表单输入框
- 6.4 密码输入框
- 6.5 菜单栏
- 6.6 单选对话框
- 6.7 多选对话框
- 6.8 进度条
- 七、常用写作技巧
- 7.1 EOF写入
- 7.2 定位脚本目录
- 7.3 set参数
- 7.4 wait命令
- 7.5 docker类
一、grep命令
基本了解:
- grep主要用于过滤文本数据。
grep匹配模式:
- egrep支持扩展的正则表达式。
- fgrep不需要转义,不支持正则
- grep [options] regex [files] regex表示正则表达式
选项 | 释义 |
---|---|
-w | 不加-w,贪婪模式,只要有就显示 |
-o ‘pattern’ | 仅显示匹配正则的字段 |
–color=auto | 以彩色方式显示关键字 |
-i | 忽略大小写 |
-v | 不匹配匹配的,反向选择 |
-l | 输出匹配的文件名 |
-L | 输出不匹配的文件名 |
-c | 输出匹配的数目(行数) |
-n | 输出匹配行时在前面加上文件名及在其中的行数 |
-x | 匹配整行 |
-A nu | 输出匹配到的当前行及后nu行 |
-B nu | 输出匹配到的当前行及前nu行 |
-C nu | 输出匹配到的当前行及前后nu行 |
-E | 支持扩展的正则表达式 |
-F | 不支持正则表达式,即不需要转义 |
-h | 抑制文件名的输出 |
-s | 抑制类似找不到文件等错误信息 |
-a | 针对二进制文件使用 |
二、sed命令
基本了解:
- SED工具用来对文本进行过滤与替换操作,特别是在用脚本处理配置文件。
- sed的模式空间:sed通过文件或管道读取文件内容,并将读入的内容复制到缓冲区中的过程。默认情况下,sed并不直接修改源文件,而是直接在对缓冲区中的内容进行操作。除非用sed -i这个功能,才能直接修改原文件内容。
2.1 选项参数
选项 | 释义 | 示例 |
---|---|---|
-n | 一般sed的用法中,所有来自 STDIN的资料一般都会被列出到屏幕上。 但如果加上 -n 后,则只有sed 特殊处理的那一行(或者动作)才会被列出来。 常与参数p配合使用。 | sed -n “s#a#t#gp” 1.txt 替换1.txt中所有a为t |
-e | 直接在指令列模式上进行 sed 的动作编辑 | sed -e ‘s/999/777/g’ baimu.sh |
-f | 直接将 sed 的动作写在一个文件内 | |
-r | sed 的动作支援的是延伸型正规表示法的语法(预设基础正规表示法语法) | |
-i | 直接修改读取的文件内容,而不是由屏幕输出 | sed -i ‘s/999/888/g’ baimu.sh |
1.参数-e用法示例。
2.参数-i用法示例。
3.参数-n用法示例,配合p使用。
2.2 常用命令
sed常用命令语法:
- sed 【选项参数】 ‘命令’ 【文件名】
命令 | 释义 |
---|---|
a\ | 新增append ,a 后面可以接字串,而这些字串会新的在目前的下一行出现。 |
i\ | 插入, i 后面可以接字串,而这些字串会新的在目前的上一行出现。 |
d | 删除,因为是删除,所以 d 后面通常不接任何 |
c\ | 整行取代。 |
s\ | 取代(查找并替换),通常这个 s 的动作可以搭配正规表示法 |
p | 打印(显示),亦即将某个选择的资料印出,通常与参数 sed -n一起 |
1.新增。在显示结果的第2行下添加内容000。
2.插入。在显示结果的第2行上添加内容88888。
3.删除。
4.整行取代。
5.查找字符取代。
5.去掉空白行。
6.多命令组合使用时,可以使用多个-e指定。
三、AWK命令
基本了解:
- AWK工具:是一种处理结构数据并输出格式化结果的编程语言。
- 通常被用来进行格式扫描和处理。通过扫描一个或多个文件中的行,查看是否匹配指定的正则表达式,并执行相关的操作。
awk的主要特性:
- Awk以记录(文件中的行)和字段(文件中的列)的方式来查看文本文件。
- 和其他编程语言一样,Awk 包含变量、条件和循环。
- Awk能够进行运算和字符串操作。
- Awk能够生成格式化的报表数据。
- Awk 读入一行,执行一次主输入循环。
awk语法:
- awk ‘/search pattern1/ {Actions}’
- awk ‘/查找匹配/ {动作}’ 输入文件名
3.1 常用参数
参数 | 释义 |
---|---|
-F | 指定默认输入字段分割符,当不使用-F时,默认以“空格”即\t作为分割符。 |
-V | 指定默认输入记录分割符,当不使用-F时,默认以“回车”即\n作为分割符。 |
非格式化打印 只能打印字符串和变量。 字符串必须加引号,$0、$1等默认变量不能加引号,自定义的变量要加’ '单引号 |
1.使用-F指定\作为分隔符。
2.显示文件内容,并添加行号。
3.2 常用示例
1.显示所有内容。
2.显示第1列和第2列
3.带行号显示第1列和第2列
4.显示第1列和最后一列
5.显示第1行和第5行。
6.显示第1行到第5行。
四、find与xargs
- 这两个命令常常搭配来用,可以查找并及时处理内容。
固定格式:
- |xargs -I {} 命令 {}
- {}代表上个命令返回的每个结果。
1.例1,查找/opt目录名称为setup.sh的文件,交给xargs处理,打印第2行到第4行的内容。
五、date命令
- 需要对时间日期操作时,使用date。
- 常用于数据压缩脚本,日志脚本。
1.读取当前年月日,time= `date +%Y%m%d`
2.以指定格式获取3个月以前的年月日,old_time=`date -d “$now 3 months ago” +%Y.%m.%d`
3.单独获取年月日,如下获取一天以前的日期,`date -d “$now 1 days ago” +%m%d`
4.脚本中也可以使用小括号引用变量,作用和单引号一样,time=$(date +%Y.%m.%d-%H.%M.%S)
六、对话框
- 脚本中若是需要与用户交互,可以使用该对话框处理。比如安装服务时需要用户选择安装什么服务,此时可以考虑做个对话框出来供用户选择。
- 实现对话框的工具有多种,比如dialog,zenity,它俩需要安装。这里讲whiptail的用法,,它是默认安装的。
6.1 消息框
语法:
- whiptail --title “< message box title>” --msgbox “< text to show>” < height> < width>
参数释义:
- 参数title:文本框的标头。
- 参数msgbox:文本框中要显示的内容。
- 参数 < height> :文本框的高度。
- 参数< width>: 文本框的长度。
1.安装服务时,可以在脚本中设计这一行,让用户确认自己的选择。
[root@localhost ~]# cat baimu.sh
#!/bin/bash
whiptail --title "请确认你要安装的微服务" --msgbox "qingjun" 10 60
2.执行脚本。
6.2 yes/no对话框
语法:
- whiptail --title “< dialog box title>” --yesno “< text to show>” < height> < width>
- 当选择左边选项的时候输出的是0,选择右边选项的时候输出的是1。
参数释义:
- 参数title:文本框的标头。
- 参数yesno:文本框中要显示的内容。
- 参数 < height> :文本框的高度。
- 参数< width>: 文本框的长度。
- 参数–yes-button:选择yes的按钮显示。
- 参数–no-button:选择no的按钮显示。
1.当有判断选择项时,可以选择安装,也可以选择不安装,此时可以使用yes/no对话框。
[root@localhost ~]# cat baimu.sh
#!/bin/bash
if (whiptail --title "请选择Yes或No" --yesno "是否要安装qingjun服务." 10 60);then
echo "你选择的是yes,即将安装"
else
echo "你选择的是no,不安装"
fi
2.也可以自定义选择项。
[root@localhost ~]# cat baimu.sh
#!/bin/bash
if (whiptail --title "请选择Yes或No" --yes-button "男" --no-button "女" --yesno "你的性别是什么?" 10 60) then
echo "You chose Man Exit status was $?."
else
echo "You chose Woman. Exit status was $?."
fi
6.3 表单输入框
语法:
- whiptail --title “< input box title>” --inputbox “< text to show>” < height> < width> < default-text>
参数释义:
- 参数title:文本框的标头。
- 参数 < height> :文本框的高度。
- 参数< width>: 文本框的长度。
- 参数inputbox:适用与用户交互,让用户输入内容。
1.当要安装集群服务时,可以使用表单输入框来实现。
[root@localhost ~]# cat baimu.sh
#!/bin/bash
NAME=$(whiptail --title "服务安装" --inputbox "请输入要安装服务的服务器IP" 10 60 3>&1 1>&2 2>&3)
exitstatus=$?
if [ $exitstatus = 0 ]; then
echo "Your name is:" $NAME
else
echo "You chose Cancel."
fi
2.执行脚本
6.4 密码输入框
语法:
- whiptail --title “< password box title>” --passwordbox “< text to show>” < height> < width>
参数释义:
- 参数title:文本框的标头。
- 参数 < height> :文本框的高度。
- 参数< width>: 文本框的长度。
- 参数passwordbox:适用与用户交互,让用户输入密码。
1.当涉及到密码校验时,可以选择密码输入框。
[root@localhost ~]# cat baimu.sh
#!/bin/bash
PASSWORD=$(whiptail --title "密码校验" --passwordbox "请输入密码:" 10 60 3>&1 1>&2 2>&3)
exitstatus=$?
if [ $exitstatus = 0 ]; then
echo "Your password is:" $PASSWORD
else
echo "You chose Cancel."
fi
2.执行脚本
6.5 菜单栏
基本了解:
- 提供一个单项选择的菜单栏。
语法:
- whiptail --title “< menu title>” --menu “< text to show>” < height> < width> < menu height> [ < tag> < item> ] . . .
参数释义:
- 参数title:文本框的标头。
- 参数 < height> :文本框的高度。
- 参数< width>: 文本框的长度。
- 参数menu:适用与用户交互,供用户选择。
1.可以提供选择项,常用于总脚本,提供各个小脚本执行选择。
[root@localhost ~]# cat baimu.sh
#!/bin/bash
OPTION=$(whiptail --title "服务安装" --menu "请选择要安装的微服务" 15 60 4 \
"第一步" "系统初始化" \
"第二步" "安装consul服务端" \
"第三步" "安装consul客户端" 3>&1 1>&2 2>&3)
exitstatus=$?
if [ $exitstatus = 0 ]; then
echo "Your favorite programming language is:" $OPTION
else
echo "You chose Cancel."
fi
2.执行脚本。
6.6 单选对话框
基本了解:
- 该对话框是单选对话框,可以控制默认的选择位置,即使你在脚本中默认选择多个,他也只会输出一个结果。
语法:
- whiptail --title “< radiolist title>” --radiolist “< text to show>” < height> < width> < list height> [ < tag> < item> < status> ] . . .
参数释义:
- 参数title:文本框的标头。
- 参数 < height> :文本框的高度。
- 参数< width>: 文本框的长度。
- 参数radiolist:适用与用户交互,供用户选择,单选。在脚本中可以通过OFF/ON选择默认项。
1.可以根据安装服务类别来选择。
[root@localhost ~]# cat baimu.sh
#!/bin/bash
DISTROS=$(whiptail --title "服务安装" --radiolist \
"单选,请选择你要安装的微服务" 15 60 4 \
"aaa" "服务1" OFF \
"bbb" "服务2" OFF \
"ccc" "服务3" OFF \
"ddd" "服务4" OFF 3>&1 1>&2 2>&3)
exitstatus=$?
if [ $exitstatus = 0 ]; then
echo "The chosen distro is:" $DISTROS
else
echo "You chose Cancel."
fi
2.执行脚本,空格选择。
6.7 多选对话框
语法:
- whiptail --title “< checklist title>” --checklist “< text to show>” < height> < width> < list height> [ < tag> < item> < status> ] . . .
参数释义:
- 参数title:文本框的标头。
- 参数 < height> :文本框的高度。
- 参数< width>: 文本框的长度。
- 参数checklist:适用与用户交互,供用户选择,多选。在脚本中可以通过OFF/ON选择默认项。
1.适用一次性安装多个服务。
[root@localhost ~]# cat baimu.sh
#!/bin/bash
DISTROS=$(whiptail --title "服务安装" --checklist \
"多选,请选择要安装的服务:" 15 60 4 \
"aaa" "服务1" ON \
"bbb" "服务2" OFF \
"ccc" "服务3" ON \
"ddd" "服务4" OFF 3>&1 1>&2 2>&3)
exitstatus=$?
if [ $exitstatus = 0 ]; then
echo "Your favorite distros are:" $DISTROS
else
echo "You chose Cancel."
fi
2.执行脚本。
6.8 进度条
语法:
- whiptail --gauge “< test to show>” < height> < width> < inital percent>
参数释义:
- 参数title:文本框的标头。
- 参数 < height> :文本框的高度。
- 参数< width>: 文本框的长度。
1.适用大服务脚本安装进度,不常用。
[root@localhost ~]# cat baimu.sh
#!/bin/bash
{
for ((i = 0 ; i <= 100 ; i+=1)); do
sleep 1
echo $i
done
} | whiptail --gauge "Please wait while installing" 6 60 0
2.执行脚本。
七、常用写作技巧
7.1 EOF写入
- 若需要在脚本中往指定文件里面写入内容,可以使用EOF一次性写入。
格式:
cat >文件名 <<EOF 文本内容 EOF
1.示例。
cat >docker-compose.yml <<EOF
version: '3'
services:
${app_container}:
container_name: ${app_container}
image: "reg.citms.cn:7443/public/${app_name}:${app_version}"
hostname: "${app_container}"
restart: always
ports:
- "${app_ports[0]}:${app_ports[0]}"
volumes:
- /etc/localtime:/etc/localtime:ro
- ./data:/var/lib/mysql
- ./config:/etc/mysql/conf.d
environment:
- MYSQL_ROOT_PASSWORD=${app_password}
EOF
7.2 定位脚本目录
- 写脚本时,需要确定脚本存放位置。
- 比如脚本实际位置为/opt/test/qingjun.sh,此时不论是在/opt/test/目录下 sh qingjun.sh,还是在其他目录,如/tmp目录下sh /opt/test/qingjun.sh,都会打印出/opt/test
1.可以在脚本开头将脚本目录定义为变量,不管在那个目录执行脚本时都会寻找该目录,不会因为找不到脚本报错。
#!/bin/bash
scriptDir=$(cd $(dirname $0); pwd)
echo ${scriptDir};
7.3 set参数
- 有几个参数很常用。
1.set -x:会在执行每一行shell脚本时,把执行的内容输出来,一般只用于调试使用。
set -x
command1
command2
set +x
command3
2.set -e:会在执行过程中,只要发生错误,脚本就终止执行,防止命令关联故障。
#中途也可以设置某些步骤即使报错也继续往下进行
set +e
command1
command2
set -e
command3
3.set +o history会临时消除history记录,用于隐藏敏感信息,常用于密码类
# 查看历史记录,会发现只有export YYY2=123,没有export YYY1=123
set +o history
export YYY1=123
set -o history
export YYY2=123
7.4 wait命令
- wait命令配合&使用可以执行多条命令。
- shell脚本中的任务通常是顺序执行,当需要同时执行多条命令时,可以采用wait命令。
1.通过 & 让进程后台执行,wait会等待shell中之前的进程结束
#!/bin/bash
mysleep() {
echo "sleep $1 seconds"
sleep "$1"
}
main() {
for ((i = 1; i < 10; i++)); do
(mysleep $i) &
done
wait
}
time main
7.5 docker类
- 企业中,常用dokcer打包安装服务,所以在写计划任务时,需要注意计划任务执行时候没有TTY,否则计划任务日志会报错:the input device is not a TTY。
- 比如计划任务中存在数据库数据备份脚本,那么该脚本中肯定会有docker exec -it myslq -u …这种命令,此时需要把-t参数去掉。
- 计划任务的执行情况,通常查看 /var/spool/mail/root。