Shell基础

awk

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
# 检测是否安装
$ rpm -qa | grep awk
$ yum list installed | grep awk
$ dpkg -l | grep awk

# 语法
$ awk [-F | -f | -v] 'BEGIN {} // {command1;command2} END {}' file
## -F 指定分隔符,默认空格
## -f 指定文件
## -v 定义变量
## '' 引用代码块
## BEGIN 初始化代码块
## // 匹配代码块,可以是字符串或正则表达式
## {} 命令代码块,包含一条或多条命令
## ; 多条命令使用分号分割
## END 结尾代码块
## $0 表示当前行
## NF 字段数量变量
## NR 每行的记录号,多文件记录递增
## \t 制表符
## \n 换行符
## ~ 匹配,与==相比不是精确比较
## ~! 不匹配,不精确比较
## -F'[:#/]' 定义三个分隔符
## IF语句 必须在{}中,且比较内容用()扩起来
## ^$ 表示空行

# 位置参数$
## $0、$1、$2......
## 打印ip地址
$ ipaddr=$(ifconfig enp0s3 | grep "broadcast" | awk '{print $2}')
$ echo $ipaddr

## 打印出 passwd 中用户 UID 大于 1000 的用户名和登陆 shell ddd
$ cat /etc/passwd | awk -F: '$3>=1000 {print $1 "\t" $7}'

## 打印出系统中能登陆的普通用户
$ cat /etc/passwd | awk -F: '$3>=1000 && $7=="/bin/bash"{print $1 "\t" $7}'

## 打印输出信息时加上表头
$ cat /etc/passwd | awk -F: 'BEGIN {print "NAME \t SHELL"}$3>=1000 && $7=="/bin/bash"{print $1 "\t" $7}'

# 打印内存使用百分比
#!/bin/bash
echo "此脚本可以用来查看当前系统内存使用百分比"
use=$(free -m | grep Mem: | awk '{print $3}')
total=$(free -m | grep Mem: | awk '{print $2}')
useper=$(expr $use \* 100 / $total)
echo "系统当前内存使用百分比为:${useper}%"

# 显示空行的行号
$ awk '{if($0~/^$/)print NR}' file
## ^$ 表示空行

# 如果uid 大于 100,输出 LARGE,否则输出 SMALL
$ awk -F: '{if($3>100)print "LARGE";else print "SMALL"}' /etc/passwd

crontab

1
2
# 查看计划任务
$ crontab -l

cut

1
2
3
4
5
6
7
8
## cut 是一个选取命令,就是将一段数据经过分析,取出我们想要的。
## 一般来说,选取信息通常是针对“行”来进行分析的,并不是整篇信息分析的。
## 主要参数:
## -b:以字节为单位进行分割。这些字节位置将忽略多字节字符边界,除非也指定了 -n 标志。
## -c:以字符为单位进行分割
## -d:自定义分隔符,默认为制表符
## -f: 与-d一起使用,指定显示哪个区域
$

echo

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
# 用echo命令打印带有色彩的文字
$ echo -e "\e[1;31mThis is red text\e[0m"
## \e[1;31m 将颜色设置为红色
## \e[0m 将颜色重新置回
## 颜色码:
## 重置=0
## 黑色=30
## 红色=31
## 绿色=32
## 黄色=33
## 蓝色=34
## 洋红=35
## 青色=36
## 白色=37

# 文字闪动
$ echo -e "\033[37;31;5mMySQL Server Stop...\033[39;49;0m"
## 红色数字处还有其他数字参数:
## 0 关闭所有属性
## 1 设置高亮度(加粗)
## 4 下划线
## 5 闪烁
## 7 反显
## 8 消隐

find

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
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
# 语法
$ find <起始目录> <参数选项>

