一、Linux基础命令
1、bc数字计算器
作用:用于数字计算以及进制转换
# 安装bc工具
[root@192 ~]# yum -y install bc > /dev/null ; echo -e "\a"
# bc用于数字计算
[root@192 ~]# echo "1+1" | bc
2
# bc用于进制转换 obase表示输出的进制,ibase表示输入的进制
[root@192 ~]# echo "obase=2;ibase=10;100" | bc
1100100
2、arch打印硬件信息
# 查看当前系统多少位
[root@192 ~]# arch
x86_64
# getconf LONG_BIT查看当前系统多少位
[root@192 ~]# getconf LONG_BIT
64
# uname -m也可以查看当前系统多少位
[root@192 ~]# uname -m
x86_64
3、tty显示当前终端信息
连接Linux服务器的时候会开启一个终端端口,每个终端都有独自的编号
# pts伪终端,如ssh连接
[zy@192 ~]$ tty
/dev/pts/0
# tty串行终端
[zy@192 ~]$ tty
/dev/tty1
# pts1终端向pts0终端发送消息
[root@192 fd]# tty ; for i in $(seq 3);do echo $i > /dev/pts/0 ; sleep 1 ;done
/dev/pts/1
[root@192 fd]# tty
/dev/pts/0
[root@192 fd]# 1
2
3
4、who显示当前已登录的用户的信息
#显示当前用户名称
[zy@192 ~]$ whoami
zy
#显示当前用户的信息
[zy@192 ~]$ tty ; who am i
/dev/pts/0
zy pts/0 2024-10-10 09:42 (192.168.106.1)
#显示所有用户的的信息
[zy@192 ~]$ who
zy pts/0 2024-10-10 09:42 (192.168.106.1)
zy pts/1 2024-10-10 09:43 (192.168.106.1)
#显示所有用户的信息以及当前的操作
[zy@192 ~]$ w
09:48:32 up 1:12, 2 users, load average: 0.00, 0.00, 0.00
USER TTY LOGIN@ IDLE JCPU PCPU WHAT
zy pts/0 09:42 0.00s 0.03s 0.00s w
zy pts/1 09:43 4:57 0.00s 0.00s -bash
#使用column -t方便显示
[zy@192 ~]$ w | column -t
09:47:49 up 1:11, 2 users, load average: 0.00, 0.00, 0.00
USER TTY LOGIN@ IDLE JCPU PCPU WHAT
zy pts/0 09:42 4.00s 0.03s 0.00s column -t
zy pts/1 09:43 4:14 0.00s 0.00s -bash
5、hostnamectl设置主机名
主机名仅支持数字、横线、字母; 修改hostname需要root权限
#临时修改主机名,hostname中的配置不变
[root@192 ~]# cat /etc/hostname
[root@192 ~]# hostname Rocky9
[root@192 ~]# exit
[zy@Rocky9 ~]$ cat /etc/hostname
#永久修改主机名
[root@Rocky9 ~]# hostnamectl set-hostname Rocky9
[root@Rocky9 ~]# cat /etc/hostname
Rocky9
6、PS1修改命令提示符
#当前的默认命令提示符 \u:用户 \h:服务器名 \W:当前所在的路径
[root@Rocky9 etc]# echo $PS1
[\u@\h \W]\$
#修改命令提示符的颜色 1表示高亮 32表示字体颜色 颜色范围:30~37
[root@Rocky9 etc]# PS1='\e[1;32m[\u@\h \W]\$ \e[0m'
#如果想要永久保存配置需要编写在配置文件中
[root@Rocky9 etc]# echo "PS1='\e[1;32m[\u@\h \W]\$ \e[0m'" >> /root/.bashrc
[root@Rocky9 etc]# tail -n 1 /root/.bashrc ; source /root/.bashrc
PS1='\e[1;32m[\u@\h \W]$ \e[0m'
效果展示:
7、type显示命令类型
内部命令:由shell自带,随着用户登录自动加载到内存中
外部命令:在文件系统路径下有对应的可执行文件,当执行命令时才从磁盘加载到内存中,完毕后再从内存中删除
常用选项:
-a 列出所有命令的类型
#内部命令
[root@192 ~]# type cd
cd is a shell builtin
#外部命令
[root@192 ~]# type mkdir
mkdir is /usr/bin/mkdir
#别名
[root@192 ~]# type ls
ls is aliased to `ls --color=auto'
#hash 经常使用的外部命令会将路径保存到hash表中,当需要使用该命令时直接从缓存中寻找到该文件路径,不必再从$PATH目录下寻址
[root@192 ~]# type vi
vi is hashed (/usr/bin/vi)
#有些命名既是内部命令也是外部命令(为了防止由于sheel版本不一致导致cmd not found 的问题)
[root@192 ~]# type -a echo
echo is a shell builtin
echo is /usr/bin/echo
8、hash记住或显示程序位置
作用:记住或显示程序位置,临时有效退出用户无效
常见选项:
-r 清空hash表
-d 删除hash某条数据
[root@192 ~]# hash
hits command
1 /usr/bin/yum
2 /usr/bin/vi
1 /usr/sbin/ip
3 /usr/bin/clear
#清空hash表
[root@192 ~]# hash -r
[root@192 ~]# hash
hash: hash table empty
#清楚某条hash数据
[root@192 ~]# hash
hits command
1 /usr/bin/ls
[root@192 ~]# hash -d ls
[root@192 ~]# hash
hash: hash table empty
9、alias别名
对于经常执行的较长命令可以将其定义成别名方便执行,想要永久保存需要写入到bashrc或者profile文件中
#定义别名
[root@192 ~]# cd /etc/sysconfig/network-scripts/
[root@192 network-scripts]# cd -
/root
[root@192 ~]# alias cdn="cd /etc/sysconfig/network-scripts/"
[root@192 ~]# cdn
[root@192 network-scripts]#
#查看别名
[root@192 network-scripts]# alias | grep cdn
alias cdn='cd /etc/sysconfig/network-scripts/'
#删除别名
[root@192 network-scripts]# unalias cdn
[root@192 network-scripts]# alias | grep cdn
[root@192 network-scripts]#
#命令执行的优先级
绝对路径/相对路径 》 别名 》 内部命令 》 hash表 》 内部命令
10、lscpu查看cpu信息
#查看cpu的信息
[root@192 ~]# lscpu
Architecture: x86_64
CPU op-mode(s): 32-bit, 64-bit
Byte Order: Little Endian
CPU(s): 4
On-line CPU(s) list: 0-3
Thread(s) per core: 1
Core(s) per socket: 2
Socket(s): 2
#cat /proc/cpuinfo 也可以查看cpu的信息
[root@192 ~]# cat /proc/cpuinfo | head -n 3
processor : 0
vendor_id : AuthenticAMD
cpu family : 25
11、free查看内存信息
[root@192 ~]# free -h
total used free shared buff/cache available
Mem: 3.5Gi 278Mi 2.9Gi 8.0Mi 335Mi 3.1Gi
Swap: 3.9Gi 0B 3.9Gi
swap空间是虚拟内存,用于扩展物理内存;当系统的物理内存被充满的时候,不活跃的数据被移动到swap空间中,当这些数据需要再次被使用的时候再从swap空间中恢复到数据内存中
12、lsblk查看硬盘和分区情况
[root@192 ~]# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sr0 11:0 1 13.2G 0 rom
nvme0n1 259:0 0 100G 0 disk
├─nvme0n1p1 259:1 0 1G 0 part /boot
└─nvme0n1p2 259:2 0 99G 0 part
├─rl_192-root 253:0 0 63.9G 0 lvm /
├─rl_192-swap 253:1 0 3.9G 0 lvm [SWAP]
└─rl_192-home 253:2 0 31.2G 0 lvm /home
#cat /proc/partitions也可以查看硬盘情况
[root@192 ~]# cat /proc/partitions
major minor #blocks name
259 0 104857600 nvme0n1
259 1 1048576 nvme0n1p1
259 2 103808000 nvme0n1p2
11 0 13880704 sr0
253 0 66985984 dm-0
253 1 4116480 dm-1
253 2 32702464 dm-2
13、lsb_release查看系统发行版本
(test)root@ubuntu:~# lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description: Ubuntu 24.04 LTS
Release: 24.04
Codename: noble
#cat /etc/os-release也可以查看发行版本
[root@192 ~]# cat /etc/os-release | head -n 3
NAME="Rocky Linux"
VERSION="8.10 (Green Obsidian)"
ID="rocky"
14、date显示时间
默认显示当前时间
常见选项:
-d, --date=字符串 显示给定<字符串>描述的时间,而非“当前时间”
常见日期:
%Y 年份
%m 月份(01..12)
%d 按月计的日期(例如:01)
%H 小时(00-23)
%M 分钟(00..59)
%S 秒(00-60)
%s 1970-01-01 00:00:00 UTC 以来的秒数
%T 时间,等于%H:%M:%S
%F 完整日期格式,等价于 %+4Y-%m-%d
#显示当前时间
[root@Rocky9 ~]# date +"%Y年%m月%d日 %H时%M分%S秒"
2024年10月10日 16时02分14秒
#显示前一天
[root@Rocky9 ~]# date -d "-1day" +"%Y年%m月%d日 %H时%M分%S秒"
2024年10月09日 16时02分41秒
15、timedatectl修改时区
#修改ubuntu默认时区为东八区
(test)root@ubuntu:~# date
Thu Oct 10 08:19:05 AM UTC 2024
(test)root@ubuntu:~# timedatectl set-timezone Asia/Shanghai
(test)root@ubuntu:~# date
Thu Oct 10 04:19:44 PM CST 2024
16、screen会话管理工具
打开一个终端窗口(terminal window,以下简称"窗口"),在里面输入命令。用户与计算机的这种临时的交互,称为一次"会话" ;会话的一个重要特点是,窗口与其中启动的进程是连在一起的。打开窗口,会话开始;关闭窗口,会话结束,会话内部的进程也会随之终止,不管有没有运行完,为了解决这个问题,会话与窗口可以"解绑":窗口关闭时,会话并不终止,继续运行,等到以后需要的时候,再让会话"绑定" 其他窗口
常用选项:
screen –S [SESSION] #创建新screen会话
screen –x [SESSION] #加入screen会话
screen -r [SESSION] #恢复某screen会话
screen -ls #显示所有已经打开的screen会话
#创建一个PING_baidu的会话
[root@192 ~]# screen -S PING_baidu
[root@192 ~]# screen -ls
There is a screen on:
2650.PING_baidu (Attached)
1 Socket in /run/screen/S-root.
#使用一个持续的命令
[root@192 ~]# ping www.baidu.com
PING www.a.shifen.com (157.148.69.74) 56(84) bytes of data.
#关闭终端,使用其它终端打开
[root@192 ~]# screen -r 2650
64 bytes from 157.148.69.74 (157.148.69.74): icmp_seq=63 ttl=128 time=29.1 ms
17、echo打印字符
显示字符,echo会将输入的字符串送往标准输出。输出的字符串间以空白字符隔开, 并在最后加上换行号
常见选项:
-n #输出完成后不换行
-e #转义特定字符串
-E #不转义,原样输出,默认选项
#启用命令选项-e,若字符串中出现以下字符,则特别加以处理,而不会将它当成一般文字输出
\a #发出警告声
\b #退格键
\c #最后不加上换行符号
\e #escape,相当于\033
\n #换行且光标移至行首
\r #换行
\t #输入制表符
#打印一串字符串并发出告警声
[root@192 ~]# echo -e "hello\a"
hello
[root@192 ~]# echo -e "hello\tworld"
hello world
18、{}符号扩展
#打印数字1~3
[root@192 ~]# echo {1..3}
1 2 3
#设置步长为2
[root@192 ~]# echo {1..5..2}
1 3 5
[root@192 ~]# echo {a,b}
a b
[root@Rocky9 ~]# echo {a..c}
a b c
#可以用于批量创建文件
[root@192 ~]# ll
total 4
-rw-------. 1 root root 1333 Oct 9 18:10 anaconda-ks.cfg
drwxr-xr-x. 2 root root 6 Oct 10 16:55 test
[root@192 ~]# touch ./test/{a,b}.txt
[root@192 ~]# ll ./test/
total 0
-rw-r--r--. 1 root root 0 Oct 10 16:56 a.txt
-rw-r--r--. 1 root root 0 Oct 10 16:56 b.txt
19、history查看命令历史
当执行某个命令后,系统会在内存中记录下此命令,此时只记录在内存中,
当正常退出终端后,内存中记录下来的执行命令的历史,会保存到用户家目录下的 .bash_history 文件中
[root@192 ~]# ll .bash_history
-rw-------. 1 root root 2330 Oct 10 16:46 .bash_history
[root@192 ~]# cat .bash_history
ip a
tty
#显示当前用户的命令
[root@192 ~]# history
1 ip a
2 tty
#可以设置变量查看当前用户执行命令的时间
[root@192 ~]# echo "HISTTIMEFORMAT='%F %T '" >> .bashrc ; source .bashrc
[root@192 ~]# history | head -n 2
1 2024-10-10 16:44:59 ip a
2 2024-10-10 16:44:59 tty
二、文件管理
1、Linux七种文件类型
文件类型 | 标识符 | 说明 |
---|---|---|
普通文件 | - | file |
目录文件 | d | directory |
链接文件 | l | link |
块设备文件 | b | block |
字符设备文件 | c | character |
管道文件 | p | pipe |
套接字文件 | s | socket |
-
文件系统的目录结构
文件和目录被组织成一个单根倒置树的结构
文件系统从根目录开始,用/表示
文件名称大小写敏感
每个文件都有两类相关数据: 元数据 、 数据
2、cd切换目录
常见用法:
cd - 切换到上次所在的目录
cd ~ 切换到用户的家目录
cd .. 返回父目录
cd ~user 切换到某用户的家目录
3、pwd显示当前用户所在目录
常用选项:
-P 显示当前所在的物理路径
-L 显示当前所在的逻辑路径(默认)
[root@Rocky9 ~]# ls -ld /bin /usr/bin
lrwxrwxrwx. 1 root root 7 5月 16 2022 /bin -> usr/bin
dr-xr-xr-x. 2 root root 20480 10月 9 18:11 /usr/bin
[root@Rocky9 bin]# pwd
/bin
[root@Rocky9 bin]# pwd -L
/bin
[root@Rocky9 bin]# pwd -P
/usr/bin
#绝对路径和相对路径
绝对路径:以根目录为开始的路径
相对路径:相对于现在目录所在的路径
4、基名和目录名
basename:只取文件名,不取目录名
dirname:只取目录名,不要文件名
#案例
[root@Rocky9 ~]# mkdir -pv /dir1/dir2/dir3 ; touch /dir1/dir2/dir3/{1..3}.txt
mkdir: 已创建目录 '/dir1'
mkdir: 已创建目录 '/dir1/dir2'
mkdir: 已创建目录 '/dir1/dir2/dir3'
[root@Rocky9 ~]# dirname /dir1/dir2/dir3/1.txt
/dir1/dir2/dir3
[root@Rocky9 ~]# basename /dir1/dir2/dir3/1.txt
1.txt
#也可以取链接名
[root@Rocky9 ~]# basename https://dowhttps://downloads.mysql.com/archives/get/p/23/file/mysql-8.4.0-linux-glibc2.28-x86_64.tar.xz
mysql-8.4.0-linux-glibc2.28-x86_64.tar.xz
#-s移除后缀
[root@Rocky9 ~]# basename -s .tar.xz https://downloads.mysql.com/archives/get/p/23/file/mysql-8.4.0-linux-glibc2.28-x86_64.tar.xz
mysql-8.4.0-linux-glibc2.28-x86_64
5、ls列出目录内容
常用选项:
-a|--all #包含隐藏文件
-l #显示额外的信息
-R|--recursive #目录递归
-d|--directory #仅显示当前目录
-1 #数字1,文件分行显示
-S #按从大到小排序
-t #按mtime排序,时间新的靠前
#案例
[root@Rocky9 ~]# ls
anaconda-ks.cfg dir1
[root@Rocky9 ~]# ls -1
anaconda-ks.cfg
dir1
#文件从大到小排序
[root@Rocky9 ~]# ls -S -1 /etc | head -n4
总用量 1044
-rw-r--r--. 1 root root 692252 6月 23 2020 services
-rw-r--r--. 1 root root 13859 10月 9 19:07 ld.so.cache
-rw-r--r--. 1 root root 8979 10月 9 18:11 kdump.conf
#文件修改时间排序
[root@Rocky9 ~]# ls -t -l /etc | head -n4
总用量 1044
-rw-r--r--. 1 root root 98 10月 11 12:20 resolv.conf
-rw-r--r--. 1 root root 7 10月 10 10:15 hostname
drwxr-xr-x. 4 root root 4096 10月 9 19:07 ssh
5、stat显示文件状态
[root@Rocky9 ~]# stat dir1
文件:dir1
大小:18 块:0 IO 块:4096 目录
设备:fd00h/64768d Inode:34546034 硬链接:3
权限:(0755/drwxr-xr-x) Uid:( 0/ root) Gid:( 0/ root)
环境:unconfined_u:object_r:admin_home_t:s0
最近访问:2024-10-11 16:18:18.342529807 +0800 #atime
最近更改:2024-10-11 16:18:18.344529817 +0800 #mtime
最近改动:2024-10-11 16:18:18.344529817 +0800 #ctime
创建时间:2024-10-11 16:18:18.342529807 +0800 #birth
#atime不是随时发生改变的,由于文件存在大量的访问所以一般只有ctime和mtime比atime新的时候 atime才会发生改变或者当前atime距离上次atime超过24小时才会更新
[root@Rocky9 ~]# echo 1 > dir1/dir2/dir3/1.txt
[root@Rocky9 ~]# stat dir1/dir2/dir3/1.txt
文件:dir1/dir2/dir3/1.txt
大小:2 块:8 IO 块:4096 普通文件
设备:fd00h/64768d Inode:101912498 硬链接:1
权限:(0644/-rw-r--r--) Uid:( 0/ root) Gid:( 0/ root)
环境:unconfined_u:object_r:admin_home_t:s0
最近访问:2024-10-11 17:06:14.974608171 +0800
最近更改:2024-10-11 17:11:07.171476227 +0800
最近改动:2024-10-11 17:11:07.171476227 +0800
创建时间:2024-10-11 17:06:14.974608171 +0800
[root@Rocky9 ~]# cat dir1/dir2/dir3/1.txt
1
[root@Rocky9 ~]# stat dir1/dir2/dir3/1.txt
文件:dir1/dir2/dir3/1.txt
大小:2 块:8 IO 块:4096 普通文件
设备:fd00h/64768d Inode:101912498 硬链接:1
权限:(0644/-rw-r--r--) Uid:( 0/ root) Gid:( 0/ root)
环境:unconfined_u:object_r:admin_home_t:s0
最近访问:2024-10-11 17:12:06.511855596 +0800
最近更改:2024-10-11 17:11:07.171476227 +0800
最近改动:2024-10-11 17:11:07.171476227 +0800
创建时间:2024-10-11 17:06:14.974608171 +0800
#再次访问atime不会发生变化
[root@Rocky9 ~]# cat dir1/dir2/dir3/1.txt
1
[root@Rocky9 ~]# stat dir1/dir2/dir3/1.txt
文件:dir1/dir2/dir3/1.txt
大小:2 块:8 IO 块:4096 普通文件
设备:fd00h/64768d Inode:101912498 硬链接:1
权限:(0644/-rw-r--r--) Uid:( 0/ root) Gid:( 0/ root)
环境:unconfined_u:object_r:admin_home_t:s0
最近访问:2024-10-11 17:12:06.511855596 +0800
最近更改:2024-10-11 17:11:07.171476227 +0800
最近改动:2024-10-11 17:11:07.171476227 +0800
创建时间:2024-10-11 17:06:14.974608171 +0800
6、通配符
通配符用于匹配文件名称,采用特定的符号匹配多个文件
* #匹配零个或多个字符,但不匹配 "." 开头的文件,即隐藏文件
? #匹配任何单个字符,一个汉字也算一个字符,
~ #当前用户家目录
. #当前工作目录
[0-9] #匹配数字范围
[a-z] #一个字母 在Ubuntu中区分大小写 Rocky中不区分
[A-Z] #一个字母
[zy] #匹配列表中的任何的一个字符
[^zy] #匹配列表中的所有字符以外的字符
[^a-z] #匹配列表中的所有字符以外的字符
#案例
[root@Rocky9 ~]# ls dir1/dir2/dir3/
1.org 1.txt 2.org 2.txt 3.org 3.txt a.org b.org c.org
[root@Rocky9 ~]# ls dir1/dir2/dir3/3*
dir1/dir2/dir3/3.org dir1/dir2/dir3/3.txt
[root@Rocky9 ~]# ls dir1/dir2/dir3/[1-2].txt
dir1/dir2/dir3/1.txt dir1/dir2/dir3/2.txt
[root@Rocky9 ~]# ls dir1/dir2/dir3/[abzy].org
dir1/dir2/dir3/a.org dir1/dir2/dir3/b.org
[root@Rocky9 ~]# ls dir1/dir2/dir3/[^a].org
dir1/dir2/dir3/1.org dir1/dir2/dir3/2.org dir1/dir2/dir3/3.org dir1/dir2/dir3/b.org dir1/dir2/dir3/c.org
特殊符号:
[:digit:] #任意数字,相当于0-9
[:lower:] #任意小写字母,表示 a-z
[:upper:] #任意大写字母,表示 A-Z
[:alpha:] #任意大小写字母
[:alnum:] #任意数字或字母
[:space:] #水平或垂直空白字符
[root@Rocky9 ~]# ls dir1/dir2/dir3/[:[:digit:]:].txt
dir1/dir2/dir3/1.txt dir1/dir2/dir3/2.txt dir1/dir2/dir3/3.txt
7、cp复制文件和目录
格式:
cp [OPTION]... SOURCE... DIRECTORY
cp [OPTION]... -t DIRECTORY SOURCE...
常用选项:
-i|--interactive #如果目标文件己存在,则提示是否覆盖
-n|--no-clobber #如果目标文件己存在,则跳过此文件复制
-R|-r|--recursive #递归复制,可用于目录的复制
-a|--archive #保留所有属性
-b #先备份再覆盖只能存在一个备份文件
--backup=numbered #目标存在,覆盖前先备份加数字后缀,形式为 filename.~#~ ,可以保留多个版本
[root@Rocky9 ~]# echo "abc" > a.txt ; cp a.txt b.txt ; ll *.txt
-rw-r--r--. 1 root root 4 10月 11 18:12 a.txt
-rw-r--r--. 1 root root 4 10月 11 18:12 b.txt
#如果目标文件存在,那么先备份成filename~
[root@Rocky9 ~]# cp -b a.txt b.txt
cp:是否覆盖'b.txt'? y
[root@Rocky9 ~]# ll *.txt*
-rw-r--r--. 1 root root 4 10月 11 18:12 a.txt
-rw-r--r--. 1 root root 4 10月 11 18:13 b.txt
-rw-r--r--. 1 root root 4 10月 11 18:12 b.txt~
8、mv移动或重命名文件
mv可以实现文件或者目录的移动和改名
同一分区移动,速度快,数据位置没有发生变化
不同分区移动,速度慢,数据位置发生了了变化
格式:
mv [OPTION]... SOURCE... DIRECTORY
mv [OPTION]... -t DIRECTORY SOURCE...
-b #如果目标存在,则先备份
-i|--interactive #如果目标文件己存在,则提示是否覆盖
#移动文件
[root@Rocky9 ~]# mv dir1 /home/zy/
[root@Rocky9 ~]# cd ~zy
[root@Rocky9 zy]# ll
总用量 0
drwxr-xr-x. 3 root root 18 10月 11 16:18 dir1
9、rename批量修改文件名
#把所有org后缀的文件修改为.txt的文件
[root@Rocky9 dir3]# ls
1.org 2.org 3.org a.org b.org c.org
[root@Rocky9 dir3]# rename ".org" ".txt" *.org
[root@Rocky9 dir3]# ls
1.txt 2.txt 3.txt a.txt b.txt c.txt
10、rm删除文件
生产环境谨慎使用,使用mv替代rm
常用选项:
-i #删除前确认
-r #递归删除
-f #强制删除
[root@Rocky9 zy]# rm dir1
rm: 无法删除 'dir1': 是一个目录
[root@Rocky9 zy]# rm -rf dir1
11、mkdir创建目录
常用选项:
-m|--mode #目录权限属性
-p|--parents #如果要创建的目录父级目录不存在,则一起创建,是递归的意思
-v|--verbose #显示创建过程
#递归创建目录
[root@Rocky9 zy]# mkdir -pv dir1/dir2/dir3 : touch dir1/dir2/dir3
mkdir: 已创建目录 'dir1'
mkdir: 已创建目录 'dir1/dir2'
mkdir: 已创建目录 'dir1/dir2/dir3'
#创建目录并设置权限
[root@Rocky9 zy]# mkdir -m 111 dir1
[root@Rocky9 zy]# ls -dl dir1
d--x--x--x. 2 root root 6 10月 11 18:43 dir1
12、inode表
每个文件,分为文件元数据和具体内容两个部分,每个文件都有一个inode和n(n>=1)个block 数据块,inode 存储文件元数据,数据块存储文件具体内容数据;当系统在找一个文件的时候,先通过文件名找到文件的inode编号,通过inode编号找到文件indoe信息,然后再通过inode信息中的block指针寻找到文件的内容
#可以使用df -i 查看当前分区inode编号的使用情况
[root@Rocky9 zy]# df -i | column -t
文件系统 Inodes 已用(I) 可用(I) 已用(I)% 挂载点
devtmpfs 459053 390 458663 1% /dev
tmpfs 464338 1 464337 1% /dev/shm
tmpfs 819200 697 818503 1% /run
/dev/mapper/rl_192-root 33495040 31327 33463713 1% /
/dev/nvme0n1p1 524288 358 523930 1% /boot
/dev/mapper/rl_192-home 16353280 9 16353271 1% /home
tmpfs 92867 14 92853 1% /run/user/1000
#如果inode用完也会出现No space left on device的问题
[root@Rocky9 zy]# df -i
文件系统 Inodes 已用(I) 可用(I) 已用(I)% 挂载点
devtmpfs 459053 390 458663 1% /dev
tmpfs 464338 1 464337 1% /dev/shm
tmpfs 819200 698 818502 1% /run
/dev/mapper/rl_192-root 33495040 31327 33463713 1% /
/dev/nvme0n1p1 524288 358 523930 1% /boot
/dev/mapper/rl_192-home 16353280 9 16353271 1% /home
tmpfs 92867 14 92853 1% /run/user/1000
[root@Rocky9 zy]# echo /run/test/{1..818503} | xargs -n 10000 touch
touch: 无法创建 '/run/test/818503': 设备上没有空间
#inode节点已被使用完毕
[root@Rocky9 zy]# df -i | grep "/run"
tmpfs 819200 819200 0 100% /run
tmpfs 92867 14 92853 1% /run/user/1000
#磁盘上还有空间
[root@Rocky9 zy]# df -hT | grep "/run"
tmpfs tmpfs 726M 9.0M 717M 2% /run
tmpfs tmpfs 363M 0 363M 0% /run/user/1000
13、软链接和硬链接
区别 | 硬链接 hard link | 软链接 soft link | |
---|---|---|---|
inode编号 | inode编号相同 | inode编号不同 | |
链接数 | 创建硬链接链接数增加 | 链接数不变 | |
分区 | 不支持跨分区创建 | 支持跨分区创建 | |
目录 | 不支持对目录创建 | 支持对目录创建 | |
删除链接 | 删除链接,链接数减1 直到链接数为0 文件彻底删除 | 如果涉及到对目录创建软链接,使用rm即可 如果使用rm -rf会删除原文件 | |
本质 | 多个文件名,指向同一个inode,实则是同一个文件 | 相当于快捷方式 |
#创建硬链接
[root@Rocky9 zy]# ll
总用量 0
-rw-r--r--. 1 root root 0 10月 11 23:01 a.txt
d--x--x--x. 2 root root 6 10月 11 18:43 dir1
[root@Rocky9 zy]# ln a.txt b.txt ; ll -i *.txt
137 -rw-r--r--. 2 root root 0 10月 11 23:01 a.txt
137 -rw-r--r--. 2 root root 0 10月 11 23:01 b.txt
[root@Rocky9 zy]# \rm b.txt
[root@Rocky9 zy]# ll *.txt
-rw-r--r--. 1 root root 0 10月 11 23:01 a.txt
#创建软链接
[root@Rocky9 zy]# ln -s dir1 dir1_link ; ls -dli dir*
136 d--x--x--x. 2 root root 6 10月 11 18:43 dir1
138 lrwxrwxrwx. 1 root root 4 10月 11 23:06 dir1_link -> dir1
#删除软链接
[root@Rocky9 zy]# rm dir1_link
rm:是否删除符号链接 'dir1_link'?y
14、重定向
Linux系统中有三个基本的IO设备
1. 标准输入设备(stdin):对应终端键盘
2. 标准输出设备(stdout):对应终端的显示器
3. 标准错误输出设备(stderr):对应终端的显示器
[zy@Rocky9 ~]$ ll /proc/$BASHPID/fd
总用量 0
lrwx------. 1 zy zy 64 10月 12 12:54 0 -> /dev/pts/0
lrwx------. 1 zy zy 64 10月 12 12:54 1 -> /dev/pts/0
lrwx------. 1 zy zy 64 10月 12 12:54 2 -> /dev/pts/0
-
标准输出 >
Linux系统中有三个基本的IO设备
1. 标准输入设备(stdin):对应终端键盘
2. 标准输出设备(stdout):对应终端的显示器
3. 标准错误输出设备(stderr):对应终端的显示器
[zy@Rocky9 ~]$ ll /proc/$BASHPID/fd
总用量 0
lrwx------. 1 zy zy 64 10月 12 12:54 0 -> /dev/pts/0
lrwx------. 1 zy zy 64 10月 12 12:54 1 -> /dev/pts/0
lrwx------. 1 zy zy 64 10月 12 12:54 2 -> /dev/pts/0
-
标准错误 2>
[root@Rocky9 zy]# ls a.txt x.txt 2> a.txt ; echo "-----cat file------" ;cat a.txt
a.txt
-----cat file------
ls: 无法访问 'x.txt': 没有那个文件或目录
#标准错误和标准错误同时输出到同一个文件
[root@Rocky9 zy]# ls a.txt x.txt > a.txt 2>&1 ; echo "-----cat file------" ;cat a.txt
-----cat file------
ls: 无法访问 'x.txt': 没有那个文件或目录
a.txt
[root@Rocky9 zy]# ls a.txt x.txt &> a.txt ; echo "-----cat file------" ;cat a.txt
-----cat file------
ls: 无法访问 'x.txt': 没有那个文件或目录
a.txt
#标准错误和标准错误输出到不同文件
[root@Rocky9 zy]# ls a.txt x.txt > true.txt 2> false.txt; echo "---cat true---"; cat true.txt;echo "---cat false---";cat false.txt
---cat true---
a.txt
---cat false---
ls: 无法访问 'x.txt': 没有那个文件或目录
-
标准输入 <
# 将file中的内容输入到bc中
[root@Rocky9 zy]# echo "1+1" > num.txt
[root@Rocky9 zy]# bc < num.txt
2
# 在命令行中输入内容并且以EOF结尾结束输入
[root@Rocky9 zy]# bc <<EOF
> 1+1
> EOF
2
# 将命令结果作为输入内容
[root@Rocky9 zy]# bc < <(seq -s "+" 100)
5050
# 将字符串作为输入内容
[root@Rocky9 zy]# bc <<<"1+1"
2
15、tr字符处理
用于转换字符、删除字符和压缩重复的字符。它从标准输入读取数据并将结果输出到标准输出 格式: tr [OPTION]... SET1 [SET2]
常用选项:
选项
-c|-C|--complement #用SET2替换SET1中没有包含的字符
-d|--delete #删除SET1中所有的字符,不转换
-s|--squeeze-repeats #压缩SET1中重复的字符,即删除重复的字符
-t|--truncate-set1 #将SET1用SET2替换,SET2中不够的,就不处理
# 将除了a以为的字符都变成b,由于echo输出会在结尾处添加换行,所以会将换行符也换成b
[root@Rocky9 zy]# echo "abcd" | tr -c "a" "b"
abbbb[root@Rocky9 zy]#
#将ac字符删除
[root@Rocky9 zy]# echo "abcd" | tr -d "ac"
bd
#压缩字符b
[root@Rocky9 zy]# echo "abbbbbc" | tr -s "b"
abc
#替换字符
[root@Rocky9 zy]# echo "abcd" | tr -t "a" "x"
xbcd
#输出10个随机数
[root@Rocky9 zy]# cat /dev/random | tr -dc [:alnum:] | head -c 10
p8kxFXRv1J
#将小写字符转换为大写字符
[root@Rocky9 zy]# echo "abcd" | tr -t [:lower:] [:upper:]
ABCD
16、管道
将前一个命令的标准输出作为后一个命令的输入,所有命令会在当前shell进程的子shell进程中执行 格式: cmd1|cmd2|cmd3
#求100以内的偶数和
[root@Rocky9 zy]# seq -s "+" 0 2 100 | bc
2550
三、用户和权限管理
1、用户类型
Linux系统是多用户系统,可以同时存在多个用户,每个用户之间是互相隔离的,在Linux系统中 每个用户通过UID来唯一标识
普通用户 | 普通用户 | |
---|---|---|
uid | 0 | 普通用户: 1000+ | 系统用户: 1~999 |
权限 | 对系统有完整的控制权限 | 权限有限 |
程序是否有可执行权限由用户决定,文件是否由可访问权限由用户决定
2、用户组
组类型 | 组名 | 组id |
---|---|---|
超级管理员组 | root | 0 |
普通系统组 | 自定义 | 1~999 |
普通用户组 | 自定义 | 100+ |
一个用户至少有一个组,也可以有多个组; 一个组至少有0个用户,或者多个用户 用户的主要组(私有组),一个用户必须要有一个主组
3、useradd用户创建
格式:useradd [options] LOGIN
常见选项:
-u|--uid UID #指定UID
-g|--gid GID #指定用户组,-g groupname|--gid GID
-d|--home-dir HOME_DIR #指定家目录,可以是不存在的,指定家目录,并不代表创建家目录
-s|--shell SHELL #指定 shell,可用shell在/etc/shells 中可以查看 ubuntu默认是/bin/sh
-r|--system #创建系统用户
-m|--create-home #创建家目录,一般用于登录用户
-M|--no-create-home #不创建家目录,一般用于不用登录的用户
-G|--groups GROUP1[,GROUP2,...] #为用户指明附加组,组须事先存在
#创建一个普通用户
[root@Rocky9 ~]# useradd -u 1001 -d /home/ygnahz -m -s /bin/bash ygnahz
[root@Rocky9 ~]# ll -d /home/ygnahz ; id ygnahz
drwx------. 2 ygnahz ygnahz 62 10月 12 16:14 /home/ygnahz
用户id=1001(ygnahz) 组id=1001(ygnahz) 组=1001(ygnahz)
#由于skel目录存在,普通用户家目录会存在很多隐藏文件
[root@Rocky9 ~]# ll /etc/skel -a
总用量 24
drwxr-xr-x. 2 root root 62 10月 9 18:10 .
drwxr-xr-x. 79 root root 8192 10月 12 16:14 ..
-rw-r--r--. 1 root root 18 4月 30 19:28 .bash_logout
-rw-r--r--. 1 root root 141 4月 30 19:28 .bash_profile
-rw-r--r--. 1 root root 492 4月 30 19:28 .bashrc
[root@Rocky9 ~]# ll /home/ygnahz -a
总用量 12
drwx------. 2 ygnahz ygnahz 62 10月 12 16:14 .
drwxr-xr-x. 4 root root 30 10月 12 16:14 ..
-rw-r--r--. 1 ygnahz ygnahz 18 4月 30 19:28 .bash_logout
-rw-r--r--. 1 ygnahz ygnahz 141 4月 30 19:28 .bash_profile
-rw-r--r--. 1 ygnahz ygnahz 492 4月 30 19:28 .bashrc
#/etc/default/useradd目录设定了一些用户创建的默认值
[root@Rocky9 ~]# cat /etc/default/useradd
# useradd defaults file
GROUP=100
HOME=/home
INACTIVE=-1
EXPIRE=
SHELL=/bin/bash
SKEL=/etc/skel
CREATE_MAIL_SPOOL=yes
4、usermod用户属性修改
常见选项:
-d|--home HOME_DIR #修改家目录
-g|--gid GROUP #修改组
-G|--groups GROUPS #groupName|GID... 新附加组,原来的附加组将会被覆盖;若保留原有,则要同时使用-a选项
-l|--login LOGIN #新的登录名称
-L|--lock #锁定用户帐号,在/etc/shadow 密码栏的增加 !
-U #解锁用户帐号,将 /etc/shadow 密码栏的!拿掉
#锁定用户
[root@Rocky9 ~]# getent shadow zy
zy:$6$JXLxhBoXpMBswiv6$w5WZoHHeJiLkpWYtq5ZjTilnQfgCMRQG4HtWSFIICRFCRv9bqi2LXyU0mj0E7vvBNNneiksED8GAOrCKe0qma/::0:99999:7:::
[root@Rocky9 ~]# usermod -L zy
[root@Rocky9 ~]# getent shadow zy
zy:!$6$JXLxhBoXpMBswiv6$w5WZoHHeJiLkpWYtq5ZjTilnQfgCMRQG4HtWSFIICRFCRv9bqi2LXyU0mj0E7vvBNNneiksED8GAOrCKe0qma/::0:99999:7:::
5、userdel删除用户
常见选项:
-f|--force #强制删除,哪怕用户正在登录状态
-r|--remove #删除家目录和邮件目录
[root@Rocky9 ~]# ll /home/ ; userdel -r ygnahz ; ll /home/
总用量 0
drwx------. 2 ygnahz ygnahz 62 10月 12 17:12 ygnahz
drwx------. 3 zy zy 178 10月 12 13:12 zy
总用量 0
drwx------. 3 zy zy 178 10月 12 13:12 zy
6、su切换用户
su username: 非登录式切换,即不会读取目标用户的配置文件,不改变当前工作目录,即不完全切换 su - username:登录式切换,会读取目标用户的配置文件,切换到自己的家目录
#使用完全切换
[root@Rocky9 ~]# echo $PATH
/root/.local/bin:/root/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin
[root@Rocky9 ~]# su - zy
上一次登录: 六 10月 12 17:24:30 CST 2024 pts/0 上
[zy@Rocky9 ~]$ echo $PATH
/home/zy/.local/bin:/home/zy/bin:/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin
7、passwd设置密码
常用选项:
--stdin #从标准输入接收密码,Ubuntu无此选项
#交互式修改密码
[root@Rocky9 ~]# passwd zy
更改用户 zy 的密码 。
新的密码:
无效的密码: 密码少于 8 个字符
重新输入新的密码:
passwd:所有的身份验证令牌已经成功更新。
#非交互式修改密码
[root@Rocky9 ~]# echo "123456" | passwd --stdin zy
更改用户 zy 的密码 。
passwd:所有的身份验证令牌已经成功更新。
8、文件的三种权限
权限 | 对文件 | 对目录 |
---|---|---|
r | 可以查看文件内容 | 可以读取目录中的文件名,但文件元数据无法查看 |
w | 可以修改文件内容 | 可以在目录中创建和删除文件,如果没有x权限 那么无法操作 |
x | 可执行,发起为一个进程 | 可以进入目录,可以查看文件元数据,属于目录最小权限 |
9、chown修改文件所有者
chown [OPTION]... [OWNER][:[GROUP]] FILE...
chown [OPTION]... --reference=RFILE FILE...
#用法说明
OWNER #只修改所有者
OWNER:GROUP #同时修改所有者和属组
常见选项
-R|--recursive #递归操作
#修改文件权限
[root@Rocky9 zy]# ll -d dir2 ll -d dir2 ; chown ygnahz:ygnahz dir2 ; ll -d dir2
drwxr--r--. 2 zy zy 22 10月 12 17:41 dir2
drwxr--r--. 2 ygnahz ygnahz 22 10月 12 17:41 dir2
10、chmod修改文件属性
-
角色定义
角色 | 在命令中的字符 | 备注 |
---|---|---|
user | u | 属主 |
group | g | 属组 |
other | o | 其它用户 |
all | a | 所有人 |
-
赋值
命令中的字符 | 备注 |
---|---|
+ | 增加权限 |
- | 删除权限 |
= | 覆盖权限 |
-
权限表示方法
权限 | 命令中的字符 | 八进制表示 | 备注 |
---|---|---|---|
可读 | r | 4 | 读权限 |
可写 | w | 2 | 写权限 |
可执行 | x | 1 | 执行权限 |
chown [OPTION]... [OWNER][:[GROUP]] FILE...
chown [OPTION]... --reference=RFILE FILE...
#用法说明
OWNER #只修改所有者
OWNER:GROUP #同时修改所有者和属组
常见选项
-R|--recursive #递归操作
#修改文件权限
[root@Rocky9 zy]# ll -d dir2 ll -d dir2 ; chown ygnahz:ygnahz dir2 ; ll -d dir2
drwxr--r--. 2 zy zy 22 10月 12 17:41 dir2
drwxr--r--. 2 ygnahz ygnahz 22 10月 12 17:41 dir2
11、umask新建文件默认权限
chown [OPTION]... [OWNER][:[GROUP]] FILE...
chown [OPTION]... --reference=RFILE FILE...
#用法说明
OWNER #只修改所有者
OWNER:GROUP #同时修改所有者和属组
常见选项
-R|--recursive #递归操作
#修改文件权限
[root@Rocky9 zy]# ll -d dir2 ll -d dir2 ; chown ygnahz:ygnahz dir2 ; ll -d dir2
drwxr--r--. 2 zy zy 22 10月 12 17:41 dir2
drwxr--r--. 2 ygnahz ygnahz 22 10月 12 17:41 dir2
12、特殊权限
除了常见的rwx权限以外,还有三种特殊权限 分别为SUID SGID Stick三种权限
权限 | 二进制文件 | 目录 |
---|---|---|
SUID | 作用在二进制文件上,用户将继承此程序所有者的权限 | \ |
SGID | 作用在目录上,用户将继承此程序所属组的权限 | 此目录新建的文件所属组将自动从此目录继承 |
Stick | \ | 此目录的文件只能由文件所有者自己来删除 |
#suid 使cat程序拥有suid权限,那么普通用户也能查看无法查看的文件内容
[zy@Rocky9 ~]$ cat /etc/shadow
cat: /etc/shadow: 权限不够
[root@Rocky9 ~]# ll -d $(which cat)
-rwxr-xr-x. 1 root root 36440 4月 21 02:43 /usr/bin/cat
[root@Rocky9 ~]# chmod u+s /usr/bin/cat
[root@Rocky9 ~]# ll -d /usr/bin/cat
-rwsr-xr-x. 1 root root 36440 4月 21 02:43 /usr/bin/cat
[zy@Rocky9 ~]$ cat /etc/shadow
tss:!!:20005::::::
sshd:!!:20005::::::
#sgid 在设置sgid的目录下创建文件 所属组和目录一致
[root@Rocky9 zy]# ll
总用量 0
drwxr-xr-x. 2 root zy 6 10月 12 21:31 dir1
[root@Rocky9 zy]# chmod g+s dir1
[root@Rocky9 zy]# touch dir1/b.txt ; ll dir1/b.txt
-rw-r--r--. 1 root zy 0 10月 12 22:14 dir1/b.txt
#stick 目录下的文件只能由所有者自己删除
[root@Rocky9 zy]# chmod o+t dir1
[root@Rocky9 zy]# ll
总用量 0
drwxrwxrwt. 2 root zy 32 10月 12 22:14 dir1
13、ACL访问控制列表
ACL可以单独对指定的用户设定各不相同的权限;提供颗粒度更细的权限控制
#suid 使cat程序拥有suid权限,那么普通用户也能查看无法查看的文件内容
[zy@Rocky9 ~]$ cat /etc/shadow
cat: /etc/shadow: 权限不够
[root@Rocky9 ~]# ll -d $(which cat)
-rwxr-xr-x. 1 root root 36440 4月 21 02:43 /usr/bin/cat
[root@Rocky9 ~]# chmod u+s /usr/bin/cat
[root@Rocky9 ~]# ll -d /usr/bin/cat
-rwsr-xr-x. 1 root root 36440 4月 21 02:43 /usr/bin/cat
[zy@Rocky9 ~]$ cat /etc/shadow
tss:!!:20005::::::
sshd:!!:20005::::::
#sgid 在设置sgid的目录下创建文件 所属组和目录一致
[root@Rocky9 zy]# ll
总用量 0
drwxr-xr-x. 2 root zy 6 10月 12 21:31 dir1
[root@Rocky9 zy]# chmod g+s dir1
[root@Rocky9 zy]# touch dir1/b.txt ; ll dir1/b.txt
-rw-r--r--. 1 root zy 0 10月 12 22:14 dir1/b.txt
#stick 目录下的文件只能由所有者自己删除
[root@Rocky9 zy]# chmod o+t dir1
[root@Rocky9 zy]# ll
总用量 0
drwxrwxrwt. 2 root zy 32 10月 12 22:14 dir1
四、文本管理
1、cat查看文本内容
常见选项
-A #显示所有控制符 ^I为制表符 $显示为行结束符
-n #对显示出的每一行编号
-b #非空行编号
-s 压缩连续的空行成一行
#案例
[zy@Rocky9 ~]$ echo -e "a\tb " > a.txt
[zy@Rocky9 ~]$ cat -A a.txt
a^Ib $
[zy@Rocky9 ~]$ cat -n a.txt
1 hello linux
2
3 this is a test
4
5
6 thanks
2、tac逆向显示内容
#将输出的内容逆向显示
[zy@Rocky9 ~]$ cat a.txt
1
2
3
[zy@Rocky9 ~]$ tac a.txt
3
2
1
3、more分页查看文件内容
可以分页查看文件内容,对于比较长的文件可以使用
#常用选项
-s #压缩连续的空行
#使用enter下一行 使用空格下一页
[root@Rocky9 ~]# cat ~zy/a.txt ;echo "----more----" ; more -s ~zy/a.txt
hello linux
this is a test
thanks
----more----
hello linux
this is a test
thanks
4、less分页查看文件内容
实现分页查看文件或者STDIN输出,支持搜索比more更加强大
#常用选项
-N #显示行号
-s #压缩连续空行
-S #不换行显示较长的内容
#输入\进行搜索,使用N向下查找,使用n向上查找
#使用enter下一行,使用空格换页
[root@Rocky9 ~]# cat /etc/passwd | less -N
1 root:x:0:0:root:/root:/bin/bash
2 bin:x:1:1:bin:/bin:/sbin/nologin
5、head显示文件前面行
常用选项:
-c|--bytes=N #指定获取前N字节
-n|--lines=N #指定获取前N行,N如果为负数,表示从文件头取到倒数第N前
#案例一: 显示文件前几行
[root@Rocky9 ~]# seq 10 | head -n 3
1
2
3
#案例二: 显示文件前几个字节
[root@Rocky9 ~]# echo "abcd" | head -c 2
ab[root@Rocky9 ~]#
#案例三: n值取负数
[root@Rocky9 ~]# seq 7 | head -n -3
1
2
3
4
6、tail取文件的倒数行
-c|--bytes=N #指定获取后N字节
-n|--lines=N #指定获取后N行,如果写成+N,表示从第N行开始到文件结束
-f #跟踪显示文件fd新追加的内容,常用日志监控,当删除再新建同名文件,将无法继续跟踪
#案例1:显示后几行
[root@Rocky9 ~]# seq 7 | tail -n 2
6
7
#案例2:显示后几个字符 由于echo结尾有一个换行符 那么实际上显示效果为c\n
[root@Rocky9 ~]# echo "abc" | tail -c 2
c
#案例3:n值取+数
[root@Rocky9 ~]# seq 4 | tail -n +2
2
3
4
7、cut按列抽取文本
常用选项:
-d|--delimiter=DELIM #指定分割符,默认是tab
-f|--fields=LIST #要显示的列,-f1, -f1,2,3, -f 1-3,4
--output-delimiter=STRING #输出的时候用指定字符代替分割符
[root@localhost ~]# df -Th | tr -s " " | cut -d " " -f 2-5,7 | grep -E "\/home"
xfs 32G 255M 31G /home
8、paste合并多个文件
将相同行号的列合并在一起
常用选项:
#常用选项
-d|--delimiters=LIST #指定分割符,默认用TAB
-s|--serial #合成一行显示
-z|--zero-terminated #以 NUL 字符而非换行符作为行尾分隔符
#案例1:将passwd和username文件两个合并在一起
[zy@Rocky9 ~]$ for i in $(seq 3) ; do \
> echo $(cat /dev/random | tr -dc [:alnum:] | head -c 8) >> passwd.txt ;
> done
[zy@Rocky9 ~]$ cat passwd.txt
RiNa7Qzs
C3S14oMQ
Cwnvmvrf
[zy@Rocky9 ~]$ for i in $(seq 3);do echo user${i} >> user.txt;done
[zy@Rocky9 ~]$ cat user.txt
user1
user2
user3
[zy@Rocky9 ~]$ paste user.txt passwd.txt -d ":"
user1:RiNa7Qzs
user2:C3S14oMQ
user3:Cwnvmvrf
#案例2: 将纵向内容修改为横向内容
[zy@Rocky9 ~]$ paste -s user.txt passwd.txt -d ":"
user1:user2:user3
RiNa7Qzs:C3S14oMQ:Cwnvmvrf
9、wc文本统计数据
wc 命令可用于统计文件的行总数、单词总数、字节总数和字符总数,可以对文件或STDIN中的数据统计
#常用选项
-l|--lines #只计数行数
-w|--words #只计数单词总数
-c|--bytes #只计数字节总数
-m|--chars #只计数字符总数
#查看内核有多少行
[zy@Rocky9 ~]$ wc -l /boot/vmlinuz-5.14.0-427.13.1.el9_4.x86_64
47558 /boot/vmlinuz-5.14.0-427.13.1.el9_4.x86_64
#查看内核有多少个单词
[zy@Rocky9 ~]$ wc -w /boot/vmlinuz-5.14.0-427.13.1.el9_4.x86_64
278485 /boot/vmlinuz-5.14.0-427.13.1.el9_4.x86_64
#查看内核有多少字节
[zy@Rocky9 ~]$ wc -c /boot/vmlinuz-5.14.0-427.13.1.el9_4.x86_64
13605704 /boot/vmlinuz-5.14.0-427.13.1.el9_4.x86_64
[zy@Rocky9 ~]$ ll /boot/vmlinuz-5.14.0-427.13.1.el9_4.x86_64
-rwxr-xr-x. 1 root root 13605704 5月 2 03:23 /boot/vmlinuz-5.14.0-427.13.1.el9_4.x86_64
10、sort文本排序
常用选项:
随机排序
-h|--human-numeric-sort #人类可读排序
-n|--numeric-sort #以数字大小排序
-r|-reverse #倒序
-t|--field-separator=SEP #指定列分割符
-k|--key=KEYDEF #指定排序列
-u|--unique #去重
#生成7个1到5的随机数,并对随机数排序
[zy@Rocky9 ~]$ for i in $(seq 7);do echo $(echo $RANDOM%5+1 | bc ) >> num.txt ; done ;cat num.txt
5
2
2
1
5
2
1
#默认从小到大
[zy@Rocky9 ~]$ sort -n num.txt
1
1
2
2
2
5
5
#去掉重复,并从大到小排序
[zy@Rocky9 ~]$ sort -n -ru num.txt
5
2
1
#统计分区大小并排序
[zy@Rocky9 ~]$ df -hT | tr -s " " | cut -d " " -f 2,3,7 | tail -n +2 | sort -rh -t " " -k 2 | column -t
xfs 64G /
xfs 32G /home
tmpfs 1.8G /dev/shm
xfs 960M /boot
tmpfs 726M /run
tmpfs 363M /run/user/1000
devtmpfs 4.0M /dev
11、uniq去除重复行
uniq从输入中删除前后相互连接的重复的行,常和sort配合使用
常用格式:
-c|--count #显示每行出现次数
-d|--repeated #仅显示有重复行
-u|--unique #仅显示不重复的行
#案例1
[zy@Rocky9 ~]$ sort num.txt
1
1
2
2
2
5
5
#显示唯一出现的行
[zy@Rocky9 ~]$ sort num.txt | uniq -u
#显示重复出现的行
[zy@Rocky9 ~]$ sort num.txt | uniq -d
1
2
5
#显示重复出现的行数
[zy@Rocky9 ~]$ sort num.txt | uniq -c
2 1
3 2
2 5
12、正则表达式
本节采用拓展正则表达式
REGEXP: Regular Expressions,由一类特殊字符及文本字符所编写的模式;类似于增强版的通配符功能;但与通配符不同,通配符功能是用来处理文件名,而正则表达式是处理文本内容中字符
字符匹配:
[] #匹配指定范围内的任意单个字符,示例:[wang] [0-9] [a-z] [a-zA-Z]
[^] #匹配指定范围外的任意单个字符,示例:[^wang]
[:alnum:] #字母和数字
[:alpha:] #代表任何英文大小写字符,亦即 A-Z, a-z
[:lower:] #小写字母,示例:[[:lower:]],相当于[a-z]
[:upper:] #大写字母
[:blank:] #空白字符(空格和制表符)
[:space:] #包括空格、制表符(水平和垂直)、换行符、回车符等各种类型的空白,比[:blank:]包含的范围广
#匹配单个单词
[zy@Rocky9 ~]$ echo -e "rot\nroot" | grep -E "r.t"
rot
[zy@Rocky9 ~]$ echo -e "rot\nroot" | grep -E "r..t"
root
匹配次数
* #匹配前面的字符任意次,包括0次,贪婪模式:尽可能长的匹配
.* #任意长度的任意字符
? #匹配其前面的字符出现0次或1次,即:可有可无
+ #匹配其前面的字符出现最少1次,即:肯定有且 >=1 次
{n} #匹配前面的字符n次
{m,n} #匹配前面的字符至少m次,至多n次
{,n} #匹配前面的字符至多n次,<=n
{n,} #匹配前面的字符至少n次
#字符o显示三次
[zy@Rocky9 ~]$ echo -e "rooot" | grep -E 'ro{,2}t'
[zy@Rocky9 ~]$ echo -e "rooot" | grep -E 'ro{3}t'
rooot
#匹配正负数
[zy@Rocky9 ~]$ echo -e "-100\n100" | grep -E '^[0-9]*$'
100
[zy@Rocky9 ~]$ echo -e "-100\n100" | grep -E '^\-?[0-9]*$'
-100
100
#匹配IP地址
[root@Rocky9 ~]# ifconfig ens160 | grep -Eo "[0-9]*\.[0-9]*\.[0-9]*\.[0-9]*" | head -n 1
192.168.106.131
位置锚定
^ #行首锚定, 用于模式的最左侧
$ #行尾锚定,用于模式的最右侧
^PATTERN$ #用于模式匹配整行
< 或 b #词首锚定,用于单词模式的左侧
> 或 b #词尾锚定,用于单词模式的右侧
<PATTERN> #匹配整个单词
#匹配整个单词
[root@Rocky9 ~]# cat a.txt
helloworld
hellopytho
hello
[root@Rocky9 ~]# cat a.txt | grep -E "hello"
helloworld
hellopytho
hello
[root@Rocky9 ~]# cat a.txt | grep -E "^hello$"
hello
#匹配非空行
[root@Rocky9 ~]# cat a.txt
helloworld
hellopytho
hello
[root@Rocky9 ~]# cat a.txt | grep -vE "^$"
helloworld
hellopytho
hello
分组:() 将多个字符捆绑在一起,当作一个整体处理,如:(root)+
#可以匹配abcabcabc
[root@Rocky9 ~]# echo "abcabcabc" | grep -E "(abc){3}"
abcabcabc
后向引用:分组括号中的模式匹配到的内容会被正则表达式引擎记录于内部的变量中,这些变量的命名方式为: \1, \2, \3, ...
#可以匹配abcabc
[root@Rocky9 ~]# echo "abcabcabc" | grep -E "(abc)\1"
abcabcabc
13、文本处理三剑客之grep
文本搜索工具,根据用户指定的 “模式” 对目标文本逐行进行匹配检查;打印匹配到的行
-E #使用扩展的正则表达式
-e #实现多个选项之间or关系
-i #忽略大小写
-v #显示没有被匹配上的行,即取反
-w #匹配整个单词
-B #显示匹配到的字符串所在的行以及前N行
-A #显示匹配到的字符串所在的行以及后N行
-C #显示匹配到的字符串所在的行以及前后N行
m|--max-count=N #只匹配N行,是行,不是次数,一行可能匹配两个
-n|--line-number #显示匹配的行号
-o|--only-matching #仅显示匹配到的字符串
-r|--recursive #递归目录,但不处理软链接
-R|--dereference-recursive #递归目录,但处理软链接
-c|--count #统计匹配的行数,是行数,一行可以匹配一次到多次
#取包含/bin/bash的第一行
[zy@Rocky9 ~]$ grep -m 1 "/bin/bash" /etc/passwd
root:x:0:0:root:/root:/bin/bash
#取非空的行,^$取空行 -v取相反的行
[zy@Rocky9 ~]$ cat file.txt
hello world
hello python
hello java
[zy@Rocky9 ~]$ grep -v "^$" file.txt
hello world
hello python
hello java
#忽略大小写查找字符串
[zy@Rocky9 ~]$ grep -I root /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
#显示服务器有多少核
[zy@Rocky9 ~]$ cat /proc/cpuinfo | grep -Eic "processor"
4
#显示以#开头的行的数量
[zy@Rocky9 ~]$ grep -c "^#" /boot/vmlinuz-5.14.0-427.13.1.el9_4.x86_64
313
#输出年纪之和
[zy@Rocky9 ~]$ cat age.txt
xiaowang=24
xiaozhang=24
xiaolu=16
[zy@Rocky9 ~]$ cut -d "=" -f 2 age.txt | tr -t "\n" "+" | grep -Eo ".*[0-9]+" | bc
64
14、文本处理三剑客之sed
Sed是从文件或管道中读取一行,处理一行,输出一行;再读取一行,再处理一行,再输出一行,直到最后一行。
sed [OPTION]... {script-only-if-no-other-script} [input-file]...
-n|--quiet|--silent #不输出模式空间内容到屏幕,即不自动打印
-e script|--expression=script #多个script,or 的关系
-i[SUFFIX]|--in-place[=SUFFIX] #-i 直接修改文件,-i.bak 以.bak后缀备份原文件
-c|--copy #配合i一起使用,保留原文件
-E|-r|--regexp-extended #扩展正则表达式
注意配合模式
-ir #此组合不支持
-ri 支持
-i-r 支持
-ni 危险,会清空文件
地址格式:
空 #对全文进行处理
N #显示具体行号
$ #最后一行
/pattern/ #能被匹配到的每一行
M,N #第M行到第N行
M,+N #第M行到第M+N行 3,+4 表示从第3行到第7行
/pattern1/,/pattern2/ #从第一个匹配行开始,到第二个匹配行中间的行
M,/pattern/ #行号开始,匹配结束
/pattern/,N #匹配开始,行号结束
#步长
1~2 #奇数行
2~2 #偶数行
命令:
p #打印当前模式空间内容
Ip #忽略大小写输出
d #删除模式空间匹配的行
a [\]text #在指定行后面追加文本,支持使用\n实现多行追加
i [\]text #在行前面插入文本
c [\]text #替换行为单行或多行文本
w file #保存模式匹配的行至指定文件
r file #读取指定文件的文本至模式空间中匹配到的行后
#在结尾出添加一行内容
[zy@Rocky9 ~]$ cat age.txt
xiaowang=24
xiaozhang=24
xiaolu=16
[zy@Rocky9 ~]$ cat age.txt | sed '$a \hello world'
xiaowang=24
xiaozhang=24
xiaolu=16
hello world
查找替换:
s/parttern/replace/修饰符 #查找替换,支持其它分隔符
修饰符:
g #行内全局替换
p #显示替换成功的行
i #忽略大小写
后向引用:
\1 第一个分组
\2 第二个分组
& 所有搜索内容
[zy@Rocky9 ~]$ echo "abcabcabc" | sed -n 's/abc/xyz/p'
xyzabcabc
[zy@Rocky9 ~]$ echo "abcabcabc" | sed -n 's/abc/xyz/gp'
xyzxyzxyz
#后向引用
[zy@Rocky9 ~]$ echo "abcabcabc" | sed -En 's/(abc).*/\1hello/p'
abchello
#在bbb后面添加---符号
[zy@Rocky9 ~]$ sed '/bbb/a\---' test.txt
aaa
bbb
---
ccc
bbb
---
[zy@Rocky9 ~]$ cat test.txt
aaa
bbb
ccc
bbb
标签:10,--,每日,常用命令,zy,Linux,txt,root,Rocky9 From: https://blog.csdn.net/Ygnah_Z/article/details/142891294