shell脚本基础5——常用命令写作技巧

文章目录

  • 一、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用法示例。
shell脚本基础5——常用命令写作技巧_第1张图片
2.参数-i用法示例。
shell脚本基础5——常用命令写作技巧_第2张图片
3.参数-n用法示例,配合p使用。
shell脚本基础5——常用命令写作技巧_第3张图片

2.2 常用命令

sed常用命令语法:

  • sed 【选项参数】 ‘命令’ 【文件名】
命令 释义
a\ 新增append ,a 后面可以接字串,而这些字串会新的在目前的下一行出现。
i\ 插入, i 后面可以接字串,而这些字串会新的在目前的上一行出现。
d 删除,因为是删除,所以 d 后面通常不接任何
c\ 整行取代。
s\ 取代(查找并替换),通常这个 s 的动作可以搭配正规表示法
p 打印(显示),亦即将某个选择的资料印出,通常与参数 sed -n一起

1.新增。在显示结果的第2行下添加内容000。

shell脚本基础5——常用命令写作技巧_第4张图片
2.插入。在显示结果的第2行上添加内容88888。
shell脚本基础5——常用命令写作技巧_第5张图片
3.删除。
shell脚本基础5——常用命令写作技巧_第6张图片
shell脚本基础5——常用命令写作技巧_第7张图片
shell脚本基础5——常用命令写作技巧_第8张图片
4.整行取代。

shell脚本基础5——常用命令写作技巧_第9张图片
shell脚本基础5——常用命令写作技巧_第10张图片
5.查找字符取代。
shell脚本基础5——常用命令写作技巧_第11张图片
shell脚本基础5——常用命令写作技巧_第12张图片

shell脚本基础5——常用命令写作技巧_第13张图片
5.去掉空白行。
shell脚本基础5——常用命令写作技巧_第14张图片

6.多命令组合使用时,可以使用多个-e指定。
shell脚本基础5——常用命令写作技巧_第15张图片

三、AWK命令

基本了解:

  • AWK工具:是一种处理结构数据并输出格式化结果的编程语言。
  • 通常被用来进行格式扫描和处理。通过扫描一个或多个文件中的行,查看是否匹配指定的正则表达式,并执行相关的操作。

awk的主要特性:

  1. Awk以记录(文件中的行)和字段(文件中的列)的方式来查看文本文件。
  2. 和其他编程语言一样,Awk 包含变量、条件和循环。
  3. Awk能够进行运算和字符串操作。
  4. Awk能够生成格式化的报表数据。
  5. Awk 读入一行,执行一次主输入循环。

awk语法:

  • awk ‘/search pattern1/ {Actions}’
  • awk ‘/查找匹配/ {动作}’ 输入文件名

3.1 常用参数

参数 释义
-F 指定默认输入字段分割符,当不使用-F时,默认以“空格”即\t作为分割符。
-V 指定默认输入记录分割符,当不使用-F时,默认以“回车”即\n作为分割符。
print 非格式化打印 只能打印字符串和变量。
字符串必须加引号,$0、$1等默认变量不能加引号,自定义的变量要加’ '单引号

1.使用-F指定\作为分隔符。
shell脚本基础5——常用命令写作技巧_第16张图片
2.显示文件内容,并添加行号。

shell脚本基础5——常用命令写作技巧_第17张图片

3.2 常用示例

1.显示所有内容。
shell脚本基础5——常用命令写作技巧_第18张图片

2.显示第1列和第2列
shell脚本基础5——常用命令写作技巧_第19张图片
3.带行号显示第1列和第2列
shell脚本基础5——常用命令写作技巧_第20张图片
4.显示第1列和最后一列
shell脚本基础5——常用命令写作技巧_第21张图片
5.显示第1行和第5行。
在这里插入图片描述
6.显示第1行到第5行。
shell脚本基础5——常用命令写作技巧_第22张图片

四、find与xargs

  • 这两个命令常常搭配来用,可以查找并及时处理内容。

固定格式:

  • |xargs -I {} 命令 {}
  • {}代表上个命令返回的每个结果。

1.例1,查找/opt目录名称为setup.sh的文件,交给xargs处理,打印第2行到第4行的内容。
shell脚本基础5——常用命令写作技巧_第23张图片

五、date命令

  • 需要对时间日期操作时,使用date。
  • 常用于数据压缩脚本,日志脚本。

1.读取当前年月日,time= `date +%Y%m%d`
shell脚本基础5——常用命令写作技巧_第24张图片

2.以指定格式获取3个月以前的年月日,old_time=`date -d “$now 3 months ago” +%Y.%m.%d`

shell脚本基础5——常用命令写作技巧_第25张图片
3.单独获取年月日,如下获取一天以前的日期,`date -d “$now 1 days ago” +%m%d`

shell脚本基础5——常用命令写作技巧_第26张图片
4.脚本中也可以使用小括号引用变量,作用和单引号一样,time=$(date +%Y.%m.%d-%H.%M.%S)

shell脚本基础5——常用命令写作技巧_第27张图片

六、对话框

  • 脚本中若是需要与用户交互,可以使用该对话框处理。比如安装服务时需要用户选择安装什么服务,此时可以考虑做个对话框出来供用户选择。
  • 实现对话框的工具有多种,比如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.执行脚本。

shell脚本基础5——常用命令写作技巧_第28张图片

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

shell脚本基础5——常用命令写作技巧_第29张图片

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

shell脚本基础5——常用命令写作技巧_第30张图片

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.执行脚本
shell脚本基础5——常用命令写作技巧_第31张图片

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.执行脚本
shell脚本基础5——常用命令写作技巧_第32张图片

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.执行脚本。
shell脚本基础5——常用命令写作技巧_第33张图片

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.执行脚本,空格选择。
shell脚本基础5——常用命令写作技巧_第34张图片

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.执行脚本。
shell脚本基础5——常用命令写作技巧_第35张图片

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.执行脚本。
shell脚本基础5——常用命令写作技巧_第36张图片

七、常用写作技巧

7.1 EOF写入

  • 若需要在脚本中往指定文件里面写入内容,可以使用EOF一次性写入。

格式:

cat >文件名 <

1.示例。

cat >docker-compose.yml <

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

shell脚本基础5——常用命令写作技巧_第37张图片

7.5 docker类

  • 企业中,常用dokcer打包安装服务,所以在写计划任务时,需要注意计划任务执行时候没有TTY,否则计划任务日志会报错:the input device is not a TTY。
  • 比如计划任务中存在数据库数据备份脚本,那么该脚本中肯定会有docker exec -it myslq -u …这种命令,此时需要把-t参数去掉。
  • 计划任务的执行情况,通常查看 /var/spool/mail/root。

你可能感兴趣的:(shell脚本,linux,运维,自动化,bash,微服务)