bingmous

欢迎交流,不吝赐教~

导航

Linux命令总结

使用技巧

  • man + 命令可以查看命令帮助,或者命令 + --help
  • Ctrl + L:清屏,Ctrl + Alt + left/rightmobaxterm切换窗口
  • linux命令使用查询网站:https://man.linuxde.net/

为命令指定别名

# 编辑 ~/.bashrc文件,添加别名
alias cp='cp -i'
# 添加后 source ~/.bashrc 即可生效

常用命令

  • 文件目录
cd    # 回到home目录,cd -返回上次的目录
ls    # 列出当前路径下的文件、目录,或者ls dir
ll    # 列出当前路径下的文件、目录(详细)
touch     # 新建文件
cat    # 查看文件内容,使用cat xxx | less可以分页查看内容
mkdir     # 新建目录,-p递归创建目录
rm -rf   # 递归删除文件、目录
pwd     # 获取当前路径
cp      # 拷贝
mv      # 移动、重命名
tail    # 显示文件末尾10行,tail -f,跟踪文件输出
>>   # 追加到某个文件
>    # 覆盖某个文件或新建为一个文件
chown   # 更改用户和用户所属的组,如chown root:root file,-R递归修改
chmod   # 更改文件或目录权限 如chmod +x file,chmod 777 file,-R递归修改
history # 显示历史命令
unrar x xxx.rar /path/to/unrar

kill -s 9     # 与 kill -9 一样,s表示signal
ls -lh        # 列出文件,并显示出大小
du -sh *      # 查看当前目录每个文件的大小
du -sh dir    # 查看目录总大小,查看当前目录每个文件大小
du -h --max-depth=0 *    # 查看当前目录所有文件或目录大小
du -h --max-depth=1 *    # 查看当前目录及下一级目录所有文件或目录大小

## 文件搜索
find / -name file1 # 从/开始进入根文件系统搜索文件和目录
find / -user user1 # 搜索属于用户user1的文件和目录
find /home/user1 -name \*.bin # 在目录/home/user1中搜索带有'.bin' 结尾的文件
find /usr/bin -type f -atime +100 # 搜索在过去100天内未被使用过的执行文件
find /usr/bin -type f -mtime -10 # 搜索在10天内被创建或者修改过的文件
find / -name \*.rpm -exec chmod 755 '{}' \; # 搜索以 '.rpm' 结尾的文件并修改其权限为755
find / -xdev -name \*.rpm # 搜索以 '.rpm' 结尾的文件,忽略光驱、捷盘等可移动设备
find -type l # 查找当前目录下所有的软连接
find -type l -delete # 删除当前目录下所有的软连接 【没写path默认是当前目录】
locate \*.ps # 寻找以 '.ps' 结尾的文件 - 先运行 'updatedb' 命令 
whereis halt # 显示一个二进制文件、源码或man的位置 
which halt # 显示一个二进制文件或可执行文件的完整路径 
  • curl
curl -sSL https://zipkin.io/quickstart.sh | bash -s
    # -s 安静模式。不要显示进度表或错误消息;
    # -S 安静模式下显示错误信息;
    # -L (HTTP/HTTPS)追随http响应头“Location:”定向到跳转后的页面;(在http响应码为3XX时使用,如301跳转、302跳转)
  • 日期时间,crontab
date                             # 查看时间
date -s "2021-01-01 10:00:00"    # 手动设置时间
date -d 20200101 "+%Y%m%d"       # 将指定日期以指定格式显示
date -d a "+%Y%m%d %H:%M%S"        # 每个字母都有指定的时间,j除外,后面可以跟0-23,表示多少小时后
date -d '1 month ago'            # 一个月前的时间,其他依次类推
date -d '1 month'                # 一个月后的时间,其他依次类推
date -d @1568880277 "+%Y-%m-%d"  # @表示时间戳,自1970-01-01之后的秒数

## 时钟校准
# 查看系统时间
date
# 查看硬件时间
hwclock
# 手动设置时间
date -s "20210507 17:55:00"
# 同步硬件时间
hwclock -w

## crontab
crontab -e    # 编辑定时表达式 默认当前用户 表达式文件在/var/spoon/cron/ 日志在/var/log/cron
              # 5颗星 表示分钟 小时 天 月 周
              # 表达式命令中遇到%结束 要用\% 比如`date -d '1 day ago' +\%Y-\%m-\%d` 或+%F格式化
  • 文本分析