-amin<分钟>:查找在指定时间曾被存取过的文件或目录,单位以分钟计算;
-anewer<参考文件或目录>:查找其存取时间较指定文件或目录的存取时间更接近现在的文件或目录;
-atime<24小时数>:查找在指定时间曾被存取过的文件或目录,单位以24小时计算;
-cmin<分钟>:查找在指定时间之时被更改过的文件或目录;
-cnewer<参考文件或目录>查找其更改时间较指定文件或目录的更改时间更接近现在的文件或目录;
-ctime<24小时数>:查找在指定时间之时被更改的文件或目录,单位以24小时计算;
-daystart:从本日开始计算时间;
-depth:从指定目录下最深层的子目录开始查找;
-empty:寻找文件大小为0 Byte的文件,或目录下没有任何子目录或文件的空目录;
-exec<执行指令>:假设find指令的回传值为True,就执行该指令;
-false:将find指令的回传值皆设为False;
-fls<列表文件>:此参数的效果和指定“-ls”参数类似,但会把结果保存为指定的列表文件;
-follow:排除符号连接;
-fprint<列表文件>:此参数的效果和指定“-print”参数类似,但会把结果保存成指定的列表文件;
-fprint0<列表文件>:此参数的效果和指定“-print0”参数类似,但会把结果保存成指定的列表文件;
-fprintf<列表文件><输出格式>:此参数的效果和指定“-printf”参数类似,但会把结果保存成指定的列表文件;
-fstype<文件系统类型>:只寻找该文件系统类型下的文件或目录;
-gid<群组识别码>:查找符合指定之群组识别码的文件或目录;
-group<群组名称>:查找符合指定之群组名称的文件或目录;
-help或——help:在线帮助;
-ilname<范本样式>:此参数的效果和指定“-lname”参数类似,但忽略字符大小写的差别;
-iname<范本样式>:此参数的效果和指定“-name”参数类似,但忽略字符大小写的差别;
-inum<inode编号>:查找符合指定的inode编号的文件或目录;
-ipath<范本样式>:此参数的效果和指定“-path”参数类似,但忽略字符大小写的差别;
-iregex<范本样式>:此参数的效果和指定“-regexe”参数类似,但忽略字符大小写的差别;
-links<连接数目>:查找符合指定的硬连接数目的文件或目录;
-iname<范本样式>:指定字符串作为寻找符号连接的范本样式;
-ls:假设find指令的回传值为Ture,就将文件或目录名称列出到标准输出;
-maxdepth<目录层级>:设置最大目录层级;
-mindepth<目录层级>:设置最小目录层级;
-mmin<分钟>:查找在指定时间曾被更改过的文件或目录,单位以分钟计算;
-mount:此参数的效果和指定“-xdev”相同;
-mtime<24小时数>:查找在指定时间曾被更改过的文件或目录,单位以24小时计算;
-name<范本样式>:指定字符串作为寻找文件或目录的范本样式;
-newer<参考文件或目录>:查找其更改时间较指定文件或目录的更改时间更接近现在的文件或目录;
-nogroup:找出不属于本地主机群组识别码的文件或目录;
-noleaf:不去考虑目录至少需拥有两个硬连接存在;
-nouser:找出不属于本地主机用户识别码的文件或目录;
-ok<执行指令>:此参数的效果和指定“-exec”类似,但在执行指令之前会先询问用户,若回答“y”或“Y”,则放弃执行命令;
-path<范本样式>:指定字符串作为寻找目录的范本样式;
-perm<权限数值>:查找符合指定的权限数值的文件或目录;
-print:假设find指令的回传值为Ture,就将文件或目录名称列出到标准输出。格式为每列一个名称,每个名称前皆有“./”字符串;
-print0:假设find指令的回传值为Ture,就将文件或目录名称列出到标准输出。格式为全部的名称皆在同一行;
-printf<输出格式>:假设find指令的回传值为Ture,就将文件或目录名称列出到标准输出。格式可以自行指定;
-prune:不寻找字符串作为寻找文件或目录的范本样式;
-regex<范本样式>:指定字符串作为寻找文件或目录的范本样式;
-size<文件大小>:查找符合指定的文件大小的文件;
-true:将find指令的回传值皆设为True;
-type<文件类型>:只寻找符合指定的文件类型的文件;
-uid<用户识别码>:查找符合指定的用户识别码的文件或目录;
-used<日数>:查找文件或目录被更改之后在指定时间曾被存取过的文件或目录,单位以日计算;
-user<拥有者名称>:查找符和指定的拥有者名称的文件或目录;
-version或——version:显示版本信息;
-xdev:将范围局限在先行的文件系统中;
-xtype<文件类型>:此参数的效果和指定“-type”参数类似,差别在于它针对符号连接检查。

