【汇总】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=

端口流量转发。端口可以映射到另一台主机的同一端口,也可以是同一主机或另一主机的不同端口。端口号可以是一个单独的端口 或者是端口范围 - 。协议可以为 tcp 或udp 。

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方便



posted @ 2021-08-25 09:43  云牧青  阅读(686)  评论(0编辑  收藏  举报