## tr
list=(`echo abc | tr 'b' ' '`)    # tr替换b为空格,根据空格分隔元素为数组
echo ${list[-1]}                  # 取数组的最后一个元素

## AWK 是一种处理文本文件的语言,是一个强大的文本分析工具
awk '{print $1,$2}' xxx.txt          # 打印第1列和第2列,空格分隔
awk -F, '{print $1,$2}' xxx.txt      # 指定分隔符,逗号分隔 awk -F ':' '{print $1}'
awk 'NR==2{print $2}' xxx.txt        # 打印第2列的第二行

## sed遵循简单的工作流:读取,执行和显示:读取某一行
sed -i 's/原字符串/新字符串/g' /home/1.txt # 把文件中的某字符串替换为新字符串
  • wc
## 利用wc指令我们可以计算文件的字节数、行数、单词数
用法:
wc [-clw][--help][--version][文件...]

wc -c filename # 计算字节数,或--bytes 
wc -m filename # 计算字符数,--chars
wc -l filename # 计算行数, --lines
wc -w filename # 计算字数, --words
  • 正则表达式
^\s* # 表示以空格、车符等字符开头
\s*$ # 表示以空格、车符等字符结尾

^ # 表示为开头
$ # 表示为结尾
\s # 表示空格、回车等空白字符
  • 过滤grep
## 指令用于查找内容包含指定的范本样式的文件,如果发现某文件的内容符合所指定的范本样式,预设 grep 指令会把含有范本样式的那一行显示出来
grep 查找字符串 查找文件
grep -E 'parttern1|pattern2' filename # 扩展为正则表达式,|为或操作
grep -v 'pattern1' filename # 实现反选操作,标识不满足patern1的所有行
grep -c 'keyword' filename # 统计keyword的行数
grep -A -B -C 后面接数字 # 显示匹配行和它前面的行/后面的行/前后行
# 若查找文件名为-,即grep xxx -,则从标准输入(键盘)读取数据,一直读
# 一般使用管道符之后使用grep过滤
  • 压缩解压
- tar

tar [-cxtzjvfpPN] 文件与目录 ....

一般使用:
 - 解压:tar -xvzf .tar.gz # x表示解压缩,v表示显示过程,z表示gz格式,f表示使用文件名
 - 压缩:tar -cvzf xxx # c表示创建压缩文件

参数:
-c   # 建立一个压缩文件的参数指令(create 的意思);
-x   # 解开一个压缩文件的参数指令!
-t   # 查看 tarfile 里面的文件!
##   # 别注意,在参数的下达中, c/x/t 仅能存在一个!不可同时存在!因为不可能同时压缩与解压缩。
-z   # 是否同时具有 gzip 的属性?亦即是否需要用 gzip 压缩?
-j   # 是否同时具有 bzip2 的属性?亦即是否需要用 bzip2 压缩?
-v   # 压缩的过程中显示文件!这个常用,但不建议用在背景执行过程!
-f   # 使用档名,请留意,在 f 之后要立即接档名喔!不要再加参数!
-J   #  .xz格式


解压: tar -zxvf **.tar.gz
可加-C 命令指定解压目录

1. 压缩
tar -zcvf pack.tar.gz pack/  #打包压缩为一个.gz格式的压缩包
tar -jcvf pack.tar.bz2 pack/ #打包压缩为一个.bz2格式的压缩包
tar -Jcvf pack.tar.xz pack/  #打包压缩为一个.xz格式的压缩包
2. 解压
tar -zxvf pack.tar.gz /pack  #解包解压.gz格式的压缩包到pack文件夹
tar -jxvf pack.tar.bz2 /pack #解包解压.bz2格式的压缩包到pack文件夹
tar -Jxvf pack.tar.xz /pack  #解包解压.xz格式的压缩包到pack文件夹
  • 磁盘相关
parted -lm | grep /dev   # parted -lm 也可以查看磁盘分区类型
lsblk                    # 查看设备
lsblk -f                 # 查看磁盘
fdisk -l /dev/sda        # 查看系统分区
blkid                    # 查看磁盘uuid、分区类型
df -h                    # 查看系统硬盘使用情况