# 列出当前目录及子目录下所有文件和文件夹
$ find .

# 在/home目录下查找以.txt结尾的文件名
$ find /home -name "*.txt"

# 在/home目录下查找以.txt结尾的文件名,并忽略大小写
$ find /home -iname "*.txt"

# 当前目录及子目录下查找所有以.txt和.pdf结尾的文件
$ find . \( -name "*.txt" -o -name "*.pdf" \)
$ find . -name "*.txt" -o -name "*.pdf"

# 匹配文件路径或者文件
$ find /usr/ -path "*local*"

# 基于正则表达式匹配文件路径
$ find . -regex ".*\(\.txt\|\.pdf\)$"

# 基于正则表达式匹配文件路径,并忽略大小写
$ find . -iregex ".*\(\.txt\|\.pdf\)$"

# 找出/home下不是以.txt结尾的文件
$ find /home ! -name "*.txt"

# 根据文件类型进行搜索
$ find . -type 类型参数

# 基于目录深度搜索
## 向下最大深度限制为3
$ find . -maxdepth 3 -type f

## 搜索出深度距离当前目录至少2个子目录的所有文件
$ find . -mindepth 2 -type f

# 根据文件时间戳进行搜索
$ find . -type f 时间戳
## UNIX/Linux文件系统每个文件都有三种时间戳:
## 访问时间(-atime/天,-amin/分钟):用户最近一次访问时间。
## 修改时间(-mtime/天,-mmin/分钟):文件最后一次修改时间。
## 变化时间(-ctime/天,-cmin/分钟):文件数据元(例如权限等)最后一次修改时间。

## 搜索最近七天内被访问过的所有文件
$ find . -type f -atime -7

## 搜索恰好在七天前被访问过的所有文件
$ find . -type f -atime 7

## 搜索超过七天内被访问过的所有文件
$ find . -type f -atime +7

## 搜索访问时间超过10分钟的所有文件
$ find . -type f -amin +10

## 找出比file.log修改时间更长的所有文件
$ find . -type f -newer file.log

## 根据文件大小进行匹配
$ find . -type f -size 文件大小单元
### b —— 块(512字节)
### c —— 字节
### w —— 字(2字节)
### k —— 千字节
### M —— 兆字节
### G —— 吉字节

## 搜索大于10KB的文件
$ find . -type f -size +10k

## 搜索小于10KB的文件
$ find . -type f -size -10k

## 搜索等于10KB的文件
$ find . -type f -size 10k

# 删除当前目录下所有.txt文件
$ find . -type f -name "*.txt" -delete

# 根据文件权限/所有权进行匹配
## 当前目录下搜索出权限为777的文件
$ find . -type f -perm 777

## 找出当前目录下权限不是644的php文件
$ find . -type f -name "*.php" ! -perm 644

## 找出当前目录用户tom拥有的所有文件
$ find . -type f -user tom

## 找出当前目录用户组sunk拥有的所有文件
$ find . -type f -group sunk

# 借助-exec选项与其他命令结合使用
## 找出当前目录下所有root的文件,并把所有权更改为用户tom
$ find .-type f -user root -exec chown tom {} \;

## 找出自己家目录下所有的.txt文件并删除
$ find $HOME/. -name "*.txt" -ok rm {} \;

