命令
多命令执行
# 顺序执行
command1;command2;command3
# 条件执行,command1执行成功则继续执行command2
command1 && command2
# 条件执行,command1执行失败则执行command2
command1 || command2
文件基本操作
# 显示当前文件夹路径
pwd
# 查看当前文件夹内容
ls
ls -al
ll
# 改变当前文件夹路径
cd /opt
# 创建文件夹
mkdir newDirectory
# 递归创建文件夹
mkdir -p /opt/inner/newDirectory
# 新建文件
touch a.txt
# 查看文件内容
cat a.txt
# 编辑文件内容
vi a.txt
vim a.txt
nano a.txt
# 复制文件
cp a.txt b.txt
# 复制文件夹及其内容
cp -r folder1 folder2
# 移动文件
mv a.txt b.txt
# 删除文件
rm -f a.jar
# 删除文件夹
rm -rf folder1
文件权限
# 对所有用户增加读写执行权限
chmod +rwx a.sh
chmod 777 a.sh
# 对所有者和所属组设定读写执行权限,对其它用户设定为执行权限
chmod ug=rwx,o=x a.sh
chmod 771 a.sh
# 对所有者增加执行权限
chmod u+x a.sh
# 对所属组去除写权限
chmod g-w a.sh
# 更改文件所有者为user1
chown user1 a.sh
# 更改文件所属组为group1
chown :group1 a.sh
文件查找
# 在根目录下查找名为a.txt的文件或文件夹
find / -name a.txt
# 在当前目录下查找名为java的文件夹
find . -type d -name java
# 在/opt/volume/mysql/bak下查找文件,且文件最近修改时间为7天以前,名称符合*.sql.gz,最后把找出来的文件执行删除命令
find /opt/volume/mysql/bak -type f -mtime +6 -name "*.sql.gz" -exec rm -f {} \
时间相关参数
-mtime
文件上次内容被修改时间-atime
文件上次被访问时间-ctime
文件上次属性被修改时间
内容查找
# 查找内容含有test字符串且文件名符合*.sql的文件
grep test *.sql
# 查找在/opt目录及其子目录下,内容含有test字符串的文件
grep -r test /opt
# 查找内容不含有test字符串且文件名符合*.sql的文件
grep -v test *.sql
# 查找内容含有test字符串,且test必须为一个单词,且文件名符合*.sql的文件
grep -w test *.sql
# 忽略大小写查找内容含有test字符串且文件名符合*.sql的文件
grep -i test *.sql
用户
# 显示当前用户
whoami
# 切换用户,不切换环境变量和目录
su user1
# 切换用户,且切换环境变量和目录
su - user1
# 以root权限运行(在etc/sudoers文件中存在的用户可使用)
sudo touch a.txt
# 以root权限切换用户
sudo su - user1
# 修改当前用户密码
passwd
# 修改用户密码
passwd user1
查看系统信息
# 查看当前所有进程状态
ps -ef
# 增长信息显示长度
ps -efw
ps -efwww
# 查看进程详细信息
ps -aux
# 按进程的内存使用率降序排序(RSS列为进程使用的物理内存大小,单位为KB)
ps -aux --sort -%mem
# 按进程的CPU使用率升序排序
ps -aux --sort +%cpu
# 查看进程实时状态
top -c
# 查看系统内存使用量
free -h
# 查看系统磁盘使用量
df -h
# 查看端口占用情况
yum install lsof
lsof -i
# 查看8080端口占用情况
lsof -i:8080
# 查看IP
ip address
命令输入
# 假清屏
clear
# 查看命令输入历史
history
# 查看最近输入的5条命令
history 5
# 重复执行历史命令,历史命令号通过history命令查询
!843
# 重复执行上一个命令
!!
# 重复执行最近的第一条包含某个字符串的命令
!docker
系统控制
# 关机
shutdown -h now
# 重启
reboot
上传与下载
# 安装
yum install lrzsz
# 下载文件
sz a.txt
# 上传文件
rz
关闭进程
# 强制结束进程(pid可通过ps命令查询)
kill -9 1866
# 正常停止进程
kill -15 1866
程序不间断运行
# 标准输出重定向到当前目录的nohup.out
nohup java -jar test.jar &
# 标准输出重定向到当前目录的temp.txt
nohup java -jar test.jar > temp.txt &
# 标准输出重定向到当前目录的temp.txt,且标准错误输出重定向到标准输出
nohup java -jar test.jar > temp.txt 2>&1 &
nohup java -jar test.jar &> temp.txt &
# 只保留标准错误输出
nohup java -jar test.jar > /dev/null 2>temp.txt &
# 不保留所有输出信息
nohup java -jar test.jar > /dev/null 2>&1 &
nohup java -jar test.jar &> /dev/null &
压缩相关命令
# gzip算法压缩folder1文件夹并生成一个tar
tar -zcvf a.tar.gz folder1
# bz2算法压缩b.txt 文件并生成一个tar
tar -jcvf a.tar.bz2 b.txt
# 只打包不压缩folder2文件夹并生成一个tar
tar -cvf a.tar folder2
# 压缩当前目录下所有文件并生成一个zip
zip a.zip *
# 压缩文件a.log并生成一个a.log.gz,保留原文件
gzip -k a.log
# 相对的解压缩或解包
tar -zxvf a.tar.gz
tar -jxvf a.tar.bz2
tar -xvf a.tar
unzip a.zip
gzip -dv a.log.gz
gunzip -c a.log.gz > a.log
# 指定解压后目录
tar -zxvf a.tar.gz -C /opt/temp
文本处理
# 打印a.log每行的第一个字段, 字段以空格或制表符分割
awk '{print $1}' a.log
# 打印a.log每行的第一个和第四个字段,输出的两个字段之间使用空格分割
awk '{print $1,$4}' a.log
# 指定分割符为冒号
awk -F ':' '{print $1}' a.log
# 输出倒数第一个字段和倒数第二个字段
awk '{print $NF, print $(NF-1)}' a.log
# 输出当前行号,右括号和第一个字段,字符直接拼接
awk '{print NR ")" $1}' a.log
# 输出符合正则表达式的行,即包含test字符串的行
awk '/test/ {print $1}' a.log
# 输出奇数行
awk 'NR % 2 == 1 {print $1}' a.log
# 打印a.log每行的第一个字段, 字段以空格分割
cut -d ' ' -f 1 a.log
# 以行为单位排序
sort test.txt
# 反向排序
sort -r test.txt
# 相邻的重复行去重
uniq test.txt
部分查看内容
# 显示前5行
head -n 5 a.log
# 显示后5行
tail -n 5 a.log
# 实时刷新尾部信息
tail -f a.log
# 从20行开始显示到文件末尾
tail -n +20 a.log
# 分页查看(space 下一页, b 上一页, q 退出)
# (/str 向下搜索str ?str 向上搜索str n重复上次搜索 N反向上次搜索)
less a.log
管道命令
前一个命令的标准输出作为后一个命令的标准输入,若后一个命令不接收标准输入,则可用xargs
命令将标准输入转为命令行参数
# 从docker ps命令输出的内容选取含有language-trainer的行,然后选取第一行,输出第一个字段
docker ps -a | grep -w language-trainer | head -1 | awk '{print $1}'
# 从ps -ef命令输出的内容选取含有java的行,再选取不含grep的行
ps -ef | grep java | grep -v grep
# 从docker ps命令输出的内容从第二行开始选取,输出第一个字段,然后排序
docker ps | tail -n +2 | awk '{print $1}'| sort
# 从cat命令输出的内容排序,然后去重
cat test | sort | uniq
# 分页查看ls命令输出的内容
ls | less
# 标准输入转为命令行参数,等价于mkdir folder1
echo "folder1" | xargs mkdir
休眠
# 输出时间,休眠1分钟,再输出时间
date;sleep 1m;date
创建链接
硬链接,原文件的一个别名,原文件删除后仍然可用。软链接,原文件的符号链接,类似Windows系统的快捷方式,原文件删除后不可用
# 创建硬链接,为log2022.log创建硬链接ln2022
ln log2022.log ln2022
# 创建软链接,为log2022.log创建软链接ln2022
ln -s log2022.log ln2022
查看帮助信息
# 查看ls命令的帮助信息
man ls
系统时间
# 显示系统时间
date
# 修改系统时间
date -s "2012-05-23 01:01:01"
文件内容比较
diff a.log b.log
# 并排格式显示比较结果
diff a.log b.log -y
输出字符串
echo "abc"
显示文件大小
# 显示当前文件夹以及所有子文件夹的大小
du -h
# 显示文件大小
du -h a.log
# 统计文件行数、字数、字节数
wc a.log
后台任务
# 后台执行命令
command &
# 前台转后台并暂停
ctrl + z
# 查看当前的后台任务
jobs -l
# 后台中的任务调到前台继续执行(任务号通过jobs命令查看)
fg 1
# 后台中的暂停任务转为继续执行
bg 1
vi编辑器
编辑文件
vi a.txt
命令模式切换到输入模式,按i键
输入模式切换到命令模式,按esc键
命令模式切换到底线命令模式,输入:
开头的命令
# 保存并退出
:wq
# 不保存并退出
:q!
shell脚本
脚本头
#!/bin/bash
定义一般变量
database=language_trainer
执行命令并定义变量
containerId=$(sudo docker ps | grep -w language-trainer | head -1 | awk '{print $1}')
命令中使用变量
使用$var
或${var}
sudo echo "-----Database:${database} backup begins.-----"
sudo docker exec ${mysqlContainer} mysqldump --databases ${database} | gzip > ${bakPath}/${bakFileName}.sql.gz
变量非空判断
if [ ${containerId} ]; then
sudo echo "The container of Language Trainer exists, and it is running now."
else
sudo echo "The container of Language Trainer doesn't exists."
fi
环境变量
永久改变
对所有用户有效,修改/etc/profile
,对单一用户有效,修改/home/user1/.bash.profile
export CLASSPATH=.;$JAVA_HOME\lib\dt.jar;$JAVA_HOME\lib\tools.jar;
修改完后执行命令
source /etc/profile
source /home/user1/.bash.profile
临时改变
以命令的方式运行
export CLASSPATH=.;$JAVA_HOME\lib\dt.jar;$JAVA_HOME\lib\tools.jar;
查看变量
echo $CLASSPATH
echo $PATH
PATH环境变量
PATH环境变量中,不同的路径需要用冒号隔开,例如
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
往PATH环境变量中添加新路径
export PATH=$PATH:/opt/bin:/opt/bin2
PREVIOUSJava7 文件操作
NEXTLinux指定静态IP