[TOC]
0x00 基础命令
sh 命令
描述:Bourne Shell它是bash的前生所以大多用法与bash是一致的;
基础语法
[TOC]
描述:Bourne Shell它是bash的前生所以大多用法与bash是一致的;
基础语法1
2
3
4
5
6
7
8sh [options] [file]
#选项
-c string: 命令从-c后的字符串读取。
-i: 实现脚本交互。
-n: 进行shell脚本的语法检查。
-x: 实现shell脚本逐条语句的跟踪。
-s: 用于从标准输入中读取命令,接收命令参数在子shell中执行;
使用案例:1
2
3
4
5
6
7
8
9
10
11
12#示例1.使用-x选项跟踪脚本调试shell脚本,能打印出所执行的每一行命令以及当前状态:
sh -x check_ssh_login.sh
+ DEFINE=30
+ cat /var/log/secure
+ awk '/Failed/ {++ip[$(NF-3)]} END {for (i in ip) print i"="ip[i]}'
#示例2.使用-s选项接收命令行中传入的参数
curl -sSL http://weiyigeek.top/test.sh | bash -s "Hello World!"
echo 'echo hello $1' | sh -s 'world'
#hello world
echo 'ls $1 $2' | sh -s '-l' '-h'
#anaconda-ks.cfg
描述:bash 是一个为GNU计划编写的Unix shell,它的名字是一系列缩写Bourne-Again SHell — 这是关于Bourne shell(sh)的一个双关语(Bourne again / Born again), Bash不但与Bourne Shell兼容,还继承了C Shell、Korn Shell等优点。
1 | #用法: |
Shell 选项:1
2
3
4-irsD 或 -c 命令 或 -O shopt选项 (仅适合调用)
-abefhkmnptuvxBCHP 或 -o 选项
#请输入`bash -c "help set"' 以获得关于 shell 选项的更多信息
#请输入`bash -c help' 以获得关于 shell 内嵌命令的更多信息
实际案例:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#示例1.检测脚本是否正确,并不执行 , 在set命令中也能实现调试
bash -n database.sh
#示例2.执行脚本,输出执行过程,shell脚本自身已经包含了调式选项,能都打印出脚本接受的参数和输入
bash -x database.sh #-x 选项是打印所有行的信息
sh -x script.sh #使用-x选项跟踪脚本调试shell脚本,能打印出所执行的每一行命令以及当前状态:
# test.sh: line 8: ((: 1++: syntax error: operand expected (error token is "+")
# + '[' 1 -le 100 ']'
# + (( sum+=1 ))
# + (( 1++ ))
# test.sh: line 8: ((: 1++: syntax error: operand expected (error token is "+")
# + '[' 1 -le 100 ']'
# + (( sum+=1 ))
# + (( 1++ ))
#示例3.子shell(subshells)问题:
#运行一个shell脚本时会启动另一个命令解释器,就好像你的命令是在命令行提示下被解释的一样,类似于批处理文件start cmd.bat 里的一系列命令。
#每个shell脚本有效地运行`在父shell(parent shell)的一个子进程里`,这个父shell是指在一个控制终端或在一个`xterm窗口`中给你命令指示符的进程。
cmd1 | ( cmd2; cmd3; cmd4 ) | cmd5
#示例4.如果cmd2 是cd / 那么就会改变子Shell的工作目录,这种`改变只是局限于子shell内部`,cmd5则完全不知道工作目录发生的变化。`子shell是嵌在圆括号()内部的命令序列,子Shell内部定义的变量为局部变量`。
unset TERMINFO #清理变量名
set -C #转向所产生的文件
描述:用于输出指定字符串或者变量的值;1
2
3
4
5
6
7
8
9
10
11
12
13
14echo [选项] "输出内容"
#选项
-n: 一行输出。
-E:不使用反斜杠字符及不激活
-e:激活转义字符,下面是支持反斜杠控制的字符转换列表
\ 转义符
\b 退格键,向左删除键
\n 换行符
\r 回车键
\t 制表符,Tab键
\v 垂直制表符
\c 显示不换行
\0nnn - 按照八进制ASCII码输出字符,其中0为数字零,nnn是三位八进制数
\xhh - 按照十六进制ASCII表输出字符,其中hh是两位十六进制数
补充shell 终端字符颜色:终端的字符颜色是用转义序列控制的,是文本模式下的系统显示功能,和具体的语言无关shell,python,perl等均可以调用。1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37#说明:转义序列是以 ESC 开头,可以用 \033 完成相同的工作(ESC 的 ASCII 码用十进制表示就是 27, = 用八进制表示的 33)。
\033[显示方式;前景色;背景色m #方式1
\E[显示方式;前景色;背景色m #方式2
#示例:中括号中1:代表开启高亮颜色,末尾0m:代表关闭颜色
\e[1;开启颜色;文字颜色;背景颜色 String \e[0m关闭颜色
显示方式: 0(默认值)、1(高亮)、22(非粗体)、4(下划线)、24(非下划线)、5(闪烁)、25(非闪烁)、7(反显)、27(非反显)
文字颜色:30(黑色)、31(红色)、32(绿色)、 33(黄色)、34(蓝色)、35(洋红)、36(青色)、37(白色)
背景颜色:重置=0,40(黑色)、41(红色)、42(绿色)、 43(黄色)、44(蓝色)、45(洋红)、46(青色)、47(白色)
#Shell Code :
# echo 显示带颜色需要使用参数-e
# 字颜色:30—–37
echo -e "\033[30m 黑色字 \033[0m"
echo -e "\033[31m 红色字 \033[0m"
echo -e "\033[32m 绿色字 \033[0m"
echo -e "\033[33m 黄色字 \033[0m"
echo -e "\033[34m 蓝色字 \033[0m"
echo -e "\033[35m 紫色字 \033[0m"
echo -e "\033[36m 天蓝字 \033[0m"
echo -e "\033[37m 白色字 \033[0m"
echo -e "\033[40;37m 黑底白字 \033[0m"
echo -e "\033[41;37m 红底白字 \033[0m"
echo -e "\033[42;37m 绿底白字 \033[0m"
echo -e "\033[43;37m 黄底白字 \033[0m"
echo -e "\033[44;37m 蓝底白字 \033[0m"
echo -e "\033[45;37m 紫底白字 \033[0m"
echo -e "\033[46;37m 天蓝底白字 \033[0m"
echo -e "\033[47;30m 白底黑字 \033[0m”
# print 则不需要指定参数
for i in `seq 16 255`; do printf "\e[38;5;%sm %s\t" $i $i;done;echo ""
#Python3
>>> print("\033[3;31;40m%s\033[0m"%"输出红色字符")
>>> print("\033[4;31;40m%s\033[0m"%"输出红色字符")
控制选项说明:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24\33[0m 关闭所有属性
\33[1m 设置高亮度
\33[4m 下划线
\33[5m 闪烁
\33[7m 反显
\33[8m 消隐
\33[30m — \33[37m 设置前景色
\33[40m — \33[47m 设置背景色
\33[nA 光标上移n行
\33[nB 光标下移n行
\33[nC 光标右移n行
\33[nD 光标左移n行
\33[y;xH设置光标位置
\33[2J 清屏
\33[K 清除从光标到行尾的内容
\33[s 保存光标位置
\33[u 恢复光标位置
\33[?25l 隐藏光标
\33[?25h 显示光标
# Shell
echo -e "\033[4C MEasdasdsad \033[0m \033[?25h COOL" #显示光标并左移动4行
MEasdasdsad COOL
echo -e "\033[4C MEasdasdsad \033[0m \033[?25l COOL"
实际案例:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35# 示例1.原样输出变量字符串若需要原样输出变量字符串(不进行转义),请使用单引号。
echo '$name\"' #$name\"
# 示例2.转义字符的使用
$echo -e "123\b \v\t345678 \0101 \x30"
12
345678 A 0
$echo -e "h\ve\vl\nl\to\v"
h
e
l
l o
$echo -e "\x68\t\x65\t\x6c\n\x6c\t\x6f" #十六进制
h e l
l o
$echo -e "`ls | cat -n`" #输出行号
1 bin
2 boot
3 dev
4 etc
echo -e "OK! \c" #显示不换行:
echo "It is a test"
# 示例3.输出带颜色
echo -e "\e[1;31m 字符串 \e[0m" #红字默认黑底
echo -e "\e[1;31;42m this is a red color\e[0m" #40m为背景颜色-红字绿底
echo -e "\033[37;31;5mMySQL Server Stop...\033[37;47;0m"
echo -e "\e[37;31;1;5mMySQL Server Stop...\e[37;47;0m"
# 实例4.颜色与控制选项共同组合使用
echo -e "\033[37;31;5mMySQL Server Stop...\033[39;49;0m"
echo -e "\033[37;31;5mMySQL Server Stop...\033[39;49;0m"
echo "\e[37;31;1;5m \n######### weiyigeek - IT ########### \e[37;47;0m"
1 | #示例4.Echo 也可以输出变量长度 |
描述:printf命令格式化并输出结果到标准输出,是echo命令的增强版,它是C语言printf()库函数的一个有限的变形,并且在语法上有些不同;
注意:printf 由 POSIX 标准所定义,移植性要比 echo 好,但是不会像echo那样自动换行;
1 | usage: printf [-v var] format [arguments] |
实际案例:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78# 示例1.printf 常规使用:
# format-string为双引号
$ printf "%d %s\n" 1 "abc"
1 abc
# 单引号与双引号效果一样
$ printf '%d %s\n' 1 "abc"
1 abc
# 没有引号也可以输出
$ printf %s abcdef
abcdef
# 示例2.格式只指定了一个参数,但多出的参数仍然会按照该格式输出,format-string 被重用
$ printf %s abc def
abcdef
$ printf "%s\n" abc def
abc
def
$ printf "%s %s %s\n" a b c d e f g h i j
a b c
d e f
g h i
j
#示例3.如果没有 arguments,那么 %s 用NULL代替,%d 用 0 代替
$ printf "%s and %d \n"
NULL(Empty) and 0
## 如果以 %d 的格式来显示字符串,那么会有警告,提示无效的数字,此时默认置为 0
$ printf "The first program always prints'%s,%d\n'" Hello Shell
-bash: printf: Shell: invalid number
The first program always prints 'Hello,0'
#示例4.进制转换
#\ddd 三位Octal转换为ASCLL(注意与Dec转Ascll有些异同)
比如:00111001(B) 71(H) 57(D) 39(O) 9(ASCII)
$ printf "\066\t\067\t\070\t\071\n" #OCT
6 7 8 9
$ printf "\x30 \x31 \x32 \n\x40 \x41 \x42\n"
0 1 2
@ A B
# 示例5.字符对齐与小数
%-5s 格式为左对齐且宽度为5的字符串代替(-表示左对齐),不使用则是右对齐。
%-4.2f 格式为左对齐宽度为4,保留两位小数。
#!/bin/bash
printf "%-5s %-10s %-4s\n" NO Name Mark
printf "%-5s %-10s %-4.2f\n" 01 Tom 90.3456
printf "%-5s %-10s %-4.2f\n" 02 Jack 89.2345
printf "%-5s %-10s %-4.2f\n" 03 Jeff 98.4323
# 示例6.可以直接从文件读取
printf "%s \n" $(cat 1.txt)
#!/bin/bash
#这种方法执行学习
cat 1.txt |\
while read num
do
printf "$num:%X \v" $num
done
#示例7.printf格式化字符串高级用法连接memcache数据库
printf "del key\r\n"| nc 127.0.0.1 11211 &>/dev/null #监控memcache是否工作正常
printf "set key 0 0 10\r\nweiyigeek1\r\n"|nc 127.0.0.1 11211 &>/dev/null #监控redis或者mysql也可以使用睁眼的方法
printf "get key\r\v"| nc 127.0.0.1 11211|grep 'weiyigeek'|wc -l
#示例8.变量赋予
printf -v "_VAR" "%s" "WEIYIGEEK"
echo ${_VAR}
WEIYIGEEK
描述: 将标准输入复制到每个文件,也复制到标准输出。
基础语法:1
2
3
4
5
6
7
8
9
10-a, --append #append to the given FILEs, do not overwrite
-i, --ignore-interrupts #ignore interrupt signals
-p #diagnose errors writing to non pipes
--output-error[=MODE] #set behavior on write error. See MODE below
# MODE determines behavior with write errors on the outputs:
'warn' diagnose errors writing to any output
'warn-nopipe' diagnose errors writing to any output not a pipe
'exit' exit on error writing to any output
'exit-nopipe' exit on error writing to any output not a pipe
基础实例:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19# 实例1.<<< 重定向符覆盖文件中的内容
$ sudo tee /etc/bashrc <<< 'alias rm="sh /tmp/remove.sh"'
alias rm="sh /tmp/remove.sh"
$ cat /etc/bashrc
alias rm="sh /tmp/remove.sh"
# 实例2.<< 添加字符串片段注意它不会转义变量${env}这一点与echo有点不同,-a是追加而不是覆盖文件内容(注意)
sudo tee -a /etc/bashrc <<'EOF'
alias rm="sh /tmp/remove.sh"
alias rmf="sh ${REMOVE}" #
EOF
demo="wEIYIGeek"
tee -a test.yaml << "EOF"
name = ${demo}
EOF
# 实例3.低权限用户采用命令追加内容到指定文件
echo "192.168.1.31:/nask8sapp /nfsdisk-31 nfs defaults 0 0" | sudo tee -a /etc/fstab
描述:sleep命令暂停指定的时间。1
2
3
4
5Usage: sleep NUMBER[SUFFIX]...
or: sleep OPTION
#参数:
时间:指定要暂停时间的长度
时间长度,后面可接 s、m、h 或 d,其中 s 为秒,m 为 分钟,h 为小时,d 为日数
案例示例:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22#示例1.循环方式运行的监控脚本,设置间隔时间(值得学习)
#!/bin/bash
b=''
for ((i=0;$i<=100;i++))
do
printf "Progress:[%-100s] %d %%\r" $b $i # 输出[100个占为符号] 输出百分之几
sleep 0.1
b=#$b # 输出'#'还在不断叠加
done
echo
#执行结果
Progress:[##################################################]100%
#示例2.sleep后面可以设置number+时间
#!/bin/bash
for i in $(seq 1 5)
do
echo $i;echo `date`
sleep 1m
done
描述: cal命令即(calendar
)列出指定日期的月份年与日及其周几;
基础示例:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32# (1) 显示目前这个月份的月历,连同今日处会有反白的显示;
[root@vm-1575613390 ~]# cal
十月 2020
日 一 二 三 四 五 六
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
# (2) 指定月份和年
[root@vm-1575613390 ~]# cal 11 2020
十一月 2020
日 一 二 三 四 五 六
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30
# (3) 判断是润年还是平年
[root@vm-1575613390 ~]# cal 29 2 2020
二月 2020
日 一 二 三 四 五 六
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
[root@vm-1575613390 ~]# cal 30 2 2020
cal: illegal day value: use 1-29
描述:Date 命令的使用查询当前系统时间,新装的CentOS系统服务器可能设置了错误的,需要调整时区并调整时间.
1)%s存在于GNU扩展版本.像在solaris等UNIX上没有该参数.
2)1970-01-01 00:00:00指的是UTC时间. (date -u得出来的时间)UTC是协调世界时(Universal Time Coordinated)英文缩写,又称世界标准时间 并由国际时间局(BIH)负责保持的以秒为基础的时间标度。UTC相当于本初子午线(即经度0度)上的平均太阳时,过去曾用格林威治平均时(GMT)来表示.北京时间比UTC时间早8小时。
以1999年1月1日0000UTC为例,UTC时间是零点,北京时间为1999年1月1日早上8点整
3)在国际无线电通信场合,简称UTC整个地球分为二十四时区,每个时区都有自己的本地时间,为了统一起见,使用一个统一的时间,称为通用协调时(UTC, Universal Time Coordinated), UTC与格林尼治平均时(GMT, Greenwich Mean Time)一样,都与英国伦敦的本地时相同。
如下是CentOS系统使用NTP来从一个时间服务器同步:
1 | cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime |
1 | yum install -y ntpdate #注:没有安装ntpdate的可以yum一下: |
使用语法:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63date [参数]
<+时间日期格式>:指定显示时使用的日期时间格式。
-d <字符串>:显示字符串所指的日期与时间
-s <字符串>:根据字符串来设置日期与时间。
-u:显示UTC;
#字符串前后必须加上双引号;
年份是Year
月份是Month
周期是Week,缩写是,w
日是,Day,缩写是,d
小时,hour,缩写是 h
分钟是,minute,缩写是,m
秒,second,缩写是 s
##时间的表示%代码:
%S:十进制的秒数,(当前秒数0-59)
%s:(小写s),:能打印出自1970-01-01:00:00:00到当前时间的秒数.
%M:十时制表示的分钟数(0-59)
%H 小时,24小时制(00~23)= %k 小时,24小时制(0~23)
%I 小时,12小时制(01~12)= %l 小时,12小时制(1~12)
%p:本地的AM或PM的等价显示(显示出AM或PM)
%r:12小时的时间(带上下午和分钟秒数)
%a 星期的简称(Sun~Sat)
%A 星期的全称(Sunday~Saturday)
%u:每周的第几天,星期一为第一天:(值从0到6,星期一为0)= %w:十进制表示的星期几(值从0到6,星期天为0)
%h,%b 月的简称(Jan~Dec)
%B 月的全称(January~December)
%m:十进制表示的月份(01~12)
%d:十进制表示的每月的第几天 = %e:在两字符域中,十进制表示的每月的第几天
%C:年份的前两位数字
%g:年份的后两位数字,使用基于周的年=%y:不带世纪的十进制年份(值从0到99)
%Y:带世纪部分的十制年份 = %G:年分,使用基于周的年
%j:十进制表示的每年的第几天(001~366)
%W:每年的第几周,把星期一做为第一天(值从0到53)
%U:第年的第几周,把星期日做为第一天(值从0到53)
%V:每年的第几周,使用基于周的年
%R:显示小时和分钟:hh:mm
%T:显示时分秒:hh:mm:ss
%X:标准的时间串:%H:%M:%S
%D:月/日/年
%F:年-月-日
%c:标准的日期的时间串 (Tue Nov 20 14:12:58 2012)
%x:标准的日期串
%z,%Z:时区名称,如果不能得到时区名称则返回空字符。
%n:新行符
%t:水平制表符
%%:百分号 (类似转义符号)
实例演示:1
2
3
4
5
6
7
8
9
10
11
12# 示例1.CST(北京时间)与UTC时间
$date
2019年 06月 04日 星期二 09:29:08 CST
$date -u
2019年 06月 04日 星期二 01:28:49 UTC
# 示例2.使用%显示出时间
$date "+%Y-%m-%d %H:%M:%S"
2019-06-04 09:34:01
date '+%y-%m-%d'
16-09-29 #/%y/%Y:2016/16
1 | #示例3.设置系统时间 |
1 | #示例4. 当前时间/减去/加上 10 天: |
描述:该命令可以完整显示当前系统时间时区,以及是否启用NTP同步以及设定当前系统时间何时区;
基础语法:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18timedatectl [OPTIONS...] COMMAND ...
Query or change system time and date settings.
-h --help Show this help message
--version Show package version
--no-pager Do not pipe output into a pager
--no-ask-password Do not prompt for password
-H --host=[USER@]HOST Operate on remote host
-M --machine=CONTAINER Operate on local container
--adjust-system-clock 当改变本地RTC模式时,调整系统时钟
Commands:
status Show current time settings
set-time TIME Set system time
set-timezone ZONE Set system time zone
list-timezones Show known time zones
set-local-rtc BOOL Control whether RTC is in local time
set-ntp BOOL Control whether NTP is enabled
基础示例:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19#示例1.显示当前时间信息
timedatectl status
Local time: 二 2019-05-14 17:24:36 CST
Universal time: 二 2019-05-14 09:24:36 UTC
RTC time: 四 2020-05-14 09:24:21
Time zone: Asia/Shanghai (CST, +0800)
NTP enabled: yes
NTP synchronized: no
RTC in local TZ: no
DST active: n/a
#示例2.设定当前日期时间以及时区
sudo timedatectl set-ntp 0 #关闭时间同步后采用能设置时间
sudo timedatectl set-time "2020-02-01 11:11:11"
timedatectl set-timezone "Asia/Shanghai"
#示例3.设定是否使用utc时间
timedatectl set-local-rtc 0[1]
cat /etc/adjtime
描述:time命令用于统计给定命令所花费的总时间,所有类UNIX系统都包含time命令,使用这个命令可以统计时间消耗。
注意:在shell中使用必须使用绝对路径/usr/bin/time 才有选项,使用带参数的必须进行下载 yum install time
1 | #语法 |
实际案例:1
2
3
4
5
6
7#示例1.当测试一个程序或比较不同算法时,执行时间是非常重要的,一个好的算法应该是用时最短的。
$time ls
test.sh winpe_win10_amd64.iso www.sh
#输出的信息分别显示了该命令所花费的real时间、user时间和sys时间。
real 0m0.001s
user 0m0.000s
sys 0m0.001s
1 | #示例2.使用-o选项将执行时间写入到文件中: |
描述:这个命令是及其重要的可以和三剑客联合使用达到非一般的效果,可以对来自标准(stdin)输入的字符进行替换、压缩和删除。它可以将一组字符变成另一组字符,经常用来编写优美的单行命令,作用很强大。
语法参数:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38tr [选项]... SET1 [SET2]
#选项
-c或——complerment:取代所有不属于第一字符集的字符;
-d或——delete:删除所有属于第一字符集的字符;
-s或--squeeze-repeats:把连续重复的字符以单独一个字符表示;
-t或--truncate-set1:先删除第一字符集较第二字符集多出的字符。
#SET 是一组字符串,一般都可按照字面含义理解。解析序列如下:
\NNN 八进制值为NNN 的字符(1 至3 个数位)
\\ 反斜杠
\a 终端鸣响
\b 退格
\f 换页
\n 换行
\r 回车
\t 水平制表符
\v 垂直制表符
字符1-字符2 #从字符1 到字符2 的升序递增过程中经历的所有字符 [0-9]
[字符*] #在SET2 中适用,指定字符会被连续复制直到吻合设置1 的长度
[字符*次数] #对字符执行指定次数的复制,若次数以 0 开头则被视为八进制数
[:alnum:] 所有的字母和数字
[:alpha:] 所有的字母
[:cntrl:] 所有的控制字符
[:digit:] 所有的数字
[:graph:] 所有的可打印字符,不包括空格
[:lower:] 所有的小写字母
[:upper:] 所有的大写字母
[:print:] 所有的可打印字符,包括空格
[:punct:] 所有的标点字符
[:space:] 所有呈水平或垂直排列的空白字符
[:blank:] 所有呈水平排列的空白字符
[:xdigit:] #所有的十六进制数
[=字符=] #所有和指定字符相等的字符
#字符集1:指定要转换或删除的原字符集。
#字符集2:指定要转换成的目标字符集。
Tips:当执行转换操作时,必须使用参数"字符集2”指定转换的目标字符集。但执行删除操作时,不需要参数"字符集2”;
实际案例:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72#示例1.字符替换
#'A-Z' 和 'a-z'都是集合,集合是可以自己制定的,例如:'ABD-}'、'bB.,'、'a-de-h'、'a-c0-9'都属于集合,集合里可以使用'\n'、'\t',可以可以使用其他ASCII字符。
echo "HELLO WORLD" | tr 'A-Z' 'a-z' #将输入字符由大写转换为小写:
# hello world
echo "HELLO WORLD" | tr 'HLW' 'hlw'
# hEllO wORlD
$echo "HELLO WORLDW" | tr 'HLW' 'hl' #注意当字符集1集合数量大于字符集2集合数量的时候,便会用字符集2最后一个字符来
# hEllO lORlDl
#示例2.字符删除
echo "hello 123 world 456" | tr -d '0-9'
# hello world
# 将文件里面制表符(tab)转换为空格:
cat text | tr '\t' ' '
# hello-world
#示例3.字符集补集,从输入文本中将不在补集中的所有字符删除 -c "只留下指定的字符集":
#此例中,补集中包含了数字0~9、空格和换行符\n,所以没有被删除,其他字符全部被删除了
echo aa.,a 1 b#$bb 2 c*/cc 3 ddd 4 | tr -d -c '0-9 \n'
# 1 2 3 4
#示例4.用tr压缩字符,可以压缩输入中重复的字符(-s):
echo "thissss is a text linnnnnnne." | tr -s 'sn'
# this is a text line.
grep -v -E '^#' /etc/ssh/sshd_config | tr -s '\n' #常用取消显示多个空白行(即连续换行)
#示例5.# 对应替换 -t (依次对应):
cat 1.txt | tr -t "ello" "Hell"
# HHlll Wlrld
#示例6.# 巧妙使用tr做数字相加操作:
echo 1 2 3 4 5 6 7 8 9 | xargs -n1 | echo $[ $(tr '\n' '+') 0 ] #值得学习
#示例7.删除Windows文件"造成”的'^M'字符,类似玉dos2unix的作用
cat file | tr -s "\r" "\n" > new_file
cat file | tr -d "\r" > new_file
#示例8.使用字符类来进行设置
echo "qwe1234,./zxcad" | tr -d -c '[:digit:] \n' #-c 相当于取反的效果
1234
echo "qwe1234,./zxcad" | tr -d '[:punct:]' # 删除所有的标点字符
qwe1234zxcad
echo "qwe1234,./zxcad" | tr -d -c '[:punct:] \n' #删除所有非标点字符
,./
#示例9.从文件中读取字符串进行出现
tr ' ' '\n' < demo.txt
tr '\r\n' '\n' < index.html.log #值得学习
#实例10.删除所有特殊符号
cat 20200524113201-index.html.log | tr -d '[:cntrl:][:punct:]'
12a13 var monitorcqzsk605c606 script script
#示例11.分隔字符串采用空格来分隔字符串,然后以数组的形式输出;
array=($(echo "hello,shell,split,test" | tr ',' ' ') )
for var in ${array[@]}; do
echo $var
done
# 示例12.删除提取系统版本的多余字符串
grep -e "^VERSION=" /etc/os-release | sed "s#VERSION=##g" | tr -d '[:punct:][:space:]'
grep -e "^VERSION=" /etc/os-release | cut -f 2 -d "=" | tr -d '[:punct:][:space:]'
描述:用于打印目录或者文件的基本名称,basename和dirname命令通常用于shell脚本中的命令替换来指定和指定的输入文件名称有所差异的输出文件名称。
语法参数:1
2
3
4
5Usage: basename NAME [SUFFIX]
or: basename OPTION... NAME...
-a, --multiple #支持多个文件路径 参数
-s, --suffix=SUFFIX #remove a trailing SUFFIX 删除尾随后缀
-z, --zero # separate output with NUL rather than newline 使用NULL而不是换行分隔输出
实际案例:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24#示例1.要显示一个shell变量的基本名称请输入
basename $WORKFILE #如果WORKFILE代表路径变量
basename $HOME
# root
basename /var/log/messages
# messages
[root@localhost ~]# basename /etc/php.ini
php.ini
[root@localhost ~]# basename /etc/nginx/
nginx
#示例2.其他示例
basename include/stdio.h .h -> "stdio"
basename -s .h include/stdio.h -> "stdio"
basename -a any/str1 any/str2 -> "str1" "str2"
#示例3.shell中进行使用,#当然也可以在shell中引用当前名字
#!/bin/bash #test.sh
basename ${0}
#构造一个和另外名称相同*(除了后缀)的文件名称请输入
Filename=`base /home/weiyigeek/program.c .c`.o #重新拼接的program.o文件
描述:去除文件名中的非目录部分,仅显示与目录有关的内容,dirname命令读取指定路径名保留最后一个/及其后面的字符,删除其他部分,并写结果到标准输出n如果最后一个/后无字符dirname 命令使用倒数第二个/,并忽略其后的所有字符。
实际案例:1
2
3
4
5
6#示例1.出现绝对路径中的文件名称,返回起文件存在的路径目录
$dirname /home/tank/test.bz2
/home/tank
dirname /usr/bin/ -> "/usr"
dirname dir1/str dir2/str -> "dir1" followed by "dir2"
dirname stdio.h -> "."
描述:readlink是linux系统中一个常用工具,主要用来找出符号链接所指向的位置.简单地说就是一直跟随符号链接,直到直到非符号链接的文件位置,限制是最后必须存在一个非符号链接的文件。
语法参数:1
-f, --canonicalize # 通过递归地跟踪给定名称的每个组件中的每个符号链接来规范化;
实际案例:1
2
3#示例1.查找当前运行脚本的实际连接地址
readlink -f /bin/bash #相当于是软连接
# /usr/bin/bash
描述:打印当前进程可用的处理单元数哪个可能小于在线处理器的数量;
实际示例:1
2
3#示例1.当前进程可用处理单元数
nproc --all
1
描述:seq命令用于产生从某个数到另外一个数之间的所有整数,主要可以用于生成密码字典;(Important)
基础语法:1
2
3
4
5
6
7
8seq [选项] 尾数 #默认从1开始
seq [选项] 首数 尾数 #默认从1开始,可指定为0
seq [选项] 首数 step数 尾数 #指定步数
#选项
-f, --format=格式 使用printf 样式的浮点格式
-s, --separator=字符串 使用指定字符串分隔数字(默认使用:\n)
-w, --equal-width 在列前添加0 使得宽度相同,注意不能和-f一起用,输出是同宽的
实际案例:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41#示例1.基础示例
$seq 3
1
2
3
$seq 0 3
0
1
2
3
$seq 0 2 5
0
2
#示例2.%后面指定数字的位数 默认是%g,%3g那么数字位数不足部分是空格。
$seq -f"%3g" 9 11
# 9
# 10
# 11
$seq -f"str%03g" 9 11 #$这样的话数字位数不足部分是0,%前面制定字符串。
# str009
# str010
# str011
#示例3.-w选项:指定输出数字同宽
$seq -w 98 101
098
099
100
101
#示例4.-s选项:指定分隔符(默认是回车)
$seq -s " " -f "str%03g" 9 11
str009 str010 str011
#要指定/t做为分隔符号:
$seq -s "$(echo -e '\t')" 9 11
9 10 11
描述: 该命令可以就地压缩可执行文件并使其自动运行,当您运行它们时(在性能上会有损失)会自动解压缩并执行。
主要应用场景: 在写数据库相关链接的Shell脚本时会包含一些敏感的密码这是不安全的,所以此时可以采用gzexe命令来加密这些脚本保证安全性。
语法参数:1
2
3Usage: /usr/bin/gzexe [OPTION] FILE...
# [OPTION]
-d 解压给定的可执行文件而不是压缩它们。
基础示例:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20# 1.最简单示例
~$ vim gzTest.sh
#!/bin/bash
set password = "WeiyiGeek"
echo "Hello World!gzexe Command"
~$ gzexe gzTest.sh
gzTest.sh: -2.7%
~$ chmod +x gzTest.sh && ./gzTest.sh
Hello World!gzexe Command
~$
# 2.将二进制或者shell脚本进行混淆加密
gzexe /usr/bin/gdb # it will create the following two files:
-rwxr-xr-x 1 root root 1026675 Jun 7 13:53 /usr/bin/gdb # 编码混淆后文件
-rwxr-xr-x 1 root root 2304524 May 30 13:02 /usr/bin/gdb~ # 原始文件
# 3.解密被加密的脚本(实际上就是一个解压的功能)
$ gzexe -d gzTest.sh
$ ls
gzTest.sh gzTest.sh~
Tips : 一旦确定/usr/bin/gdb有效就可以删除/usr/bin/gdb~.
你好看友,欢迎关注博主微信公众号哟! ❤
这将是我持续更新文章的动力源泉,谢谢支持!(๑′ᴗ‵๑)
温馨提示: 未解锁的用户不能粘贴复制文章内容哟!
方式1.请访问本博主的B站【WeiyiGeek】首页关注UP主,
将自动随机获取解锁验证码。
Method 2.Please visit 【My Twitter】. There is an article verification code in the homepage.
方式3.扫一扫下方二维码,关注本站官方公众号
回复:验证码
将获取解锁(有效期7天)本站所有技术文章哟!
@WeiyiGeek - 为了能到远方,脚下的每一步都不能少
欢迎各位志同道合的朋友一起学习交流,如文章有误请在下方留下您宝贵的经验知识,个人邮箱地址【master#weiyigeek.top】
或者个人公众号【WeiyiGeek】
联系我。
更多文章来源于【WeiyiGeek Blog - 为了能到远方,脚下的每一步都不能少】, 个人首页地址( https://weiyigeek.top )
专栏书写不易,如果您觉得这个专栏还不错的,请给这篇专栏 【点个赞、投个币、收个藏、关个注、转个发、赞个助】,这将对我的肯定,我将持续整理发布更多优质原创文章!。
最后更新时间:
文章原始路径:_posts/系统运维/Linux/常用命令/脚本常用类命令/Shell脚本常用命令一览.md
转载注明出处,原文地址:https://blog.weiyigeek.top/2019/6-3-179.html
本站文章内容遵循 知识共享 署名 - 非商业性 - 相同方式共享 4.0 国际协议