## 查找当前目录下所有.txt文件并把他们拼接起来写入到all.txt文件中
$ find . -type f -name "*.txt" -exec cat {} \;> all.txt

## 将30天前的.log文件移动到old目录中
$ find . -type f -mtime +30 -name "*.log" -exec cp {} old \;

## 找出当前目录下所有.txt文件并以“File:文件名”的形式打印出来
$ find . -type f -name "*.txt" -exec printf "File: %s\n" {} \;

## 因为单行命令中-exec参数中无法使用多个命令,以下方法可以实现在-exec之后接受多条命令
$ -exec ./text.sh {} \;

# 搜索但跳出指定的目录
## 查找当前目录或者子目录下所有.txt文件,但是跳过子目录sk
$ find . -path "./sk" -prune -o -name "*.txt" -print

# 要列出所有长度为零的文件
$ find . -empty

ntpdate

1
2
# 设置主机与阿里时钟同步
$ ntpdate time1.aliyun.com

sed

1
2
# 
$

tar

1
2
3
4
5
6
7
# 压缩
$ tar -czvf<文件名>.tar.gz <待压缩的文件名>
$ tar -cjvf<文件名>.tar.bz2 <待压缩的文件名>

# 解压缩
$ tar -zxvf <文件名>.tar.gz
$ tar -xvJf node-v8.11.1-linux-x64.tar.xz

uptime

1
2
3
# 打印系统总共运行了多长时间和系统的平均负载
$ uptime
## -V: 显示版本信息

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
# 使用YUM查找软件包 
$ yum search

# 列出所有可安装的软件包
$ yum list

# 列出所有可更新的软件包
$ yum list updates

# 列出所有已安装的软件包
$ yum list installed

# 列出所有已安装但不在 Yum Repository 内的软件包
$ yum list extras

# 列出所指定的软件包
$ yum list

# 使用YUM获取软件包信息
$ yum info

# 列出所有软件包的信息
$ yum info

# 列出所有可更新的软件包信息
$ yum info updates

# 列出所有已安装的软件包信息
$ yum info installed

# 列出所有已安装但不在 Yum Repository 内的软件包信息
$ yum info extras

# 列出软件包提供哪些文件
$ yum provides

正则表达式

其它示例

检测root权限

1
2
3
4
5
6
7
checkRoot() {
ROOT=$(id -u)
case "$ROOT" in
0) ROOT='root';;
*) echo -e "\033[1;31mError: You must be root to run this script\033[0m"; exit 1;;
esac
}

检测操作系统版本

1
2
3
4
5
6
7
8
9
10
11
12
initOS() {
OS=$(uname | tr '[:upper:]' '[:lower:]')
case "$OS" in
darwin) OS='darwin';;
linux) OS='linux';;
freebsd) OS='freebsd';;
# mingw*) OS='windows';;
# msys*) OS='windows';;
*) echo -e "\033[1;31mOS ${OS} is not supported by this installation script\033[0m"; exit 1;;
esac
echo "OS = $OS"
}

检测操作系统位数

1
2
3
4
5
6
7
8
9
10
11
12
13
initArch() {
ARCH=$(uname -m)
BIT=$ARCH
case $ARCH in
amd64) ARCH="amd64";;
x86_64) ARCH="amd64";;
i386) ARCH="386";;
armv6l) ARCH="armv6l";;
armv7l) ARCH="armv6l";;
*) echo -e "\033[1;31mArchitecture ${ARCH} is not supported by this installation script\033[0m"; exit 1;;
esac
echo "ARCH = $ARCH"
}

设置环境变量