## 将硬盘挂载到/mnt/disk1下
# 检查磁盘状态,确认分区
fdisk -l

# 格式化磁盘(分区)
mkfs.ext4 /dev/sda #根据机器上的命名 以sda为例

# 添加到开机启动挂载
echo "/dev/sda /mnt/disk1 ext4 defaults 0 0" >> /etc/fstab

# 重新挂载所有分区
mount -a

# 检查是否挂载成功
df -h
  • 系统相关
cat /etc/redhad-release # 查看centos系统版本
cat /proc/version		# 查看系统版本详细信息
cat /proc/cpuinfo		# 查看cpu信息
uname -a                # 查看内核版本
shutdown now            # 立刻关机
reboot                  # 重启
passwd         # 修改用户密码
  • 环境变量
## 设置或显示环境变量
export -p # 显示环境变量
export A=xxx # 定义环境变量
  • rpm
## 常用命令
rpm --help # 查看帮助文档
rpm -ivh package.rpm # 安装一个rpm包,rpm -ivh --nodeps 忽略依赖
rpm -e package_name.rpm # 删除一个rpm包
rpm -qa # 显示所有安装的rpm包,rpm -qa | grep xxx 查看是否某个xxx是否已经安装
rpm -ql xxx.rpm # 查看安装该rpm所有的文件列表 xxx.rpm的全名称可以用 rpm -qa | grep xxx查看


rpm -U package.rpm # 更新一个rpm包但不改变其配置文件
rpm -F package.rpm # 更新一个确定已经安装的rpm包
rpm -qi package_name # 获取一个已安装包的特殊信息
rpm -qg "System Environment/Daemons" # 显示一个组件的rpm包
rpm -ql package_name # 显示一个已经安装的rpm包提供的文件列表
rpm -qc package_name # 显示一个已经安装的rpm包提供的配置文件列表
rpm -q package_name --whatrequires # 显示与一个rpm包存在依赖关系的列表
rpm -q package_name --whatprovides # 显示一个rpm包所占的体积
rpm -q package_name --scripts # 显示在安装/删除期间所执行的脚本l
rpm -q package_name --changelog # 显示一个rpm包的修改历史
rpm -qf /etc/httpd/conf/httpd.conf # 确认所给的文件由哪个rpm包所提供
rpm -qp package.rpm -l # 显示由一个尚未安装的rpm包提供的文件列表
rpm --import /media/cdrom/RPM-GPG-KEY # 导入公钥数字证书
rpm --checksig package.rpm # 确认一个rpm包的完整性
rpm -qa gpg-pubkey # 确认已安装的所有rpm包的完整性
rpm -V package_name # 检查文件尺寸、 许可、类型、所有者、群组、MD5检查以及最后修改时间
rpm -Va # 检查系统中所有已安装的rpm包- 小心使用
rpm -Vp package.rpm # 确认一个rpm包还未安装
rpm2cpio package.rpm | cpio --extract --make-directories *bin* # 从一个rpm包运行可执行文件
rpm -ivh /usr/src/redhat/RPMS/`arch`/package.rpm # 从一个rpm源码安装一个构建好的包
rpmbuild --rebuild package_name.src.rpm # 从一个rpm源码构建一个 rpm 包

Shell脚本

脚本执行

# 指定命令解释器
#!/bin/bash         # 直接去找bash,/bin是指向/usr/bin的软链接
#!/usr/bin/env bash # 在环境变量env中找,也就是PATH,更具有可移植性

# 输出设置
set -ex    # shell脚本中,开头使用set -ex
    # -e 表示遇到错误后直接退出
    # -x 表示将执行的命令和输出结果都输出(默认只输出结果)

# 执行脚本, <直接调用>和<使用.调用>脚本的区别
./xxx.sh        # 直接调用
xxx.sh          # 直接调用
. ./xxx/sh      # . 调用
. xxx.sh        # . 调用
# 区别:
# 1> ./执行,可以理解为运行在一个全新的shell中,不继承当前shell环境变量的值,同时,若程序中改变了shell环境变量中的值(不使用export),则不改变当前shell环境变量的值。
# 2> . ./执行,可以理解为在当前shell中执行,继承当前shell环境变量的值,若程序改变了shell环境变量的值(不使用export),则改变当前shell环境变量的值
# 3> ./执行必须有执行权限,.则不要求,可以暂时提升

