【shell】常用100个shell命令使用讲解
- 【一】文件操作命令
- 【二】搜索命令
- 【三】目录操作命令
- 【四】权限操作命令
- 【五】网络操作命令
- 【六】进程和系统控制命令
- 【七】文本操作命令
- 【八】压缩与解压命令
- 【九】磁盘使用管理命令
- 【十】包管理命令
- 【十一】进程管理命令
- 【十二】环境变量命令
- 【十三】系统信息发布相关命令
- 【十四】系统控制命令
- 【十五】文件编辑器命令
- 【十六】其他常用命令
- 【十七】案例
使用Shell脚本,你可以编写一个任务,然后让计算机去做,而你可以去忙其他的事情;你可以编写一个任务,让计算机重复执行,而不需要你每次在命令行手动输入;你可以更灵活地处理任务,比如管理用户,管理程序等。就这样,Shell脚本赋予你控制计算机的能力,在你的指尖下,一切尽在掌握。
【一】文件操作命令
以下是在Linux系统中操作文件的一些常用命令:
(1)ls:列出目录的内容
powershell
ls /home
(2)cd:改变目录
powershell
cd /home/user/Documents
(3)pwd:打印当前工作目录
powershell
pwd
(4)cat:查看文件内容
powershell
cat /etc/passwd
(5)more:分页查看文件内容
powershell
more /var/log/syslog
(6)less:反向分页查看文件内容
powershell
less /var/log/syslog
(7)touch:创建一个空文件或更改文件的访问和修改时间
powershell
touch /home/user/newfile.txt
(8)cp:复制文件或目录
powershell
cp /home/user/file.txt /home/user/Documents
(9)mv:移动或重命名文件或目录
powershell
mv /home/user/file.txt /home/user/Documents/newfile.txt
(10)rm:删除文件或目录
powershell
rm /home/user/unwantedfile.txt
(11)find:在文件系统中搜索文件或目录
powershell
find / -name "*.log"
(12)grep:在文件中搜索具有特定模式的行
powershell
grep "error" /var/log/syslog
(13)head:输出文件的开始部分
powershell
head -n 10 /var/log/syslog
(14)tail:输出文件的尾部
powershell
tail -n 20 /var/log/syslog
(15)sort:对文本文件的行进行排序
powershell
sort /etc/passwd
(16)wc:计算字数、行数和字节数
powershell
wc /var/log/syslog
(17)cut:从文件的每一行中剪切字节、字符和字段
powershell
cut -d: -f1 /etc/passwd
(18)nano,vi,emacs:常用的文本编辑器
powershell
nano /home/user/file.txt
vi /home/user/file.txt
emacs /home/user/file.txt
(19)paste:合并文件的行
powershell
paste file1.txt file2.txt
【二】搜索命令
以下命令可以帮助你搜索文件或文本:
(1)find:在文件系统中搜索文件或目录
powershell
find / -name "*.log"
(2)grep: 在文本文件中搜索决定的文本模式
powershell
grep "error" /var/log/syslog
(3)locate: 基于文件名在数据库中快速找到文件
powershell
locate myFile.txt
(4)which: 返回可执行文件的路径
powershell
which java
(5)ack:特别为程序员设计的一款文件搜索工具。默认会忽略多数版本控制文件夹(如.git, .svn等)的内容
powershell
ack "your_search_term"
(6)ag(The Silver Searcher):比ack更快的代码搜索工具,同样默认忽略 .git 等版本控制文件夹中的内容
powershell
ag "your_search_term"
(7)whereis:此命令可用于查找二进制程序、源文件、手册页以及其他文件的位置
powershell
whereis ls
(8)type:此命令用于确定某个命令是内部 shell 命令、可执行文件还是别名
powershell
type pwd
(9)apropos:如果你只记得关于某个命令的部分信息,你可以使用 apropos 命令来搜索帮助手册中的命令描述
powershell
apropos partition
(10)alias:如果你经常使用某些 Linux 命令,你可以使用 alias 命令为这些常用命令创建一个短名,以提升你的工作效率
powershell
alias l='ls -al'
【三】目录操作命令
以下是在Linux系统中操作目录的一些常用命令
(1)mkdir:创建一个新的目录
powershell
mkdir /home/user/new_directory
(2)rmdir:删除一个空目录
powershell
rmdir /home/user/empty_directory
(3)tree:以树形结构列出目录的内容
powershell
tree /home/user/
(4)du:估计文件和目录的磁盘使用空间
powershell
du -sh /home/user/Documents
(5)df:显示磁盘使用空间
powershell
df -h
【四】权限操作命令
在Linux系统中,文件和目录的访问可以通过权限操作命令进行控制
(1)chmod:更改文件或目录的权限
powershell
chmod 755 /home/user/file.txt
表示设置文件的主用户有读,写和执行权限(rwx = 7),同组的用户和其他用户有读和执行权限(rx = 5)。
(2)chown:更改文件或目录的所有者和所属的组
powershell
chown newuser:newgroup /home/user/file.txt
表示将/home/user/file.txt的所有者更改为newuser,所属的组更改为newgroup。
(3)chgrp:更改文件或目录的所属组
powershell
chgrp newgroup /home/user/file.txt
表示将/home/user/file.txt的所属的组更改为newgroup。
【五】网络操作命令
以下是在Linux系统中与网络相关的一些常用命令
(1)ping:发送网络请求以测试网络连接
powershell
ping www.google.com
(2)ifconfig:显示或配置网络接口
powershell
ifconfig eth0
(3)netstat:显示网络连接、路由表等网络状态信息
powershell
netstat -ntlp
``
(4)ssh:远程登录或执行远程命令
```powershell
ssh user@remote_host
(5)scp:在本地和远程系统之间安全地复制文件
powershell
scp /path/to/file user@remote_host:/remote/path/
(6)curl:获取网络资源
powershell
curl www.google.com
(7)telnet:远程登录工具
powershell
telnet remote_host 23
(8)nslookup:查询 DNS 名称服务器的记录
powershell
nslookup www.google.com
(9)ftp:在本地主机和FTP服务器之间建立FTP连接
powershell
ftp ftp_server
(10)wget:获取网络资源
powershell
wget www.google.com -o google.html
【六】进程和系统控制命令
以下是在Linux系统中管理进程和控制系统的一些常用命令
(1)ps:显示当前进程的状态
powershell
ps aux
(2)top:动态显示运行中的进程
(3)kill:发送信号以终止进程
powershell
kill 1234
(4)shutdown:关闭机器
powershell
shutdown -h now
(5)reboot:重启机器
(6)logout:退出登录会话
【七】文本操作命令
在编写或处理文本文件时,下列命令可以帮助你完成各种复杂任务:
(1)echo:打印信息到终端。
powershell
echo "Hello, World!"
(2)printf:格式化并打印信息。
powershell
printf "Name: %s\nAge: %d\n" "Alice" 20
(3)sed:流编辑器,用于对文本文件进行特定的行处理和替换。
powershell
echo "Hello, World!" | sed 's/World/Shell/g'
(4)awk:在文本文件中进行模式扫描和处理语言。
powershell
echo -e "name\tage\nAlice\t20\nBob\t22" | awk '{if ($2 >= 21) print $1}'
【八】压缩与解压命令
以下命令主要用于管理和操作文件压缩及解压
(1)tar:创建、展开及管理tar包
powershell
tar -cvf archive.tar folder
(2)gzip:用于文件压缩或解压
powershell
gzip file
(3)gunzip:用于解压gzip压缩的文件
powershell
gunzip file.gz
(4)zip/unzip:创建和解压zip格式的压缩包
powershell
zip -r archive.zip folder
unzip archive.zip
【九】磁盘使用管理命令
管理和查看磁盘使用情况
(1)df:报告文件系统磁盘空间使用情况
powershell
df -h
(2)du:估计并报告文件及文件夹的磁盘使用情况
powershell
du -sh folder
(3)fdisk:对磁盘进行分区管理
powershell
sudo fdisk -l
(4)hdparm:查看或修改SATA/ATA磁盘参数
powershell
sudo hdparm -i /dev/sda
【十】包管理命令
(1)apt-get:APT包处理工具,用于处理包
powershell
sudo apt-get install package
(2)dpkg:Debian包管理器
powershell
sudo dpkg -i package.deb
(3)yum:高级软件包管理器,用于处理rpm包
powershell
sudo yum install package
(4)rpm:RPM包管理器
powershell
sudo rpm -i package.rpm
【十一】进程管理命令
查看和管理正在运行的进程
(1)ps:报告进程当前状态
powershell
ps aux
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.0 0.4 225848 7836 ? Ss Nov10 4:05 /lib/systemd/systemd --system --deserialize 39
root 2 0.0 0.0 0 0 ? S Nov10 0:00 [kthreadd]
root 4 0.0 0.0 0 0 ? I< Nov10 0:00 [kworker/0:0H]
(2)top:动态显示当前耗费系统资源最多的进程
(3)htop:比top更友好的动态进程查看工具
powershell
htop
(4)kill: 终止或者发送一个信号到指定进程
(5)pkill:条件地终止或者发送一个信号到指定进程
powershell
pkill process_name
【十二】环境变量命令
查看或设置环境变量
(1)env:显示当前所有的环境变量
powershell
输入:env
输出:
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
SHELL=/bin/bash
PWD=/home/user
(2)set:显示当前shell所有的环境变量及函数
powershell
输入:set
输出:展示所环境变量以及函数
(3)export:设置或显示环境变量
powershell
输入:
export VARName="Value"
echo $VARName
输出结果:
Value
【十三】系统信息发布相关命令
有时,你可能想要查看有关你的系统或硬件的信息。以下命令可以帮助你做到这一点
(1)uname:会打印操作系统的名称
powershell
输入:
uname
输出:
Linux
(2)hostname:打印系统的主机名
powershell
输入:
hostname
输出:
myhostname
(3)dmesg:打印或控制内核环形缓冲区
powershell
输入:
dmesg | less
(4)df:展示文件系统的磁盘空间使用情况
powershell
输入:df -h
输出:
Filesystem Size Used Avail Use% Mounted on
udev 962M 0 962M 0% /dev
tmpfs 200M 4.3M 196M 3% /run
/dev/sda1 30G 4.7G 24G 17% /
(5)free:展示系统中未使用和已经使用的物理和swap内存
powershell
输入:free -h
输出:
total used free shared buff/cache available
Mem: 3.8G 487M 1.9G 122M 1.4G 3.0G
Swap: 0B 0B 0B
(6)uptime:展示系统已经运行了多久,有多少用户正在登录,以及系统负载
powershell
输入:uptime
输出: 16:14:30 up 43 min, 1 user, load average: 0.34, 0.36, 0.40
(7)last:查看系统的重启和关机记录
powershell
输入:last reboot
(8)w: 展示哪些用户正在登录
powershell
输入:w
输出: 16:17:51 up 1:42, 1 user, load average: 0.45, 0.47, 0.38
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
user tty1 14:36 1:42m 1.55s 0.06s w
(9)who:展示哪些用户正在登录,和w命令相似但信息更少
powershell
输入:who
输出: user tty1 2022-01-28 14:36
(10)id:展示当前用户的UID、GID以及所在的组
powershell
输入:id
输出:uid=1000(user) gid=1000(user) groups=1000(user),4(adm),24(cdrom),27(sudo),30(dip),46(plugdev),116(lpadmin),126(sambashare)
【十四】系统控制命令
在一些特殊情况下,你可能需要进行一些系统控制操作。以下命令可以帮助你做到这一点
(1)halt:关机
powershell
输入:sudo halt
(2)reboot:重启系统
powershell
输入:sudo reboot
(3)shutdown:关机或者重启,和上述两个命令一样,但是提供更多的选项
powershell
关闭系统:sudo shutdown -h now
重启系统:sudo shutdown -r now
(4)passwd:更改用户密码
powershell
更改密码:passwd
【十五】文件编辑器命令
Linux提供了多种命令行文本编辑器。以下这些可能是你需要知道的:
(1)vi/vim:vi是一个文本编辑器,而vim是vi的改进版,提供了更多的功能。
(2)nano:一个简单易用的命令行文本编辑器。
(3)emac:一个强大的文本编辑器,也是一个定制化的计算环境。
【十六】其他常用命令
(1)man:查看命令的帮助文档
(2)whatis:显示一个命令的简单描述
powershell
输入:whatis ls
输出: ls (1) - list directory contents
(3)whereis:查找命令的二进制文件、源文件及帮助文档位置
powershell
输入:whereis ls
输出: ls: /bin/ls /usr/share/man/man1/ls.1.gz
(4)which:查找并显示给定命令的完整路径
powershell
输入:which ls
输出:/bin/ls
(5)whoami:打印当前有效的用户名
powershell
输入:whoami
输出:user
(6)date:显示或设置系统日期和时间
powershell
输入:date
输出: Tue Dec 21 02:16:12 UTC 2021
(7)cal:显示日历
powershell
输入:cal
输出:
January 2022
Su Mo Tu We Th Fr Sa
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
(8)alias:创建命令别名
(9)unalias:删除别名
(10)history:显示命令历史
(11)clear:清除屏幕或窗口内容
(12)watch:用于实时查看当前命令打印信息
powershell
输入:watch -n 2 date
解释:watch`命令会每2秒运行一次`date`命令,并实时显示输出
【十七】案例
【1】发布时拉取压缩包的案例
powershell
#!/bin/bash
# 设置根目录
BASE_DIR="/home/damp/server/services"
# 获取当前时间,格式为 YYYYMMDD_HHMM(年、月、日、时、分)
CURRENT_TIME=$(date +"%Y%m%d_%H%M")
# 以当前时间为父目录
TARGET_DIR="$BASE_DIR/bushu_$CURRENT_TIME"
TARGET_IND_DIR="$TARGET_DIR/server-ind"
TARGET_WEB_DIR="$TARGET_DIR/sub-ind"
# 创建目标目录
mkdir -p "$TARGET_IND_DIR"
mkdir -p "$TARGET_WEB_DIR"
echo "已创建目录: $TARGET_DIR"
# 进入目标目录
cd "$TARGET_IND_DIR" || exit
echo "进入目录: $TARGET_IND_DIR"
# 设置源目录
SOURCE_DIR="/home/damp/server/services/damp-xingye-ind/lib"
SOURCE_WEB_DIR="/home/damp/web/pages/subapp/sub-ind"
# 复制以damp开头且包含ind的jar文件到当前目录
cp "$SOURCE_DIR"/damp*ind*.jar "$TARGET_IND_DIR"
echo "后端包复制成功"
# 复制前端包
cp -rf "$SOURCE_WEB_DIR"/* "$TARGET_WEB_DIR"
echo "前端包复制成功"
# 返回到根目录,以便打包
cd "$BASE_DIR" || exit
# 打包当前创建的目录为 .tar.gz 文件
TAR_FILE="bushu_${CURRENT_TIME}.tar.gz"
tar -czvf "$TAR_FILE" "bushu_$CURRENT_TIME"
# 获取当前路径并输出完整的打包文件路径
FULL_PATH="$(pwd)/$TAR_FILE"
echo "已将目录 $CURRENT_TIME 打包为文件: $FULL_PATH"
# 打包完成后返回到根目录
echo "打包文件父目录: $BASE_DIR"
【2】项目运行脚本案例
(1)service.sh
powershell
#!/usr/bin/env bash
source /etc/profile
source ~/.bash_profile
projectName=$2
skywalking_service_ip=$3
current=`date "+%Y%m%d%H%M%S"`
skywalking_agent_dir="./skywalking/agent-msp/agent8.4"
# 脚本运行目录的父目录
serviceDir=$(cd $(dirname $0)/..; pwd)
logs="$serviceDir/logs"
# 进入脚本目录
cd $(dirname $0)
port=`cat ../conf/bootstrap.yml | grep "port" | cut -c 9-`
if [[ ${#port[@]} == 0 ]]; then
echo "未找到端口"
exit 1
elif [[ ${#port[@]} > 1 ]]; then
echo "找到多个端口 $port"
exit 1
fi
health_url="http://127.0.0.1:$port/actuator/health"
up_url="http://127.0.0.1:$port/actuator/serviceregistry?status=UP"
down_url="http://127.0.0.1:$port/actuator/serviceregistry?status=DOWN"
# 生成启动文件
if [ -n "$skywalking_service_ip" ]; then
echo "sh ./service.sh start $projectName $skywalking_service_ip" > start.sh
echo "sh ./service.sh stop $projectName $skywalking_service_ip" > stop.sh
echo "sh ./service.sh restart $projectName $skywalking_service_ip" > restart.sh
else
echo "sh ./service.sh start $projectName" > start.sh
echo "sh ./service.sh stop $projectName" > stop.sh
echo "sh ./service.sh restart $projectName" > restart.sh
fi
chmod +x start.sh
chmod +x stop.sh
chmod +x restart.sh
#if [ -n "$skywalking_service_ip" ]; then
# if [[ $target =~ "dev" ]]; then
# skywalking_service_ip="10.99.137.136:11800"
# else
# skywalking_service_ip="12.99.76.69:11800"
# fi
#fi
start() {
pid=`ps -ef | grep 'java' | grep $projectName | grep $port | awk '{print $2}'`
if [ -n "$pid" ]; then
echo "服务已存在,请停止后再启动"
exit 1
fi
portLock=`netstat -untlp | awk '{print $4}' | grep ":$port$"`
if [ -n "$portLock" ]; then
echo "端口$port被占用,请停止占用端口的进程或者更换端口"
exit 1
fi
mkdir -p "$logs/gc"
JAVA_PATH="../../../jdk/jre/bin/java"
if [ -f javaPath.txt ]; then
JAVA_PATH=`cat javaPath.txt`
fi
JAVA_OPTS=""
if [ -f jvmOpts.txt ]; then
jvmOpts=`cat jvmOpts.txt`
JAVA_OPTS="$JAVA_OPTS $jvmOpts"
else
JAVA_OPTS="$JAVA_OPTS -Xms256m -Xmx256m -XX:MetaspaceSize=256m -XX:MaxMetaspaceSize=256m -XX:SurvivorRatio=8"
fi
javaVersion=`echo $( $JAVA_PATH -version 2>&1 |awk 'NR==1{gsub(/"/,"");print $3}')`
if [[ $javaVersion == 11* ]]; then
JAVA_OPTS="$JAVA_OPTS -Xlog:gc*:file=$logs/gc/gc-$current.log:time,uptime,level,tags"
else
JAVA_OPTS="$JAVA_OPTS -XX:+PrintGCDetails -XX:+PrintGCDateStamps -Xloggc:$logs/gc/gc-$current.log"
fi
JAVA_OPTS="$JAVA_OPTS -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=dump"
# JAVA_OPTS="$JAVA_OPTS -Dspring.profiles.active=$target -Dserver.port=$port"
JAVA_OPTS="$JAVA_OPTS -Dserver.port=$port"
JAVA_AGENT_OPTS=""
# -javaagent:/home/cloud/iast_agent.jar
# 如果为sit环境且存在iast的jar包,则在启动参数中加入调用iast_agent.jar的命令
# case $target in
# sit* | uat*)
# if [ -x "/home/cloud/iast_agent.jar" ]; then
# JAVA_AGENT_OPTS="$JAVA_AGENT_OPTS -javaagent:/home/cloud/iast_agent.jar"
# fi
# ;;
# *)
# ;;
# esac
if [ -n "$skywalking_service_ip" ]; then
JAVA_AGENT_OPTS="$JAVA_AGENT_OPTS -javaagent:$skywalking_agent_dir/skywalking-agent.jar"
JAVA_OPTS="$JAVA_OPTS -Dskywalking.agent.service_name=$projectName -Dskywalking.collector.backend_service=$skywalking_service_ip"
fi
nohup $JAVA_PATH $JAVA_AGENT_OPTS $JAVA_OPTS -cp ../conf/:../../../driver/*:../../../ext/*:../lib/* com.hzyatop.xingye.Application --spring.config.additional-location=../../../conf/bootstrap.yml > /dev/null 2>&1 &
sleep 5
for ((i=0;i<90;i++))
do
curl -s -X GET ${health_url} > health
health=`cat health | grep status | grep UP`
if [ ${#health} -gt 10 ]; then
break
else
pidNew=`ps -ef | grep 'java' | grep $projectName | grep $port | awk '{print $2}'`
if [ -n "$pidNew" ]; then
echo "Waiting for start ..."
sleep 3
else
echo "Deploy Fail,项目启动失败,请到项目日志目录查看启动日志,默认日志目录为$serviceDir/logs"
exit 1
fi
fi
done
sleep 5
curl -s -X POST -H "Content-Type:application/vnd.spring-boot.actuator.v2+json;charset=UTF-8" $up_url
sleep 5
if [ ${#health} -gt 10 ]; then
echo "Deploy Success"
exit 0
else
echo "Deploy Fail"
exit 1
fi
}
stop() {
pid=`ps -ef | grep 'java' | grep $projectName | grep $port | awk '{print $2}'`
if [ -n "$pid" ]; then
echo "正在下线服务..."
else
echo "服务已下线"
return 0
fi
# curl -s -X POST -H "Content-Type:application/vnd.spring-boot.actuator.v2+json;charset=UTF-8" $down_url
# if [ -n "$skywalking_service_ip" ]; then
# sleep 60
# else
# sleep 30
# fi
echo "尝试 kill -15 $pid 旧服务"
kill -15 $pid
sleep 5
for ((i=0;i<20;i++))
do
pid=`ps -ef | grep 'java' | grep $projectName | grep $port | awk '{print $2}'`
if [ -n "$pid" ];
then sleep 1
else
echo "服务下线成功"
return 0
fi
done
pid=`ps -ef | grep 'java' | grep $projectName | grep $port | awk '{print $2}'`
if [ -n "$pid" ]; then
echo "尝试 kill -9 $pid 旧服务"
kill -9 $pid
sleep 5
fi
pidA=`ps -ef | grep 'java' | grep $projectName | grep $port | awk '{print $2}'`
if [ -n "$pidA" ]; then
echo "停止旧服务失败,请手工停止"
exit 1
fi
}
help(){
echo "---------------sh service.sh [options] [project] [env] [port] [skywalking_service_ip]----------------"
echo "---------------options: start | stop | restart ------------------------------------------------------"
echo "---------------project: 工程名称,jar包前缀 ---------------------------------------------------------"
echo "---------------env:环境 dev | sit | uat | prod-----------------------------------------------------"
echo "---------------skywalking_service_ip:IP地址 --------------------------------------------------------"
}
# 操作命令
case "$1" in
"start")
start
;;
"stop")
stop
;;
"restart")
stop
start
;;
*)
help
;;
esac
(2)stop.sh
powershell
sh ./service.sh stop damp-xingye-ind
(3)start.sh
powershell
sh ./service.sh start damp-xingye-ind
(4)restart.sh
powershell
sh ./service.sh restart damp-xingye-ind