1
2
3
4
5
6
7
8
9
10
11
12
13
14
setEnvironment() {
if [ -z "`grep 'export\sGOROOT' /etc/profile`" ];then
echo "export GOROOT=/usr/local/go" >> /etc/profile
fi
if [ -z "`grep 'export\sGOPATH' /etc/profile`" ];then
echo "export GOPATH=/data/go" >> /etc/profile
fi
if [ -z "`grep 'export\sGOBIN' /etc/profile`" ];then
echo "export GOBIN=/data/go/bin" >> /etc/profile
fi
if [ -z "`grep '\$GOROOT/bin:\$GOBIN' /etc/profile`" ];then
echo "export PATH=\$GOROOT/bin:\$GOBIN:\$PATH" >> /etc/profile
fi
}

获得当前shell的绝对路径

1
workPath=$(cd "$(dirname "$0")";pwd)

菜单

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
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
function menu()
{
clear
cat <<EOF
0.【退出】
1.【获取系统信息】
2.【获取性能指标】
3.【性能调优】
EOF
read -p "请选择 0-3:" list
case $list in
"0")
echo -e "exiting . . .\n";
sleep 1
exit 0
;;
"1")
while true
do
menu_GetSI
done
;;
"2")
while true
do
menu_GetPI
done
;;
"3")
while true
do
menu_PO
done
;;

*)
continue
;;
esac
}

function menu_GetSI()
{
clear
cat <<EOF
0.【返回】
1.【获取CPU信息】
2.【获取硬盘信息】
3.【获取内存信息】
4.【获取主板信息】
5.【获取网卡信息】
6.【获取操作系统信息】
7.【获取全部信息】
EOF
read -p "请选择 0-7:" list1
case $list1 in
"0")
break
;;
"1")
echo -e "获取CPU信息\n"
sleep 2
continue
;;
"2")
echo -e "获取硬盘信息\n"
sleep 2
;;
"3")
echo -e "获取内存信息\n"
sleep 2
;;
"4")
echo -e "获取主板信息\n"
sleep 2
;;
"5")
echo -e "获取网卡信息\n"
sleep 2
;;
"6")
echo -e "获取操作系统信息\n"
sleep 2
;;
"7")
echo -e "获取全部信息\n"
sleep 2
;;

*)
continue
;;
esac
}

function menu_GetPI()
{
clear
cat <<EOF
0.【返回】
1.【获取CPU利用率与负载】
2.【获取硬盘I/O负载】
3.【获取硬盘利用率】
4.【获取硬盘inode利用率】
5.【获取内存利用率】
6.【获取网络连接状态】
7.【获取占用CPU高的前10个进程】
8.【获取占用内存高的前10个进程】
9.【获取网络流量】
10.【获取JVM性能指标】
11.【获取全部】
EOF
read -p "请选择 0-11:" list1
case $list1 in
"0")
break
;;
"1")
echo -e "获取CPU利用率与负载\n"
sleep 2
continue
;;
"2")
echo -e "获取硬盘I/O负载\n"
sleep 2
;;
"3")
echo -e "获取硬盘利用率\n"
sleep 2
;;
"4")
echo -e "获取硬盘inode利用率\n"
sleep 2
;;
"5")
echo -e "获取内存利用率\n"
sleep 2
;;
"6")
echo -e "获取网络连接状态\n"
sleep 2
;;
"7")
echo -e "获取占用CPU高的前10个进程\n"
sleep 2
;;
"8")
echo -e "获取占用内存高的前10个进程\n"
sleep 2
;;
"9")
echo -e "获取网络流量\n"
sleep 2
;;
"10")
echo -e "获取JVM性能指标\n"
sleep 2
;;
"11")
echo -e "获取全部\n"
sleep 2
;;
*)
continue
;;
esac
}

function menu_PO()
{
clear
cat <<EOF
0.【返回】
1.【Linux内核调优】
2.【JVM性能调优】

EOF
read -p "please input 1-3:" list1
case $list1 in
"0")
break
;;
"1")
echo -e "Linux内核调优\n"
sleep 2
continue
;;
"2")
echo -e "JVM性能调优\n"
sleep 2
;;

*)
continue
;;
esac
}

while true
do
menu
done

参考

坚持原创技术分享,您的支持将鼓励我继续创作!
0%