BASH_SOURCE[0]    # 或者BASH_SOURCE 获取到当前脚本所在的路径
dirname $0        # 获取当前脚本执行的目录,可能是., 可能是绝对目录
wait # 等待当前bash上所有子进程执行结束

变量

  • 声明变量
# 等号赋值两边不能有空格
# 声明变量, 没有空格
a="hello" 
abc="hello"

# 使用变量
echo $a
echo ${abc}

# declare声明变量
declare +[iafx] var # 取消对应的属性,不可取消只读属性
declare -r var # 只读
declare -i var # 整数,赋值非整数会失败,值为0,被声明的整数变量会完成算数计算
declare -a var # 数组
declare -f f # 显示函数,不加f显示此命令之前定义的所有函数,-F仅打印函数名字
declare -x var # 声明一个变量作为脚本的环境变量,export使用的就是declare -x
declare -p var # 查看变量被声明的类型

注意:
    在函数中使用declare声明的变量是局部的

# local声明变量,多用在函数内部
1 - shell中定义的变量是global的,作用域从定义处到shell结束或显式删除的地方
2 - 函数定义的变量也是global的,作用域从调用开始,函数的参数是local的,函数定义的变量也可以是local的
3 - 局部变量与全局变量名字相同,在函数中使用局部变量
  • 位置变量
$1、$2…$n分别代表参数1、参数2…参数n
$0则代表脚本的名字
$*:这个变量包括参数的列表(字符串)。
$@:这个变量包括参数的列表(数组)。
$#:这个变量包括参数的个数。
$$:shell 脚本的进程号
$?:紧邻的前驱命令的返回值
$!:上一个子进程的进程号,如脚本里执行了sleep 1 &,那么后面的脚本使用$!就可以拿到它的进程号
  • 变量内容替换
a=1231
echo ${a/被替换字符串/替换字符串} # 只替换第一个匹配的
例如:
echo ${a/1/2} # 输出结果为2231

流程控制

-- if else

## if else
if condition1
then
    command1
elif condition2
then
    command2
else
    command3
fi

# 判断返回值时使用, 增加"X"防止语法错误,万一返回为空就会出现语法错误
if [ "X${var}"=="X1"];then
    command
fi

-- 循环,switch

## for循环
for var in item1 item2 ... itemN
do
    command
done

## while循环
while condition
do
    command
done

## 无限循环
while :
do
    command
done
或者
while true
do
    command
done
或者
for (( ; ; ))

## until循环
until condition
do
    command
done

## case ...esac 多选择语句
case  value in
case1)
    command
    ;;
case2)
    command
    ;;
esac

## 跳出循环 break,结束本次循环continue

数组

shell只支持一维数组,没有限制,下标从0开始,可以是一个整数,也可以是一个结果为整数的表达式

# 数组的定义
a=(1 2 3 4) # 使用空格隔开元素,元素可以不是同一种类型,因为shell是弱类型语言
a[4]="helllo" # 数组长度不固定,定义后可以增加元素
nums=([0]=1 [3]=3 [5]=5) # 也可以只给特定元素赋值

# 获取数组元素
$a # 获取第一个元素
${a[n]} # 获取第n个元素
${a[*]} # 获取所有数组元素
${a[@]} # 获取所有数组元素
${#a[*]} # 获取元素个数

引号

双引号、单引号、反引号

# 双引号解析里面的命令
a="hello"
echo "$a" # 输出hello

# 单引号不解析
echo '$a' # 输出$a 或者echo \$a 等价于echo "\$a"

# 反引号括起来的被解释为命令行,执行时先执行,并将标准输出结果替代反引号部分
echo `pwd`
echo "`pwd`"
a=`pwd`
echo $a
echo "$a" # 全部输出绝对路径

输入/输出重定向

ls xxx >/dev/null 2>&1标识把标准错误和标准输出都扔到黑洞里

12都是文件描述符,1标识标准输出,2标识标准错误

2>&1 标识把标准错误重定向到标准输出,&可以理解为取地址,类似C语言中的取地址

/dev/null标识只写文件,可以看作黑洞,所有写入的内容都会消失

实际上等价于 ls xxx 1>/dev/null 2>&1,1省略了,默认标准输出

posted on 2021-04-29 11:57  Bingmous  阅读(46)  评论(0编辑  收藏  举报