外层应用程序建立在Linux操作系统上,并通过Shell与用户进行通信。
for i in /etc/profile.d/*.sh /etc/profile.d/sh.local ; do
if [ -r "$i" ]; then
if [ "${-#*i}" != "$-" ]; then
. "$i"
else
. "$i" >/dev/null
fi
fi
done
因为执行/etc/profile文件也会对profile.d中.sh的文件进行执行,这也说明了为什么在/etc/profile.d中要新建myenv.sh文件并在其中配置环境变量。
Shell命令是解释型命令,用于执行各种操作。它们可以存储在Shell脚本文件中,用于对虚拟机进行通配,包括设置环境变量、优化等操作。以下是关于Shell命令的一些概述:
sed -i
进行文件内容替换、重定向操作以及修改文件权限和目录的操作。以下是一些常用的Linux目录操作命令:
pwd
: 查看当前工作目录。
ls [选项][路径]
: 列出目录中的文件和子目录。
ls -l
: 以长格式显示当前工作目录中的文件和目录。ls -h
: 文件大小以M的大小格式显示。ls -a
: 仅列出当前工作目录中的所有文件和目录,包括以.
(当前目录)和..
(上级目录)开头的隐藏文件和目录。ls -la
: 以长格式列出当前工作目录中的所有文件和目录,包括隐藏文件和目录。ls -1S
: 以单列模式并按照文件大小倒序排序。ll -h -1S
: 按文件大小对目录下的文件进行倒序排序,并显示文件的大小(MB)。cd [路径]
: 切换到其他目录。
cd /opt/software/
: 绝对路径。cd henry/
: 相对路径(以当前目录作为根目录)。cd ~
: 切换到当前用户的主目录。cd -
: 切换到上一次使用的工作目录。cd ../
: 返回上一级目录。cd ../../dir1/text1
: 返回上两级目录后进入dir1/text1
目录。mkdir [选项][目录名]
: 创建一个文件夹
mkdir -p
: 表示如果上级目录不存在,也会一同创建上级目录。mkdir -p b/e
: 创建目录b/emkdir a b c d
: 创建(多个)同级目录rm [选项][文件|目录名]
: 删除文件或目录
rm -rf
: 删除包括该级目录下的所有目录(递归删除)
cp [文件|-r 目录名][目录名]
: copy文件或者目录下的所有文件
cp data.log test/
: 复制data.log到test目录下,默认复制文件的文件名名为data.logcp -r /root/opt/software/ /root/opt/
mv [文件名][目录名]
: move文件,跨目录移动文件或同目录修改文件名
mv data.log test/
: 移动data.log到test目录下mv data_cp.log data_copy.log
: 如果此时两文件在同一目录下,则为重命名xargs [选项] [命令]
: 将接收到的字符串利用分隔符分隔为多个参数,并传递给后面的命令当作命令行参数
-d '分隔符'
: 指定处理输入数据的分隔符-n [数字]
: 每次只传递指定数量的参数示例:
find / -name "*.txt" | xargs rm
grep "" | xargs ...
ls -1S | head -n 10 | xargs rm
cat files.txt | xargs -n 1
cat nowcoder.txt | xargs -d ' ' -n 1
: 将文件内容以’ '分隔,并且每行输出一个(注意-d并需要指定,即使是默认的空格分隔符,因为文本内容中可能出现无法解析的内容)cut
:
cut -d ' ' -f1,2
: -d用于指定分隔符,-f[1,2…]取各个部分cut -c 1-5 logs.txt
: 截取每行数据范围内的所有字符ll|sed -n '2,$p'|cut -d ' ' -f1
tr
:
ll|tr 'a-z' 'A-Z'
: 字符替换ll|tr -d 'a-f'
: 字符删除ll|tr -s 'o'
: 连续字符只显示一次uniq [选项][文件]
: 去除文件的重复行
uniq -c
: 统计重复行出现的次数(格式:次数+重复行内容) uniq -c 执行前要先 sort ,保证相同数据相邻uniq -d
: 只显示重复行内容uname [选项]
: 查看当前系统信息
uname -r
: 列出当前系统的具体内核版本号。uname -s
: 列出系统内核名称。uname -o
: 列出系统信息。cat [选项][文件]
: 显示文件内容
cat -n
: 由1开始对所有输出的行进行编号(可能是为了删除或者修改某行)cat -n data1.log|awk '{if($1%2==0) print $0}'
: 先对数据进行编号,再获取偶数编号的数据more✔/less(-e)
: 文件内容分屏查看器(–More–(46%)表示此页内容在全文的46%位置处)
ENTER
: 按行查看SPACE
: 按页查看grep [选项][正则][文件]
: 匹配过滤
grep -i
: 不区分大小写grep -v
: 显示不能被模式匹配到的行grep -E
: 支持正则grep -w
: 只识别完整的条件grep hello text.log
: 直接检索head
: 从文件开始显示文件内容
head -n N
: 显示指定文件开始的n行数据sort [选项][文件名]
: 对文件内容排序(默认以行为单位,首字母进行排序)
sort -u
: 唯一排序(去重)sort -kN
: 按照第N个字段进行排序(eg: sort -k2
)sort -t[字符]
: 以所给字符作为分隔符划分字段(eg: sort -t,
)sort -r
: 进行倒序排序sort -n
: 保证数据中的数字被正确识别tail
: 从文件结尾显示文件内容
tail –f
: 用于实时监视文件的新增内容tail –n N
: 查看某个文件结尾N行的内容touch [文件]
: 创建一个文件
help [命令名]
: 获得Shell内置命令的帮助信息
pwd: pwd [-LP] []
表示可选的选项 ✔man [命令名]
: 查询命令详细参数
q
: 退出tar [选项][文件名][目录名]
: 解压缩
x
: 表示解压缩c
: 打压缩包(反向)v
: 过程详情-C
: 指定目标目录tar -zxvf example.tar.gz -C /path/to/destination
解压缩一个tar.gz文件到指定目录下。tar -zcvf example.tar.gz -C /path/to/destination
压缩一个tar.gz文件到指定目录下。wc [选项][文件名]
: 查看文件大小(行数 单词数 字节数)
l
: 查看文件的文件行数(输出包含了文件行数和文件名)
cat data1.log | wc -l
for item in list(list内容可以是数字也可以是字符串,内容用""扩起,空格分隔)
do
echo $item
done
for item in {1..5}
do
echo $item
done
for item in {1..10..2}
do
echo $item
done
可以使用vi
或vim
命令来创建、编辑和查看文本文件,以下是一些常用的vi
命令:
vi[m] [文件名]
: 创建、编辑、查看文本文件。在命令模式下执行文本编辑操作。
[命令模式]
i
: 进入编辑模式。:
: 进入命令模式,命令写在冒号之后。/[文本]
: 查找文本第一个匹配位置。q!
: 退出并不保存。w
: 保存并不退出。[光标移动]
gg
: 跳到文件首行。shift + g
: 跳至文件尾行。0
: 跳到当前行的开头。$
: 跳到当前行的末尾。n+gg
: 跳到第n行。[删除文本]
x
: 删除光标所在位置的字符。dd
: 删除当前行。ndd
: 删除当前行及其后的n行。[复制和粘贴]
yy
: 复制当前行。nyy
: 复制当前行及其后的n行。p
: 粘贴已复制的文本。[撤销和重做]
u
: 撤销上一个操作。ctrl+r
: 重做上一个被撤销的操作。[编辑模式]
shift + zz
: 默认保存并退出。:x
: 默认保存并退出。i
: 在光标处插入。a
: 在原光标处的后一个位置插入内容。o
: 光标行下的新行插入。esc
: 退出编辑模式并回到命令模式。sed [选项][命令][文件]
-r
开启扩展正则ERE支持-i
直接修改原文件(默认为模式修改,不修改文件)-n
关闭模式输出,不按默认形式输出所有行-f
将命令写在文件中 sed -f cmd-file file
cmd-file
表示包含sed
命令的脚本文件,表示对file文件应用脚本文件定义的sed
操作,并且输出结果。s
替换 [4[,6]]s/regex/replace/[g]
substitute
sed -r '4,6s/\bha([0-9]+)?doop\b/they/g' test1.log
d
删除行 (/regex/|4[,6][1,$]...
)d 中美元符号表示最后一行(即代表删除全部行) delete
sed '/^[[:space:]]*$/d' filename
删除空白行i
向上插入新文本行 (/regex/|4
)i\inserted line(此时的新增行在第四行的位置) inserta
向下插入新文本行 (/regex/|4
)a\inserted line(此时的新增行在第五行的位置) appendp
输出行 (/regex/|4[,6]
)p 搭配-n
一起使用才生效
sed -n '4,6p' test1.log
获取4到6行的数据awk [选项] 'BEGIN{}{}END{}' [文件]
BEGIN{}
在开始处理输入之前执行一次{}
对输入文件的每一行执行一次END{}
处理完所有的输入之后执行一次print var
, ""
, $1
($1取第一块内容 $0取整行) | {}
1 (不需要写print,输出整行内容,{}默认为不输出) | {print $0,$3,$NF}
=> 默认打印出来的内容以空格分隔。-F
指定分隔符,默认空格-v
定义变量,向内传值/regex/{...}
awk '/root/{print $1}' test.log
打印root所在的第一列if... ; else
分支结构 {if($2>10) print $2; else print $NF }
for() do; { for(i=1; i<=NF; i++) print $i; }
for() do; { for(k in array) print array[k]; }
awk '{for(i=1;i<=NF;i++){if(NR==1) row[i]=$i;else row[i]=row[i]" "$i}}END{for(i=1;i<=NF;i++){print row[i]}}' nowcoder.txt
NF
当前行的列数NR
当前行的行号awk '{print "Line " NR ": " $0}' data1.log
打印行号和行内容{print $1,$2}
用空格分隔,{print $1","$2}
才用逗号分隔。awk '{if($NF>=75) print $1","$NF; else print "UNPASS"}' data1.log
length(STRING)
获取字符串长度substr(STRING,START,LENGTH)
获取子字符串index(STRING,SUBSTRING)
返回指定子字符串在原字符串中第一次出现的位置(从1开始)。printf(FORMAT,VALUE)
格式化输出字符串match(STRING,REGEX)
返回正则表达式在字符串中第一次匹配的位置(从1开始)。split(STRING,ARRAY,SEPARATOR)
将字符串按照指定的分隔符拆分为多个字符,存放在数组中toupper(STRING)
& tolower(STRING)
将字符串中的字符转换为大小或小写形式gsub(REGEX,REPLACEMENT,STRING)
替换所有匹配项sub(REGEX,REPLACEMENT,STRING)
替换第一个匹配项A|B
管道符,A|B表示将命令A的输出作为命令B的输入,常配合grep使用。>|>>
查询结果重定向(>覆盖,>>追加)cat >> event.log '< 动态文本编辑
COMMAND 1>>info.log 2>>err.log
需要将结果记录到日志中,屏幕无输出COMMAND 2>/dev/null
对需要遍历文件系统或需要特定权限的操作时,经常会遇到权限拒绝、访问拒绝或其他错误信息。COMMAND 1>/dev/null 2>&1
无需查看结果,也无需将结果记录到日志中$
$i
, i
为数组索引,$i
表示数组中索引为i
的元素的值""
~
if($6 ~ /^[0-9]+$/)
root
的ID为0, Linux系统权限最高的用户useradd [用户名]
:添加用户userdel [用户名]
:删除用户last
:查看历史登录系统用户访问详情列表w/who/whoami
:查看当前用户信息passwd [用户名]
:设置用户密码id
:查看当前用户UID和GIDcat /etc/passwd
:查看创建了哪些用户cat /etc/group
:查看创建了哪些用户组cat /etc/shadow
:查看密码su[用户名]
:改变用户身份或切换到rootsu -l[用户名]
:切换到其他用户账户并且加载该用户的完整环境sudo[选项]命令[命令参数]
:暂时以root身份执行某个任务usermod-l[新用户名][旧用户名]
:修改用户登录名groups
:查看当前用户所属分组或指定用户所属分组groupadd[组名]
:添加分组gpasswd[组名]
:管理用户组成员usermod-g[新组名][用户名]
:修改用户所属分组groupdel[组名]
:删除分组chmod
:修改权限chown
:变更文件的所有者-rwxr-xr-x. 1 root root 964536 Nov 25 2021 bash
top
:查看系统实时健康状态mpstat
:查看CPU使用率free
:查看内存df
:查看磁盘空间ps -ef | grep [进程标识]
kill -9 [PID]
netstat -anutp
标准化地打包、安装、升级和删除Linux软件。
wget package_url
下载RPM包rpm -ivh 包名
安装RPM包,再用yum install
安装服务rpm -qa | grep 包名
查看RPM安装包rpm -e 包名
删除RPM安装包(不会删除已经安装到系统里的资源)yum -y remove 包名
删除RPM安装包并且删除对应的资源自动获取、安装和更新RPM包。
yum search 服务名|命令
查找服务、命令相关的资源yum -y install 服务名
安装服务yum -y remove 服务名
卸载服务tar -zcvf 目标压缩包路径 源目录路径
tar -zxvf 源包路径 [-C 目标解压路径(缺省默认当前路径)]
tar.gz|tgz
的形式?tar
和gzip
的组合方便打包并压缩。现代的Windows工具可以打开和创建这种格式,便于不同操作系统之间的文件交互。
systemctl list-units -all
列出所有服务systemctl list-units --all | grep "active (running)"
列出在线的服务systemctl status SERVICE_NAME mysqld, firewalld, sshd, NetworkManager
查看指定服务名的服务状态systemctl start SERVICE_NAME
systemctl stop SERVICE_NAME
systemctl restart SERVICE_NAME
重启(大更改)systemctl reload SERVICE_NAME
不重启(小更改,重载配置信息)systemctl enable/disable SERVICE_NAME
systemctl mask/unmask SERVICE_NAME
m=date +%m
提取月份(假设为09)let q=(m-1)/3+1
=> -bash: let: 09: value too great for base (error token is “09”)let q=(10#$m-1)/3+1
因为Linux默认为8进制,需要先进行转换才可以继续进行计算。echo
打印输出
echo -n CONTENT
不换行输出echo -e CONTENT
(支持转义符:\t \n)
echo -e "\033[31m$1\033[0m"
(将$1替换为内容,格式为红色,通常用于异常输出)printf
格式化输出
printf "FORMAT_STR" VARS
printf "%s,%.2f" "$a" "$n"
printenv
输出环境变量
printenv ENV_NAME
<=> echo $ENV_NAME
date [选项][+格式]
-u
指定时区,缺省默认本地-d DATE
, 指定运算规则date +%F
输出"年-月-日"(Full Date)date +%T
输出"时-分-秒"(Time)date +"%F %T"
标准时间格式date +%Y
输出年date +%m
输出月date +%d
输出日date +%H
输出时(24)date +%M
输出分date +%S
输出秒date +%j
输出今天是今年的第几天date +%W
输出今天属今年的第几周date +%w
输出今天是星期几(0-6代表日、一-六)date +%s
输出时间戳date +%m
输出今天属今年的第几月date -d "2021-05-11 10:25:39" +%s
日期转秒date -d "±N year|month|week|day" +%F
日期前后计算①不指定日期date -d "-5 day 2021-05-11 10:25:39" +"%F %T"
②指定日期date -d "@1621563938" +"%F %T"
秒转日期yum -y install ntpdate.x86_64
ntpdate -u cn.pool.ntp.org
find [起始目录][选项]
-name wildcard
:以名查找(查找的条件不是正则表达式,而是通配符)-type d|f
:以类型查找(d 目录 f 文件)-(a|c|m)(min|time) ±n(minutes|hours)
-maxdepth [数字]
控制搜索的最大深度find /root -type f -mmin -30 -mmin +5 | grep -iw proto
locate [文件名[文件后缀]]
which|whereis [待查找内容]
查找文件所在的位置[1]>
重定向stdout覆盖[1]>>
重定向stdout追加2>
重定向stderr覆盖2>>
重定向stderr追加&用于将一个文件描述符与另一个文件描述符相关联。&1表示将标准输出流(文件描述符1)与某个目标相关联。
command > output.txt 2>&1
则表示stdout和stderr合并都发送到output.txt
file
查看文件类型ln -s [指向目录] 链接名
创建软链接。crontab
克隆表达式
-e
编辑(个体删除)-l
查看-r
整体删除* * * * * /path/to/command arg1 arg2
*/5 * * * *
0 * * * *
0 0 * * *
0 0 1 * *
0 0 * * 0
或 0 0 * * 7
0 0 * * 1-5
0 0 * * 6,7
*表示任何,*/n表示每n个时间单位
(时间单位即为*对应的时间单位),,表示多个时间点,-表示间隔时间段。
编写定时任务后如何进行检验?
tail -f resource.log | var/log/cron
例:定时任务每半个小时将系统资源(CPU占用率,MEM剩余容量和占用率,DISK剩余容量与占用率,容量单位GB,
容量和占用率都保留2位小数)情况存入当前用户主目录下log目录下的resource.log下。
vim collect_resource.sh
=================================================================================================================================================
CPU_USAGE=$(mpstat|awk '/all/{printf("%.2f\n",(100-$NF)/100)}')
MEM_FREE=$(free|awk '/Mem/{f=$4;M=1024*1024;printf("%.2f\n",f/M)}')
MEM_PERCENT=$(free|awk '/Mem/{f=$4;t=$2;printf("%.2f\n",f/t)}')
DISK_FREE=$(df|awk 'BEGIN{t=0;u=0}/\/dev\/s.*/{next}/[0-9]{2,}/{t+=$2;u+=$3}END{M=1024*1024;t/=M;u/=M;l=t-u;printf("%.2f",l)}')
DISK_PERCENT=$(df|awk 'BEGIN{t=0;u=0}/\/dev\/s.*/{next}/[0-9]{2,}/{t+=$2;u+=$3}END{M=1024*1024;t/=M;u/=M;l=t-u;o=l/t;printf("%.2f",o)}')
echo "$(date +'%Y-%m-%d %H:%M:%S') - CPU: $CPU_USAGE, MEM: ${MEM_FREE}G ($MEM_PERCENT), DISK: ${DISK_FREE}G ($DISK_PERCENT)" >> ~/log/resource.log
=================================================================================================================================================
chmod u+x collect_resource.sh
crontab -e
打开定时任务编辑器
*/30 * * * * /path/to/collect_resources.sh
history
查看当前用户进行实验语句的历史记录
两种退出
ctrl+c
结束进程
1.一个无限循环的脚本
2.一个长时间运行的命令
ctrl+d
结束终端会话或输入
1.在Shell提示符下结束终端会话
2.在免密登录的情况下,安全地退出远程会话。