【汇总】Linux常用命令、使用技巧
以CentOS7、Rocky Linux 8为例
持续更新,收藏到浏览器不迷路哦
一、序章
1.1 一些概念
-
字段分隔符
IFS是shell脚本中的一个重要概念,在处理文本数据时,它是相当有用的。IFS可以是White Space(空白键)、Tab( 表格键)、Enter( 回车键)中的一个或几个。
IFS(Internal Field Seperator)在Linux的shell中预设的分隔符,用来把command line分解成word(字段)。
IFS的设置方法很简单,和普通变量设置方法类似:
IFS=":"
建议设置IFS前保存原IFS的值,在使用后及时恢复。
1.2 shell常用快捷键
按键 | 解释 |
---|---|
上下方向键 | 输入栏填充历史命令 |
tab键 | 自动补全命令、文件名 |
ctrl+w | 删除前一个单词【单词首字母(符)到光标处】,在shell中以空格分隔单词,在vi中以符号分隔 |
ctrl+u | 删除一行(行首到光标处) |
获取命令帮助,首选 man cmd
次选 cmd -h
cmd --help
1.3 shell特殊符号
符号 | 作用 |
---|---|
\ | 转义字符,比如在行尾使用\可以转义回车为换行,可以起下一行继续使用命令 命令中使用\可以转义空格,不必使用单双引号声明字符串参数 |
; | 顺序地独立执行各条命令, 彼此之间不关心是否失败, 所有命令都会执行 分隔路径?待考证 |
&& | 上一条命令成功后才执行下一条命令 |
& | 后台运行,不像Windows是同时执行命令 |
| | 管道 |
|| | 上一条命令失败后才执行下一条命令 |
> | [cmd] > [file] 重定向,覆盖,空格严格要求 |
>> | [cmd] >> [file] 重定向,追加,空格严格要求 |
~ | 用户home目录 |
cd - | 返回上一个操作目录,-等同于 $OLDPWD 但是 - 只能在cd中使用,在其它命令中使用会被视为命令选项 |
! | 上一条命令,!^ !$ !* 上一条命令第一个、最后一个、所有参数!:n 上一条命令的第n个参数!s 打印并执行最近一条以s开头的命令使用较少,感觉 !s 用法比较实用若要使用!作为逻辑非,有时需要\转义 |
$ | 脚本中使用较多$$ Shell本身的PID(ProcessID)$! Shell最后运行的后台Process的PID$? 最后运行的命令的结束代码(返回值)$- 使用Set命令设定的Flag一览$* 所有参数列表。如"$*"用「"」括起来的情况、以"$1 $2 … $n"的形式输出所有参数。$@ 所有参数列表。如"$@"用「"」括起来的情况、以"$1" "$2" … "$n" 的形式输出所有参数。$# 添加到Shell的参数个数$0 Shell本身的文件名$1~$n 添加到Shell的各参数值。$1是第1参数、$2是第2参数… |
单引号' 和双引号" |
相同:都是为了解决命令中间有空格的问题 区别:单引号将剥夺其中的所有字符的特殊含义,而双引号中的 $ (参数替换)和` (命令替换)以及! (上一条命令)等具有特殊含义 |
1.4 获取上一条命令的内容
有时我们写命令时会想获取上一条命令的输出,简单的我们可以使用管道,如果下一条命令无法从管道接收数据,我们可以使用xargs配合
但是有时我们想将上一条命令的输出处理后再使用,那么管道不太合适
有两种办法,效果都一样
-
`command`
反引号,执行命令,返回结果 -
$(command)
执行命令,返回结果,和上面不一样的是,此方法支持嵌套 -
$?
特殊变量,但是这个只是返回值,大多为0或1,无法获得命令行输出
二、常用命令
2.1 防火墙
CentOS7、Rocky Linux防火墙是firewall
基本设置:https://www.cnblogs.com/heqiuyong/p/10460150.html
# 查看防火墙规则
firewall-cmd --list-all
# 查看防火墙所有开放的端口
firewall-cmd --zone=public --list-ports
# 查看防火墙状态
firewall-cmd --state
systemctl status firewalld.service
# 开放端口
firewall-cmd --zone=public --add-port=5672/tcp --permanent # 开放5672端口
firewall-cmd --zone=public --remove-port=5672/tcp --permanent #关闭5672端口
# 开放服务
firewall-cmd --zone=public --add-service=mysql --permanent # 开放mysqld
firewall-cmd --reload # 配置立即生效
开放端口(段)给指定IP(段)。如开放给局域网192.168.1.1-192.168.1.255。https://www.cnblogs.com/xiaohanlin/p/11641273.html
firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="192.168.1.0/24" port protocol="tcp" port="8080-8081" accept'
# 192.168.1.0表示网段,/24表示子网掩码二进制中连续1的个数,所以/24即255.255.255.0
# 局域网(也可称为“私网”或“Lan侧”)通常情况都使用私有IP地址:
# A类:10.0.0.0-10.255.255.255
# B类:172.16.0.0-172.31.255.255
# C类:192.168.0.0-192.168.255.255
# 所以表示方式为
# 10.0.0.0/8
# 172.16.0.0/16
# 192.168.0.0/16
# 删除上述规则:
firewall-cmd --permanent --remove-rich-rule='rule family="ipv4" source address="192.168.1.0/24" port protocol="tcp" port="8080" accept'
# 查看rich-rule规则:
firewall-cmd --permanent --list-rich-rule
开放服务,服务是端口和/或协议入口的组合。区域是定义的网络连接的可信等级,此外永久、端口转发参见:https://www.jianshu.com/p/90ed497f49cf
# 获取所有支持的服务
firewall-cmd --get-services
# 查看开放的服务
firewall-cmd --list-services
# 向默认区域添加开放的服务
firewall-cmd --add-service=
# 删除开放的服务
firewall-cmd --remove-service=
端口流量转发。端口可以映射到另一台主机的同一端口,也可以是同一主机或另一主机的不同端口。端口号可以是一个单独的端口
firewall-cmd --permanent [--zone=<zone>] --add-forward-port=port=<port>[-<port>]:proto=<protocol> { :toport=<port>[-<port>] | :toaddr=<address> | :toport=<port>[-<port>]:toaddr=<address> }
# 例80转到8800
firewall-cmd --permanent --zone=public --add-forward-port='port=80:proto=tcp:toport=8800'
firewall-cmd --permanent --zone=public --add-forward-port='proto=80:proto=tcp:toaddr=192.168.1.2:toport=8800'
# 移除规则add改remove
2.2 进程和端口
# 查看监听的端口
netstat -lnpt
# 检查端口被哪个进程占用
netstat -lnpt |grep 5672
# 查看进程的详细信息
ps 6832
# 中止进程
kill -9 6832
# 查找进程,前三列是UID、PID、PPID,最后一列是CMD
ps -ef|grep
# 杀死相关进程
ps -ef|grep ${0}|grep -v grep|cut -c 9-15|xargs kill -9
# ps -e 显示所有进程 ; -f : 全格式 ; grep -v grep 结果中去掉含grep的一行,即搜索命令这个进程 ; cut -c 剪切指定字符,这里是提取进程号
# xargs 结合管道使用,将前面的值作为 kill -9 的参数
2.3 后台运行
当我们在终端运行程序时,程序不停,就会一直占用终端。如果关闭终端则程序也会停止
将程序放到后台运行,可以释放终端,也不用担心程序会终止
# 格式 nohup [cmd] [重定向] &
# 实例
nohup command > myLog.log 2>&1 & # 返回进程PID
# > myout.file将日志输出到文件
# 2>&1,将标准错误输出重定向到标准输出,少了这条命令,错误信息不会被输出到日志中,而是打印到屏幕上
# 1前有&表示重定向的目标不是一个文件,而是一个文件描述符 https://zhuanlan.zhihu.com/p/47765176
# 关闭后台进程只能找出PID然后kill -9
实际由nohup和&构成
&:后台运行,但当用户退出(挂起)的时候,命令自动也跟着退出
nohup
: 即no hang up,不挂断的运行
nohup命令可以将日志输入到文件中,如果不指定输出文件,默认输出到当前目录下的nohup.out文件,如果当前目录的 nohup.out 文件不可写,输出重定向到 $HOME/nohup.out 文件中。
其它后台运行的方法:
我们知道 ctrl+c
能结束当前进程。将当前进程 暂停 并放到后台是命令 CTRL+Z
,可暂停多个进程,终端退出进程退出
jobs
# 查看后台进程
# 也可以查看nohub运行的后台进程,注意:jobs只在当前shell有效,一旦关闭终端,再重开jobs无法查找出之前nohub运行的后台进程
fg
#将后台任务切换到前台执行。如果后台中有多个命令,可以用bg %jobnumber将选中的命令调出
bg
#将一个在后台暂停的命令,变成在后台继续执行。如果后台中有多个命令,可以用bg %jobnumber将选中的命令调出
screen也可以实现后台运行,需要下载
2.4 文件查看
命令 | 解释 | 常用选项 |
---|---|---|
cat | 输出文件内容 | -n 显示行号 |
head | 输出文件前几行 | -[numb] 输出多少行 |
tail | 输出文件后几行 | -[numb] 输出多少行 |
wc | 统计文件字数 | -l 行数;-w 字数;-c 字节数 |
grep | 查找文件内容,输出匹配的行 | |
more | 浏览内容 | |
less | 浏览内容 |
我们可以用管道组合几个命令来实现更多功能,比如查看文件第10和11行 cat a.txt|head -11|tail -2
,这存在一个小问题,就是大家搜文件习惯用cat开头,其实没必要,tail、grep都能接文件路径,没必要以cat开头
查看文件中间几行的最优解:sed -n '[numb],[numb]p' [文件名]
,记得第二数字后接字母p
详说grep这个强大的命令
grep选项 | 解释 |
---|---|
-n | 显示行号 |
-i | 忽略大小写地匹配 |
-v [string] | 反选,也可以理解为去掉某行 |
-G | 启用基本正则表达 |
-E | 启用扩展正则表达,grep -E也可以缩写为egrep |
-B [numb] | 额外显示每个匹配行之前[numb]行,before |
-A [numb] | 额外显示每个匹配行之后[numb]行,after |
-C [numb] | 额外显示每个匹配行之前之后[numb]行 |
more和less
单论浏览内容的话,cat是最拉跨的,全部输出
more能翻页浏览,空格往下,b键往上,= 显示当前行号
less功能最为强大,能用pageup、down键上下翻页,支持vi的 / ?搜索,支持 G 跳行,= 显示行号
2.5 文件编辑 vi/vim sed
1) vi/vim
我们知道vi编辑文件时有三种工作模式
汇总一些好用的命令,命令模式和底行命令模式
按键 | 解释 |
---|---|
u | 撤销 |
. | 恢复 |
yy | 复制行 |
dd | 删除行 |
p | 粘贴 |
ctrl+r | 重复上一个动作 |
~ | 更改大小写 |
:set nu | 显示所有行号 |
:set nonu | 取消显示所有行号 |
nG | 移动到行号是n的一行 |
G | 移动到当前文件的最后一行 |
/[string] | 向后搜索 |
?[string] | 向前搜索 |
n | 重复之前的搜索 |
N | 反向重复之前的搜索 |
:set | 显示和取消显示换行等特殊字符 |
:set fileformat= | 将文件格式转成unix或dos格式 |
最后说说vi的特殊字符怎么输入
-
Q:为什么需要输入特殊字符?
A:可能是脚本中需要用到
-
Q:vi中有哪些特殊字符?
A:输入
:help digraph-table
可以查看,如果是centos7,乱码,可以发现打开的是.gz格式的帮助文档,我们直接find搜索出这个gz文件,再gunzip解压即可查看
char digraph hex dec official name ~
^@ NU 0x00 0 NULL (NUL)
^A SH 0x01 1 START OF HEADING (SOH)
^B SX 0x02 2 START OF TEXT (STX)
^C EX 0x03 3 END OF TEXT (ETX)
第一列为特殊字符,第二列为双拼,第三列为十六进制表示, 第四列为十进制表示,第五列为该字符的官方名称。
一些不能显示的功能按键会以^加字符显示在vi中,并有高亮颜色,直接输是没法生效的
-
Q:如何输入特殊字符?
A:一是在 i 输入模式下,ctrl+v就会出现高亮的^,按住不放再输字符即可。
二是在 i 输入模式下,ctrl+v就会出现高亮的^,松开后,再输入十进制数即可,注意十进制数如果不满3位,需要在前面补零
三是 ctrl+k 再加双拼,但是博主 centos7 没成功过
上述字符和十进制数都需要查表
2) sed命令
sed命令可以操作文本,默认情况下,sed会读取文本并根据动作进行操作,结果会输出在控制台,不会修改文件,使用 -i
选项可以修改文件
-n
默认情况下,sed 会在所有的脚本指定执行完毕后,会自动输出处理后的内容,而该选项会屏蔽启动输出,需使用 print 命令(p动作)来完成输出
sed的动作如下
动作 | 说明 | 使用 |
---|---|---|
a | 新增,在指定行的下一行,一般不用引号 | sed -i 4a\new\ line file.txt 4代表第四行,a代表新增 第一个反斜杠区分动作和动作参数,其实也可以用 4a\ new\ line "4a new line" 甚至 "4anew line" ,这都是作为一个参数给sed,最好分隔动作和字符串便于阅读 |
i | 插入,在指定行的上一行 | 同上 |
s | 替换 | s/pattern/replacement/flags 除了/也可以用 # % 等符号作分隔每一行都会进行一次匹配和替换,默认启用正则,因为有正则符号,所以一般用引号 常用flags:g,表示所有匹配的都进行替换,默认只替换每行的第一个匹配 n,数字,表示从第几个匹配才开始替换,也可和g一起使用,如2g |
用数字模式指定区间 | 指定动作在哪行执行 | 2代表第二行;2,4代表第二到第四行,包括第四行;2,$表示第二行到最后一行;3~2表示从第三行开始,每后两行,即每隔一行,即3和后面的奇数行;1~1表示从第一行开始,每后一行,即整个文件 |
用文本模式指定区间 | 指定动作在哪行执行 | sed '/123/ihello' 1.txt 在包含123的行之前插入hello,如果有多行包含123,则包含123的每一行之前都会插入hello |
! | 反选 行 | 可能需要\转义! |
p | 会打印与替换命令中指定的模式匹配的行,此标记通常与 -n 选项一起使用 | sed -n 5,$p file.txt 打印第五行到最后一行 |
2.6 新建用户和授权
groupadd xxs
useradd xx -d /home/xx -g xxs -s /bin/bash
passwd xx
添加sudo权限
vi /etc/sudoers
# 添加,前者sudo需要密码,后者不需要
your_user_name ALL=(ALL) ALL
your_user_name ALL=(ALL) NOPASSWD: ALL
# 强制保存退出 w!q
2.7 磁盘、组卷挂载与扩容
查看磁盘空间
# 查看使用情况
df -h
# 查看磁盘属性、分区等
fdisk -l
# 查看挂载情况
lsblk
磁盘基本概念:
挂载磁盘,千万不要直接挂载到某个目录,血泪教训,后期扩容面临数据丢失风险
直接挂载的步骤是 分区、格式化、挂载。
而博主更推荐组卷后挂载,即使是一块盘
因为一个目录是一个挂载点,只能挂载一个设备,若后期想用另一块盘扩容,只能卸载重新组卷,数据需要备份和恢复,不如一开始就组卷,后期轻松扩容
PV(Physical Volume)- 物理卷
物理卷在逻辑卷管理中处于最底层,它可以是实际物理硬盘上的分区,也可以是整个物理硬盘,也可以是raid设备。
VG(Volumne Group)- 卷组
卷组建立在物理卷之上,一个卷组中至少要包括一个物理卷,在卷组建立之后可动态添加物理卷到卷组中。一个逻辑卷管理系统工程中可以只有一个卷组,也可以拥有多个卷组。
LV(Logical Volume)- 逻辑卷
逻辑卷建立在卷组之上,卷组中的未分配空间可以用于建立新的逻辑卷,逻辑卷建立后可以动态地扩展和缩小空间。系统中的多个逻辑卷可以属于同一个卷组,也可以属于不同的多个卷组。
进入挂载操作
fdisk用于2T以下的磁盘分区
# fdisk -l找到新盘后
fdisk /dev/sdb
n p
t 8e
# 进入fdisk命令行
# p是打印
# n进行分区,n p 其余都默认回车即可创建一个分区
# t是切换分区格式,8e是我们后面用得到的lvm
# w是写入并退出,q是直接退出
创建物理卷
# 先让系统识别新分区
partprobe
# 创建出一个物理卷
pvcreate /dev/sdb1
pvdisplay
如果有多个盘,分区再创建物理卷,如法炮制
创建卷组:
# vgcreate [vg名] [一个或多个pv]
vgcreate lvm_data /dev/sdb1 /dev/sdc1
vgdisplay
创建逻辑卷,最后逻辑卷的名字是 lvm_data-lvmdata_1,即卷组名-逻辑卷名
# lvcreate -L [大小如2T] -n [name] [vg name]
lvcreate -L 14G -n lvmdata_1 lvm_data
fdisk -l
可发现/dev/mapper/lvm_data-lvmdata_1
格式化和挂载:
mkfs -t ext4 /dev/mapper/lvm_data-lvmdata_1
mount /dev/mapper/lvm_data-lvmdata_1 /data
开机自动挂载,vi /etc/fstab
,最后添加
# [设备] [挂载点] [filesystem] [文件系统的参数] [能否被dump备份命令作用] [是否检验扇区]
/dev/mapper/lvm_data-lvmdata_1 /data ext4 defaults 0 0
mount -a
生效
磁盘扩容
先分区,创建pv。 vgdisplay
查看卷组名,再将pv加入vg
# vgextend [卷组名] [pv名]
vgextend lvm_data /dev/vda3
# 将vg空闲空间加入lv
lvextend -l +100%FREE /dev/mapper/lvm_data-lvmdata_1
# 重新识别lv
xfs_growfs /dev/mapper/lvm_data-lvmdata_1
2.8 压缩解压
我们说的压缩,其包括打包(归档)和压缩两个操作。
tar是打包,gz是压缩。单纯的tar,只打包不压缩;而本单纯的gz,只能压缩单个文件。节后文的压缩均指代打包+压缩
1) 压缩
linux下只推荐tar命令,因为只有它能打包所有文件,包括其权限信息等,是完美的
而zip、7z等,面对链接等特殊文件还会报warning
压缩命令
tar -zcvf /home/data.tar.gz /data
z表示在cvf基础上进行gzip压缩,c表示创建归档,v显示细节,f指定名称
tar -zcvf test.tar.gz /root/test
# 解压-C /home,就得到/home/root/test
cd /root & tar -zcvf /home/test.tar.gz test
# 解压-C /home,就得到/home/test
2) 解压
tar.gz解压命令
tar -zxvf /home/data.tar.gz -C /data
-x表示检出,-C指定检出目录
其它解压命令
unzip file.zip -d /home/extractfolder
unrar e file.rar /home/extractfolder
# 解压压缩包中的所有gif
unrar x file.rar *.gif /home/extractfolder
7z x file.7z -o/home/extractfolder
# 只检出压缩包中的test文件夹
7z x file.7z test -o/home/extractfolder
2.9 其它杂项
-
echo字符转义
echo -e "\n"
,-e开启字符转义 -
cp强制覆盖
\cp -rf [src] [dest]
反斜杠是直接使用cp命令,而非~/.bashrc
中的-i别名 -
查看内存信息
top
free -h
-
查看CPU信息
cat /proc/cpuinfo | grep name | cut -f2 -d: | uniq -c
第一个数字是逻辑CPU的个数(所有核心加起来总的有几线程),后面包含CPU型号cat /proc/cpuinfo |grep "cores"|uniq
几核心,两条命令组合起来就能知道是几核心,几线程了 -
查看Linux发行版本
cat /etc/os-release
cat /etc/system-release
三、使用技巧
3.1 自定义快捷指令
即重命名命令,编辑用户家目录下的 .bashrc 文件,添加,例如
alias tr='tree --dirsfirst -Cpu -L 2'
运行 source .bashrc
生效
使用时还可以继续追加选项,如 tr -t,就等于 tree --dirsfirst -Cpu -L 2 -t
四、实用的第三方命令推荐
4.1 tree
树状展示目录结构,支持高亮,展示深度设置等。一层一层地ls太麻烦了
像3.1 自定义快捷指令那样设置后更方便使用
4.2 sz rz
两个命令来自同一个软件lrzsz
rz是上传文件到远程机器,sz是下载文件到本机,用Xshell的话会直接弹窗让你选择文件
单个文件上传下载比sftp方便