linux Command
linux Command
1. 系统监控命令
1.1 top
top [param]
top -H -p pid,查看进程pid下面的子线程。
-b | 以处理模式操作 |
-c | 显示完整的命令行而不只是显示命令名。 |
-d | 屏幕刷新间隔时间。 |
-l | 忽略失效过程。 |
-s | 保密模式。 |
-S | 累积模式。 |
-u | 【用户名】 指定用户名。 |
-p | 【进程号】 指定进程。 |
-n | 【次数】 循环显示的次数。 |
-H | 查看进程下面的子线程 |
top命令分为上下两个部分:
- 系统统计信息
- row1:任务队列信息,同 uptime 命令的执行结果。
- row2:进程统计信息。
- row3:CPU统计信息
- row 4:内存状态
- row5:swap交换分区信息。
- 系统进程信息
- PID :进程id
- USER :进程所有者的用户名
- PR :进程优先级
- NI :nice值。负值表示高优先级,正值表示低优先级
- VIRT :进程使用的虚拟内存总量,单位kb。VIRT=SWAP+RES
- RES :进程使用的、未被换出的物理内存大小,单位kb。RES=CODE+DATA
- SHR :共享内存大小,单位kb
- S :进程状态。D=不可中断的睡眠状态 R=运行 S=睡眠 T=跟踪/停止 Z=僵尸进程
- %CPU :上次更新到现在的CPU时间占用百分比
- %MEM :进程使用的物理内存百分比
- TIME+ :进程使用的CPU时间总计,单位1/100秒
- COMMAND :进程名称[命令名/命令行]
1.2 free命令使用:内存
free [param]
[root@localhost ~]# free -h
total used free shared buff/cache available
Mem: 1.7Gi 416Mi 965Mi 6.0Mi 513Mi 1.3Gi
Swap: 0B 0B 0B
-b | 以BYte为单位显示内存使用情况。 |
-k | 以KB为单位显示内存使用情况。 |
-m | 以MB为单位显示内存使用情况。 |
-o | 不显示缓冲区调节列。 |
-s | 间隔秒数 持续观察内存使用情况。 |
-t | 显示内存总和列。 |
-v | 显示版本信息 |
Mem:表示物理内存统计。
Swap:表示硬盘上交换分区的使用情况。
total:表示物理内存总数(total=used+free)
used:表示系统分配给缓存使用的数量(这里的缓存包括buffer和cache)
free:表示未分配的物理内存总数。
shared:表示共享内存。
buffers:系统分配但未被使用的buffers数量。
cached:系统分配但未被使用的cache数量。
-/+ buffers/cache:表示物理内存的缓存统计
- (-buffers/cache) 内存数: (指的第一部分Mem行中的used – buffers – cached)
- (+buffers/cache) 内存数: (指的第一部分Mem行中的free + buffers + cached)
(-buffers/cache)表示真正使用的内存数, (+buffers/cache) 表示真正未使用的内存数
1.3 df命令的使用:磁盘
df命令用于显示磁盘分区上的可使用的磁盘空间。默认显示单位为KB。可以利用该命令来获取硬盘被占用了多少空间,目前还剩下多少空间等信息。
df(选项)(参数)
-a | -all,包含全部的文件系统。 |
-h | -human,以人类可读的方式来显示信息。 |
-H/si | 与-h参数相同,但在计算时是以1000 Bytes为换算单位而非1024 Bytes; |
-i | -inode,显示inode的信息; |
-k | -kilobytes,指定区块大小为1024字节; |
-l | -local,仅显示本地端的文件系统; |
-m | –megabytes,指定区块大小为1048576字节; |
-no | 在取得磁盘使用信息前,不要执行sync指令,此为预设值; |
-P | -portability,使用POSIX的输出格式; |
-sync | 在取得磁盘使用信息前,先执行sync指令; |
-t | <文件系统类型> 仅显示指定文件系统类型的磁盘信息; |
-T | 显示文件系统的类型 |
-x | <文件系统类型> 不要显示指定文件系统类型的磁盘信息; |
--help | 显示帮助。 |
-version | 显示版本信息。 |
常用指令为:
- df -a 查看全部的文件系统
- df -h查看磁盘使用情况
[root@localhost ~]# df -h
Filesystem Size Used Avail Use% Mounted on
devtmpfs 4.0M 0 4.0M 0% /dev
tmpfs 872M 0 872M 0% /dev/shm
tmpfs 349M 6.3M 343M 2% /run
/dev/mapper/rl-root 48G 4.3G 44G 9% /
/dev/sda2 960M 274M 687M 29% /boot
/dev/sda1 599M 7.1M 592M 2% /boot/efi
tmpfs 175M 0 175M 0% /run/user/0
- df -i 查看inode使用情况
1.4 ps查看进程统计信息
常用参数:
-a | 显示当前终端下的所有进程信息,包括其他用户的进程。 |
-u | 使用以用户为主的格式输出进程信息。 |
-x | 显示当前用户在所有终端下的进程。 |
-e | 显示系统内的所有进程信息。 |
-l | 使用长格式显示进程信息。 |
-f | 使用完整的(full)格式显示进程信息。 |
-T | 查看进程下面的子线程。 |
ps -a
ps -ef
ps -aux
结合管道操作和grep命令进行过滤,用于查询某一个进程的信息。
[root@localhost ~]# ps -ef | grep sshd
root 804 1 0 09:45 ? 00:00:00 sshd: /usr/sbin/sshd -D [listener] 0 of 10-100 startups
root 1598 804 0 09:45 ? 00:00:00 sshd: root [priv]
root 1600 1598 0 09:45 ? 00:00:00 sshd: root@pts/0
root 1914 1601 0 10:19 pts/0 00:00:00 grep --color=auto sshd
[root@localhost ~]# ps -aux | grep sshd
root 804 0.0 0.5 15860 9088 ? Ss 09:45 0:00 sshd: /usr/sbin/sshd -D [listener] 0 of 10-100 startups
root 1598 0.0 0.6 19212 11520 ? Ss 09:45 0:00 sshd: root [priv]
root 1600 0.0 0.3 19212 6728 ? S 09:45 0:00 sshd: root@pts/0
root 1924 0.0 0.1 6408 2176 pts/0 S+ 10:19 0:00 grep --color=auto sshd
1.5 crontab 命令
crontab 命令,用于定时程序的命令。
- -e : 执行文字编辑器来设定时程表,内定的文字编辑器是 VI,如果你想用别的文字编辑器则请先设定 VISUAL 环境变数来指定使用那个文字编辑器(比如说 setenv VISUAL joe)
- -r : 删除目前的时程表
- -l : 列出目前的时程表
1.6 查看端口的命令
1.6.1 netstat:查看监听的端口
netstat:是查看本机开放了哪些端口;本机开放的所有的端口。
yum install net-tools -y
netstat
[root@localhost ~]# netstat | grep tcp
tcp 0 0 master:44376 15.171.broad.ha.d:https TIME_WAIT
tcp 0 52 master:ssh 10.0.17.1:52989 ESTABLISHED
1.6.2 lsof:查看端口被占用情况
yum install lsof -y
# 查看哪个端口被哪个进程占用了
[root@localhost ~]# lsof -i:22
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
sshd 804 root 3u IPv4 23925 0t0 TCP *:ssh (LISTEN)
sshd 804 root 4u IPv6 23936 0t0 TCP *:ssh (LISTEN)
sshd 1598 root 4u IPv4 25392 0t0 TCP master:ssh->10.0.17.1:52989 (ESTABLISHED)
sshd 1600 root 4u IPv4 25392 0t0 TCP master:ssh->10.0.17.1:52989 (ESTABLISHED)
# 查看某个进程打开了哪些文件、加载库,依赖关系
[root@localhost ~]# lsof -p 818
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
container 818 root cwd DIR 253,0 267 128 /
container 818 root rtd DIR 253,0 267 128 /
container 818 root txt REG 253,0 54811040 67240790 /usr/bin/containerd
container 818 root mem-W REG 253,0 32768 46215 /var/lib/containerd/io.containerd.metadata.v1.bolt/meta.db
container 818 root mem REG 253,0 2592552 100663886 /usr/lib64/libc.so.6
container 818 root mem REG 253,0 70936 100663898 /usr/lib64/libresolv.so.2
container 818 root mem REG 253,0 858936 100663881 /usr/lib64/ld-linux-x86-64.so.2
container 818 root 0r CHR 1,3 0t0 4 /dev/null
container 818 root 1u unix 0xffff93648715d400 0t0 23912 type=STREAM (CONNECTED)
container 818 root 2u unix 0xffff93648715d400 0t0 23912 type=STREAM (CONNECTED)
container 818 root 3uW REG 253,0 32768 46215 /var/lib/containerd/io.containerd.metadata.v1.bolt/meta.db
container 818 root 4u a_inode 0,14 0 71 [eventpoll:5,7,8,9,10]
container 818 root 5r FIFO 0,13 0t0 23211 pipe
container 818 root 6w FIFO 0,13 0t0 23211 pipe
container 818 root 7u unix 0xffff93648715e800 0t0 24079 /run/containerd/containerd.sock.ttrpc type=STREAM (LISTEN)
container 818 root 8u unix 0xffff93648715cf00 0t0 24081 /run/containerd/containerd.sock type=STREAM (LISTEN)
container 818 root 9u unix 0xffff93648a0e5400 0t0 23449 /run/containerd/containerd.sock type=STREAM (CONNECTED)
container 818 root 10u unix 0xffff936485cd4a00 0t0 23451 /run/containerd/containerd.sock type=STREAM (CONNECTED)(LISTEN)
# 或者是哪个文件夹被哪个进程打开
[root@localhost ~]# lsof /root/
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
bash 1601 root cwd DIR 253,0 4096 67240070 /root
lsof 2293 root cwd DIR 253,0 4096 67240070 /root
lsof 2294 root cwd DIR 253,0 4096 67240070 /root
1.6.3 ss:显示更多更详细的有关 TCP 和连接状态的信息
ss 是 Socket Statistics 的缩写。ss 命令可以用来获取 socket 统计信息,它显示的内容和 netstat 类似。但 ss 的优势在于它能够显示更多更详细的有关 TCP 和连接状态的信息,而且比 netstat 更快。
ss | 输出所有建立的连接(不包含监听的端口),包括 tcp, udp, and unix |
ss -tnl | 查看主机监听的tcp端口信息 |
ss -tna | 查看监听的tcp连接 |
1.6.4 nc和nmap:扫描别人机器上开放了哪些端口
nc:扫描别人机器上开放了哪些端口
yum install nc -y
-z | Only scan for listening daemons, without sending any data to them. 查看端口号是否开发 |
[-w timeout] | 超时,等待时间 |
[root@localhost ~]# nc -l localhost 80
Ncat: bind to ::1:80: Address already in use. QUITTING.
nmap:探测一个机器或者整个局域网里机器开放了哪些端口。网络探测工具和安全/端口扫描器。速度比较慢
[root@localhost ~]# man nmap
[root@localhost ~]# nmap 10.0.17.100
Starting Nmap 7.92 ( https://nmap.org ) at 2024-09-13 10:54 CST
Nmap scan report for master (10.0.17.100)
Host is up (0.0000060s latency).
Not shown: 998 closed tcp ports (reset)
PORT STATE SERVICE
22/tcp open ssh
80/tcp open http
Nmap done: 1 IP address (1 host up) scanned in 0.15 seconds
1.6.7 查看系统资源使用情况
1.6.7.1 glances:监听系统CPU、内存、磁盘I/O等使用情况
基于Python开发,使用psutil库来从系统抓取信息的基于curses开发的跨平台的命令行系统监视工具。使用glances,我们可以监视CPU、平均负载、内存、网络流量,磁盘I/O,其他处理器和文件、系统的利用情况。
yum install epel-release -y
yum install glances -y
1.6.7.2 nethogs:查看某个进程消耗了多少流量(动态显示)
查看某个进程消耗了多少流量,知道哪些进程和外面进行通信。
yum install epel-release -y
yum install nethogs -y
2. 存储相关
2.1 基本分区
2.1.1 MBR
MBR支持最多四个主分区,或者三个主分区和一个扩展分区(包含多个逻辑分区)。MBR分区表的最大支持容量是2 TiB。
[root@localhost ~]# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS
sda 8:0 0 50G 0 disk
├─sda1 8:1 0 600M 0 part /boot/efi
├─sda2 8:2 0 1G 0 part /boot
└─sda3 8:3 0 48.4G 0 part
├─rl-root 253:0 0 47.4G 0 lvm /
└─rl-swap 253:1 0 1G 0 lvm
sr0 11:0 1 10.2G 0 rom
[root@localhost ~]#fdisk /dev/sdb # 进入磁盘
p # 查看分区信息
n # 新建分区
p # 创建主分区
w # 保存退出
# 分区后 刷新分区表
partprobe /dev/sdb
# 创建系统文件
mkfs.xfs /dev/sdb1
# 将 /dev/sdb1 挂载到 /data 目录
mount /dev/sdb1 /data
# 取消挂载
umount /data
# 查看
df -Th
fdisk /dev/sdb
d # 删除分区
w # 保存退出
2.1.2 GPT
yum install -y epel*
yum install -y gdisk
gdisk /dev/sdb # 进入磁盘
? # 查看帮助
o # 转化 GPT 格式分区表
w # 保存退出
# 转化后和退出时都要确定 输入 y
n # 新建分区
w # 保存退出
# 刷新分区表
partprobe /dev/sdb
# 将 /dev/sdb1 挂载到 /data 目录
mount /dev/sdb1 /data
# 取消挂载
mount /data
gdisk /dev/sdb
d # 删除分区
w # 保存退出
2.2 LVM
LVM可以让用户在无需停机的情况下可以方便地调整各个分区大小,即动态调整磁盘容量,从而提高磁盘管理的灵活性。
- PE(Physical Extend):物理区域
- PV 中可以用于分配的最小存储单元,可以在创建 PV 的时候制定(默认为 4MB),如 1M, 2M, 4M, 8M, 32M, 64M… 组成同⼀VG 中所有 PV 的 PE大小应该相同。
- PV(Physical Volume):物理卷
- 处于 LVM 最底层,可以是物理硬盘或者分区,整个硬盘,或使用fdisk 等⼯具建⽴的普通分区,包许多默认 4MB 大小的 PE(Physical Extent,基本单元)。
- VG(Volume Group):卷组
- 建立在 PV 之上,可以含有一个到多个 PV,一个或多个物理卷组合而成的整体。
- LV(Logical Volume):逻辑卷
- 建立在 VG 之上,相当于原来分区的概念,不过大小可以动态改变。从卷组中分割出的一块空间,用于建立文件系统。
LVM需要先分区磁盘,再创建 PV (物理卷),再创建 VG(卷组),再创建 pv(逻辑卷)
查看原来的磁盘大小
df -Th
2.2.1 LVM创建
1.分区
按照前面的方式进行分区,RBM分区后需要修改分区的 id 为 8e,之后再保存退出。 GPT分区不需要修改id,直接保存退出
MBR分区后不要保存退出,输入 t # 修改 分区id
输入 8e # lvm的id
w # 保存退出
2.创建 PV
#pvcreate /dev/磁盘分区名 /dev/磁盘分区名
pvcreate /dev/sdb1
# 查看 pv
pvs
3.创建VG
#vgcreate VG卷组名 /dev/磁盘分区名 /dev/磁盘分区名,如:
vgcreate vg1 /dev/sdb1
# 查看vg
vgs
4.创建 LV
#lvcreate -L 要给的容量 -n LV逻辑卷名 给容量的vg卷组名,如:
lvcreate -L 1T -n lv0 vg0
# 查看lv
lvs
5.创建新的文件系统
# xfs
mkfs.xfs /dev/vg0/lv0
#ext4
mkfs.ext4 /dev/vg0/lv0
6.挂载
mount /dev/vg0/lv0 /data
2.2.2 LVM扩容
原来的磁盘空间不够,扩容。按照上面的操作将新挂载的硬盘分区,制作为 pv,将新的 pv 扩到现有的vg 中,再通过 vg 对原来的 lv 进行扩容
假如新制作的 pv 为sdc1,对 vg0 进行扩容
vg扩容
# vgextend vg名 /dev/磁盘分区名
vgextend vg0 /dev/sdc1
lv扩容
#lvcreate -L 要给的容量 /dev/卷组/逻辑卷
# 扩容为100G
lvextend -L +100G /dev/vg0/lv0
# 将所有的空闲空间扩到 lv0 中
lvextend -l +100%FREE /dev/vg0/lv0
在线扩展已存在的文件系统
#xfs
xfs_growfs /dev/vg0/lv0
# ext4
resize2fs /dev/vg0/lv0
查看扩容情况
df -Th
# 和扩容之前对比
2.3 开机自动挂载磁盘
vim /etc/fstab
添加
/dev/vg0/lv0 /data xfs defaults 0 # xfs 类型
/dev/vg0/lv0 /data ext4 defaults 0 # ext4 类型
3.搜索相关
3.1 find命令
find [-H] [-L] [-P] [-D debugopts] [-Olevel] [starting-point...] [expression]
- 1)参数 [-P] 表示是默认行为,当find检查或打印信息时,对于软链接文件,所使用的信息应取自软链接文件本身。
- 2)与参数 [-P] 对应的是参数 [-L] ,加入 [-P] 参数后,当find检查或打印有关文件的信息时,使用的信息取自链接指向的文件的属性,而非链接本身。
- 3)参数 [H] 表示当命令行指定的参数为一符号链接时,解析该链接。检查打印等其余情况都不进行符号解析。
- 4)参数 [-D debugopts] 是关于Debug信息的,与平时使用关系不大,基本可以忽略。
- 5) [-Olevel] 参数表示对find的优化等级。同样在平时使用中不常用。
3.1.1 find -name
-name 实现 find 命令的按名字查找。
一个简单的例子是寻找示例文件 file1
[root@localhost ~]# find / -name passwd
/etc/pam.d/passwd
/etc/passwd
/usr/bin/passwd
/usr/share/licenses/passwd
/usr/share/doc/passwd
/data/docker/overlay2/0accca66be5ef9c1030035f1893211a28b9f6fa812b00591c87e3b6bed6749b0/diff/etc/passwd
# *号通配符 星号通配符可以取代任何字符串,包括空串。
[root@localhost ~]# find /var/log/nginx/ -name "*.log"
/var/log/nginx/error.log
/var/log/nginx/access.log
# 问号?问号用于取代单个字符。
[root@localhost ~]# find /var/log/ -name "?ginx"
/var/log/nginx
# 左右括号[] 左右括号用于取代[]括出来集合中的单个字符
[root@localhost ~]# find /var/log/nginx/ -name "*.l[a-z]g"
/var/log/nginx/error.log
/var/log/nginx/access.log
# 根据权限查找 执行x=1 写w=2 读r=4
[root@localhost ~]# find ~ -perm 755
/root/cri-dockerd
/root/cri-dockerd/cri-dockerd
/root/calico
/root/calico/calico-images
# find按文件大小查找 -size
[root@localhost ~]# find . -size 25c
./cri-dockerd
find . -size +8c # 搜索文件大小大于8字节的文件
find . -size -8c # 搜索文件大小小于8字节的文件
`b' for 512-byte blocks (this is the default if no suffix is used)
`c' for bytes
`w' for two-byte words
`k' for kibibytes (KiB, units of 1024 bytes)
`M' for mebibytes (MiB, units of 1024 * 1024 = 1048576 bytes)
`G' for gibibytes (GiB, units of 1024 * 1024 * 1024 = 1073741824 bytes)
# find按文件类型查找 -type
-type c
File is of type c:
b block (buffered) special
c character (unbuffered) special
d directory
p named pipe (FIFO)
f regular file
l symbolic link; this is never true if the -L optithe -follow op‐
tion is in effect, unless the symbolic link is broken. If you want
to search for symbolic links when -L is in effect, use -xtype.
s socket
D door (Solaris)
# find按时间查找
$ find . -amin n //查找n分钟以前被访问过的所有文件
$ find . -atime n //查找n天以前被访问过的所有文件
$ find . -mmin +n //查找n分钟以前被修改过的所有文件
$ find . -mmin -n //查找n分钟之内被修改过的所有文件
# find命令的集合运算
$ find . -type f -o -type d //查找普通文件和目录文件
$ find . ! -type f //查找非目录文件
$ find . -name "*html" -a -size +100b //查找后缀名为html且大于100字节的文件
3.2 sort 排序
在 Linux 系统中,sort 命令用于对文件内容进行排序。sort 命令可以按照字典顺序、数字顺序等多种方式进行排序,并且可以处理多个文件
[root@localhost ~]# sort /etc/passwd
adm:x:3:4:adm:/var/adm:/sbin/nologin
bin:x:1:1:bin:/bin:/sbin/nologin
chrony:x:996:994:chrony system user:/var/lib/chrony:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
dbus:x:81:81:System message bus:/:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
halt:x:7:0:halt:/sbin:/sbin/halt
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
nginx:x:995:991:Nginx web server:/var/lib/nginx:/sbin/nologin
nobody:x:65534:65534:Kernel Overflow User:/:/sbin/nologin
noz:x:1000:1000:noz:/home/noz:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
polkitd:x:998:996:User for polkitd:/:/sbin/nologin
root:x:0:0:root:/root:/bin/bash
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
sshd:x:74:74:Privilege-separated SSH:/usr/share/empty.sshd:/usr/sbin/nologin
sssd:x:997:995:User for sssd:/:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
systemd-coredump:x:999:997:systemd Core Dumper:/:/sbin/nologin
tss:x:59:59:Account used for TPM access:/:/usr/sbin/nologin
# sort -rn -n按照数字排序 -r倒序
[root@localhost ~]# awk -F ":" '{print $3}' /etc/passwd |sort -rn
65534
1000
999
998
997
996
995
......
参数
-n | 使用 -n 选项可以按数字顺序进行排序 |
-k | 使用 -k 2 选项可以按照文件中的某一列进行排序 |
-r | 使用 -r 选项可以进行逆序排序 |
-u | 使用 -u 选项可以去除重复的行 |
-f | 忽略大小写 |
-b | 忽略前导空格 |
-M | 按月份排序 |
-o | 将排序结果直接输出到原文件 |
3.3 which 显示某个命令的绝对路径
which 命令在 Linux 系统中用于显示某个命令的绝对路径。它可以帮助用户了解某个命令的具体位置,特别是在多个版本或路径下可能存在同名命令时。
which ssh
[root@localhost ~]# which ssh
/usr/bin/ssh
[root@localhost ~]# which ls mv rm
alias ls='ls --color=auto'
/usr/bin/ls
alias mv='mv -i'
/usr/bin/mv
alias rm='rm -i'
/usr/bin/rm
# -a 显示所有匹配的路径,而不仅仅是第一个
[root@localhost ~]# which -a nginx
/usr/sbin/nginx
3.4 uniq 去除文件中的重复行
uniq 命令在 Linux 系统中用于去除文件中的重复行。它通常与 sort 命令结合使用,因为 uniq 命令只能去除相邻的重复行。
-d | uniq 命令的 -d 选项用于只显示重复的行 |
-u | uniq 命令的 -u 选项用于只显示唯一的行 |
-c | uniq 命令的 -c 选项用于在每行前显示该行出现的次数 |
3.5 组合
统计主机主机每个ip tcp连接数并从大到小排序
[root@master ~]# ss -t | awk '{print $4}' | grep ^[0-9] | awk -F ":" '{print $1}' | sort |uniq -c | sort -k1 -rn
196 127.0.0.1
22 10.0.17.100
2 10.3.169.208
4. 文本处理 正则 grep sed awk
文本匹配 | 正则 |
grep | 过滤文本 |
sed | 修改文本 |
awk | 处理文本 |
4.1 正则表达式
4.4.1 基础正则表达式常见元字符
表示匹配字符串末尾的位置,匹配行尾,例: word$、 #$ ;^$表示空行字符 | 作用 |
\ | 转义字符,可以把一些特殊的符号转换成普通的符号字符,还可以把一些普通字符转换成特殊功能,例:\!、\n、\$等 |
^ | 表示匹配字符串开始的位置,匹配行首,例: ^a、 ^# |
$ | |
. | 匹配除\n之外的任意的一个字符,例: go.d、g..d |
* | 匹配前面子表达式0次或者多次,例: goo*d、go.*d |
.* | 表示任意长度的任一字符 |
[my] | 表示匹配[ ]中包含的任一字符 |
[^my] | 表示匹配除[ ]中包含的任一字符 |
\{n\} | 匹配前面的子表达式n次,例:mo\{2\}y、'[0-9]\{ 2\ }'匹配两位及两位以上数字 |
\{n,\} | 匹配前面的子表达式不少于n次,例: mo\{2,\}y、'[0-9]\{2,\}'匹配两位及两位以上数字 |
\{n,m\} | 匹配前面的子表达式n到m次(m>=n),例: mo\{2,3\}y、'[0-9]\{2,3\}'匹配两位到三位数字 |
\w | 匹配包括下划线的任何单词字符 |
\W | 匹配任何非单词字符。等价于"[^A-Za-z0-9_]"。 |
\d | 匹配一个数字字符 |
\D | 匹配一个非数字字符。等价于[^0-9]。 |
\s | 空白符 |
\S | 非空白符 |
4.4.2 扩展正则表达式元字符
(支持的工具: egrep、awk、grep -E、sed -r)
+ | 表示匹配前面的子表达式1次以上 |
? | 表示匹配前面的子表达式0或者1次 |
() | 将括号里的内容看成一个整体 |
| | 以或的方式匹配字符串 |
4.2 grep
4.2.1 选项
-a --text # 不要忽略二进制数据。
-A <显示行数> --after-context=<显示行数> # 除了显示符合范本样式的那一行之外,并显示该行之后的内容。
-b --byte-offset # 在显示符合范本样式的那一行之外,并显示该行之前的内容。
-B<显示行数> --before-context=<显示行数> # 除了显示符合样式的那一行之外,并显示该行之前的内容。
-c --count # 计算符合范本样式的列数。
-C<显示行数> --context=<显示行数>或-<显示行数> # 除了显示符合范本样式的那一列之外,并显示该列之前后的内容。
-d<进行动作> --directories=<动作> # 当指定要查找的是目录而非文件时,必须使用这项参数,否则grep命令将回报信息并停止动作。
-e<范本样式> --regexp=<范本样式> # 指定字符串作为查找文件内容的范本样式。
-E --extended-regexp # 将范本样式为延伸的普通表示法来使用,意味着使用能使用扩展正则表达式。
-f<范本文件> --file=<规则文件> # 指定范本文件,其内容有一个或多个范本样式,让grep查找符合范本条件的文件内容,格式为每一列的范本样式。
-F --fixed-regexp # 将范本样式视为固定字符串的列表。
-G --basic-regexp # 将范本样式视为普通的表示法来使用。
-h --no-filename # 在显示符合范本样式的那一列之前,不标示该列所属的文件名称。
-H --with-filename # 在显示符合范本样式的那一列之前,标示该列的文件名称。
-i --ignore-case # 忽略字符大小写的差别。
-l --file-with-matches # 列出文件内容符合指定的范本样式的文件名称。
-L --files-without-match # 列出文件内容不符合指定的范本样式的文件名称。
-n --line-number # 在显示符合范本样式的那一列之前,标示出该列的编号。
-P --perl-regexp # PATTERN 是一个 Perl 正则表达式
-q --quiet或--silent # 不显示任何信息。
-R/-r --recursive # 此参数的效果和指定“-d recurse”参数相同。
-s --no-messages # 不显示错误信息。
-v --revert-match # 反转查找。
-V --version # 显示版本信息。
-w --word-regexp # 只显示全字符合的列。
-x --line-regexp # 只显示全列符合的列。
-y # 此参数效果跟“-i”相同。
-o # 只输出文件中匹配到的部分。
-m <num> --max-count=<num> # 找到num行结果后停止查找,用来限制匹配行
4.2.2 规则表达式
^ # 锚定行的开始 如:'^grep'匹配所有以grep开头的行。
$ # 锚定行的结束 如:'grep$' 匹配所有以grep结尾的行。
. # 匹配一个非换行符的字符 如:'gr.p'匹配gr后接一个任意字符,然后是p。
* # 匹配零个或多个先前字符 如:'*grep'匹配所有一个或多个空格后紧跟grep的行。
.* # 一起用代表任意字符。
[] # 匹配一个指定范围内的字符,如'[Gg]rep'匹配Grep和grep。
[^] # 匹配一个不在指定范围内的字符,如:'[^A-FH-Z]rep'匹配不包含A-R和T-Z的一个字母开头,紧跟rep的行。
(..) # 标记匹配字符,如'(love)',love被标记为1。
< # 锚定单词的开始,如:'<grep'匹配包含以grep开头的单词的行。
> # 锚定单词的结束,如'grep>'匹配包含以grep结尾的单词的行。
x{m} # 重复字符x,m次,如:'0{5}'匹配包含5个o的行。
x{m,} # 重复字符x,至少m次,如:'o{5,}'匹配至少有5个o的行。
x{m,n} # 重复字符x,至少m次,不多于n次,如:'o{5,10}'匹配5--10个o的行。
\w # 匹配文字和数字字符,也就是[A-Za-z0-9],如:'G\w*p'匹配以G后跟零个或多个文字或数字字符,然后是p。
\W # \w的反置形式,匹配一个或多个非单词字符,如点号句号等。
\b # 单词锁定符,如: '\bgrep\b'只匹配grep。
4.2.3 grep命令常见用法
在文件中搜索一个单词,命令会返回一个包含 “match_pattern” 的文本行:
grep match_pattern file_name
grep "match_pattern" file_name
grep "match_pattern" file_1 file_2 file_3 ...
输出除之外的所有行 -v 选项:
grep -v "match_pattern" file_name
[root@localhost ~]# grep root /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
使用正则表达式 -P选项 :
-E 拓展正则表达式
grep -E "[1-9]+"
# 或
egrep "[1-9]+"
输出包含匹配字符串的行数 -n 选项:
[root@localhost ~]# grep "root" -n /etc/passwd
1:root:x:0:0:root:/root:/bin/bash
10:operator:x:11:0:operator:/root:/sbin/nologin
grep递归搜索文件 -r -d
在多级目录中对文本进行递归搜索:
[root@localhost ~]# grep -r "error" /var/log/
忽略匹配样式中的字符大小写 -i:
echo "hello world" | grep -i "HELLO"
# hello
选项 -e 制动多个匹配样式:
echo this is a text line | grep -e "is" -e "line" -o
is
is
line
#也可以使用 **-f** 选项来匹配多个样式,在样式文件中逐行写出需要匹配的字符。
cat patfile
aaa
bbb
echo aaa bbb ccc ddd eee | grep -f patfile -o
在grep搜索结果中包括或者排除指定文件:
# 只在目录中所有的.php和.html文件中递归搜索字符"main()"
grep "main()" . -r --include *.{php,html}
# 在搜索结果中排除所有README文件
grep "main()" . -r --exclude "README"
# 在搜索结果中排除filelist文件列表里的文件
grep "main()" . -r --exclude-from filelist
4.3 sed
sed 命令是一个面向行处理的工具,它以“行”为处理单位,针对每一行进行处理,处理后的结果会输出到标准输出(STDOUT)。你会发现 sed 命令是很懂礼貌的一个命令,它不会对读取的文件做任何贸然的修改(除非加上-i选项),而是将内容都输出到标准输出中。
4.3.1 sed语法
sed命令的语法:sed command file
- command 部分:针对每行的内容所要进行的处理(这部分很重要很重要)。
- file 部分:要处理的文件,如果忽略 file 参数,则 sed 会把标准输入作为处理对象。
4.3.2 sed命令及参数
sed命令的选项与参数:
-n : 使用静默模式,在一般的sed的用法中,所有来自stdin(标准输出)的数据一般都会被列出到屏幕上。
但如果加上-n参数后,则只要经过sed特殊处理的那行才会被列出来。
-e : 直接在命令行模式上进行sed的操作编辑
-f : 直接将sed的操作写在一个文件内,-f filename则可以执行filename内的sed操作
-r : 使用扩展正则表达式的语法
-i : 直接修改文件内容,而不是输出到屏幕上
command说明:[n1][,n2] action
n1,n2 : 一般代表【选择进行操作(action)的行数】,举例:如果我的操作是需要在5行到20行之间进行的,则【5,20[action]】。
action的参数:
单行模式空间
a : 新增。a的后面接字符,而这些字符会在新增到下一行
i : 插入。i的后面接字符,而这些字符会在新增到上一行
c : 替换。c的后面接字符,这些字符替换n1到n2的行
d : 删除。因为是删除,所以d后面通常不接任何东西
p : 打印。将匹配的数据打印出来。通常p会与选项-n一起使用
s : 替换。将文件原内容替换为新内容。举例:s/lod/new/g
n : 读取匹配的数据的下一行,覆盖模型空间的前一行(也就是被匹配的行),结果交给下一个参数处理
多行模式空间
N : 读取匹配的数据的下一行追加到模式空间,同时将两行看做一行,但是两行之间依然含有\n换行符
P : 打印。打印模式空间开端至\n(换行)之间的内容,并追加到默认输出之前。
D : 如果模式空间包含换行符,则删除模式空间开端至\n(换行)之间的内容, 并不会读取新的输入行,而使用合成的模式空间重新启动循环。如果模式空间不包含换行符,则会像发出d命令那样启动正常的新循环
替换标记
g 表示行内全面替换。
p 表示打印行。
w 表示把行写入一个文件。
x 表示互换模板块中的文本和缓冲区中的文本。
y 表示把一个字符翻译为另外的字符(但是不用于正则表达式)
\\1 子串匹配标记
& 已匹配字符串标记
其它
! 表示后面的命令对所有没有被选定的行发生作用。
= 打印当前行号码。
# 把注释扩展到下一个换行符以前。
4.3.3 sed的工作原理与流程
工作原理
sed 命令是面向“行”进行处理的,每一次处理一行内容。处理时,sed 会把要处理的行存储在缓冲区中,接着用 sed 命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下一行,这样不断重复,直到文件末尾。这个缓冲区被称为“模式空间”(pattern space)。在这个处理过程中,sed 命令并不会对文件本身进行任何更改。
工作流程:
主要包括读取、执行和显示三个过程。
- 读取:sed 从输入流(文件、管道、标准输入)中读取一行内容并存储到临时的缓冲区中(又称模式空间,pattern space)。
- 执行:默认情况下,所有的 sed 命令都在模式空间中顺序地执行,除非指定了行的地址,否则 sed 命令将会在所有的行上依次执行。
- 显示:发送修改后的内容到输出流。在发送数据后,模式空间将会被清空。在所有的文件内容都被处理完成之前,上述过程将重复执行,直至所有内容被处理完。
模式空间与保持空间
-
模式空间(pattern space):
- sed处理文本内容行的一个临时缓冲区,模式空间中的内容会主动打印到标准输出,并自动清空模式空间
-
保持空间(hold space):
- sed处理文本内容行的另一个临时缓冲区,不同的是保持空间内容不会主动清空,也不会主动打印到标准输出,而是需要sed命令来进行处理
模式空间与保持空间的关系:
- 模式空间:
- 相当于流水线,文本行在模式空间中进行处理;
- 保持空间:
- 相当于仓库,在模式空间对数据进行处理时,可以把数据临时存储到保持空间;作为模式空间的一个辅助临时缓冲区,但又是相互独立,可以进行交互,命令可以寻址模式空间但是不能寻址保持空间。可以使用高级命令h,H,g,G与模式空间进行交互。
模式空间与保持空间进行交互:
d : 删除模式空间的内容,开始下一个循环
D : 删除模式空间/n(换行符)前面的内容
h : 【复制】模式空间的内容至保持空间(会覆盖保持空间的原内容)
H : 把模式空间的内容【追加】至保持空间
g : 【复制】保持空间的内容至模式空间(会覆盖模式空间的原内容)
G : 把保持空间的内容【追加】至模式空间
x : 【交换】模式空间与保持空间的内容
4.3.4 命令example
#使用sed命令对该文件进行演示
[root@localhost ~]# cat passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
=======================================
#用a参数在第一行的下面插入test
[root@localhost ~]# sed '1atest' passwd
root:x:0:0:root:/root:/bin/bash
test
bin:x:1:1:bin:/bin:/sbin/nologin
#用i参数在第二行的上面插入hello
[root@localhost ~]# sed '2ihello' passwd
root:x:0:0:root:/root:/bin/bash
hello
bin:x:1:1:bin:/bin:/sbin/nologin
#用c参数把第二行替换为hello
[root@localhost ~]# sed '2chello' passwd
root:x:0:0:root:/root:/bin/bash
hello
#用d参数删除匹配到‘root’的行
[root@localhost ~]# sed '/root/d' passwd
bin:x:1:1:bin:/bin:/sbin/nologin
#单独用s参数替换文件内容只会替换该行匹配到的第一个
[root@localhost ~]# sed 's/root/tom/' passwd
tom:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
#s和g搭配使用可达到替换全部匹配到的效果
[root@localhost ~]# sed 's/root/tom/g' passwd
tom:x:0:0:tom:/tom:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
#单独使用p参数可以看到不仅打印出匹配‘root’的行,还把原本内容 \
#一起显示出来了,这是因为sed的特性,文章开头的一段话就说明了。
[root@localhost ~]# sed '/root/p' passwd
root:x:0:0:root:/root:/bin/bash
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
#通常p参数会搭配-n选项一起使用,-n是静默模式
[root@localhost ~]# sed -n '/root/p' passwd
root:x:0:0:root:/root:/bin/bash
#使用y参数进行大小写转换
[root@localhost ~]# sed 'y/abdef/ABDEF/' test
A FriEnD is somEonE
with whom you
DArE to BE yoursElF.
[root@localhost ~]# sed 'y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/' test
A FRIEND IS SOMEONE
WITH WHOM YOU
DARE TO BE YOURSELF.
#用n参数读取当前行(匹配到的行)的下一行至模式空间,n参数会覆盖模式空间的 \
#前一行(也就是含有'root'的行)。此时模式空间只有‘下一行’,后面的d参数会 \
#删除模式空间的内容,所以sed会打印出含有root的行
[root@localhost ~]# sed '/root/n;d' passwd
root:x:0:0:root:/root:/bin/bash
#在前面看到的都是单行模式。每次sed处理一个行。
#但是sed是允许一次处理多行的。加上N参数追加进模式空间,此时\
#sed将两行看做一行,这就是所谓的多行模式空间。
#以下几行是用于sed对多行模式空间进行操作练习的文件内容
[root@localhost ~]# cat test
A friend is someone
with whom you
dare to be yourself.
#可以发现使用N参数没有内容被打印出来,是因为N参数读取当前行的下一行至模式空间时\
#并不会覆盖模式空间的上一行,此时模式空间‘当前行’与‘下一行’都存在,后面的d参数会\
#模式空间的内容,所有没有内容被打印出来
[root@localhost ~]# sed '/root/N;d' passwd
[root@localhost ~]#
#使用N参数追加匹配到的行至模式空间,然后使用s参数进行替换,由于使用N参数,原本\
#内容的两行此时在模式空间里被当作一行进行处理,把\n替换为空格后,由于中间没有了\
#换行符,打印到屏幕上时会显示为一行
[root@localhost ~]# sed '/A/{N;s/someone\n/someone /}' test
A friend is someone with whom you
dare to be yourself.
#对上条命令做了一点小小的修改。先说说这条命令要达成什么效果吧“把第二行的with挪到第一行”\
#这里的思路其实就是把换行符变动了位置,达到了把第二行的开头挪到第一行的结尾的效果
[root@localhost ~]# sed '/A/{N;s/someone\nwith /someone with\n/}' test
A friend is someone with
whom you
dare to be yourself.
#咦?这里原本的第二行怎么不见了呢!来分析一下。首先把匹配的行读入模式空间,后面的N参数\
#又把下一行追加至模式空间,此时模式空间有两行内容,但被看作一行,但这一行中间有\n,\
#P参数只打印模式空间开头到\n之间的内容,也就是说\n之后的内容不会被打印出来
[root@localhost ~]# sed -n '/A/N;P' test
A friend is someone
dare to be yourself.
#D参数使用下面的文本作讲解
[root@localhost ~]# cat sed_D
This is 1
This is 2
This is 3
This is 4
This is 5
#读取1,执行N,得出1\n2,执行D,得出2
#执行N,得出2\n3,执行D,得出3
#依此类推,得出5,执行N,条件失败退出,因无-n参数,故输出5
[root@localhost ~]# sed 'N;D' sed_D
This is 5
#模式空间与保持的交互
#以下几行用作下面练习的文件内容
[root@localhost ~]# cat test
A friend is someone
with whom you
dare to be yourself.
#先匹配含有w的行,N参数把下一行也追加至模式空间,此时有模式有两行内容\
#h参数把模式空间的内容复制到保持空间,之后d参数删除模式空间的内容\
[root@localhost ~]# sed '/w/{N;h;d}' test
A friend is someone
#
[root@localhost ~]# sed '/w/{N;h;d};/A/{N;s#is#the#g;G}' test
A friend the someone
with whom you
dare to be yourself.
4.4 awk
4.4.1 语法格式
awk 选项 '模式或条件 {操作}' 文件1 文件2
awk -f 脚本文件 文件1 文件2
4.4.2 awk常用的内建变量
FS:列分隔符。指定每行文本的字段分隔符,默认为空格或制表位,与“ -F ”作用相同
OFS:输出分隔符。指定输出字段间的分隔符。
RS:行分隔符。awk从文件读取资料时,将根据RS的定义把资料切割为多条记录,awk一次仅读取一条记录,以进行处理,预设值为 \n (换行符)
NF:当前处理行的字段个数
NR:当前处理行的行号
FNR:awk当前读取的记录数,其变量值小于等于NR(比如当读取第二个文件时,FNR是从0开始重新计数,而NR不会)。
NR==FNR:用于在读取两个或两个以上的文件时,判断是不是在读取第一个文件
$0:当前处理行的整行内容
$n:当前处理行的第 n 个字段(第 n 列)
FILENAME:被处理的文件名
$0:代表当前行(相当于匹配所有)
awk -F: '{print $0, "---"}' /etc/passwd
$n:代表第n列
# 案例1:(以:为分隔符)
awk -F: '{print $1}' /etc/passwd
# 案例2:(默认空格为分隔符)
awk '{print $1}' /etc/passwd
NF:记录当前统计总字段数
#案例1:(以:为分隔符 统计文件内每行内的行数)
awk -F: '{print NF}' /etc/passwd
#案例2:(以:为分隔符 统计文件内每行总字段 并打印每行统计行数)
awk -F: '{print $NF}' /etc/passwd
NR:用来记录行号
#案例1:
awk -F: '{print NR}' /etc/passwd
FS:指定文本内容分隔符(默认是空格)
#案例1:
awk 'BEGIN{FS=":"}{print $NF, $1}' /etc/passwd
#解析:
#BEGIN{FS=":"}:相当于指定以 : 为分隔符
# $NF :存储以 : 分隔符的最后一列
# $1 :存储以 : 分隔符的第一列
# print :打印
OFS:指定打印分隔符(默认空格)
# 案例1:(输出的意思 分隔符会打印出来)
awk -F: 'BEGIN{OFS=" >>> "}{print $NF, $1}' /etc/passwd
#FS 的优先级要高于 -F
#解析:
# BEGIN{OFS=" >>> "} : 指定打印分隔符
# $NF : 存储以 >>> 分隔符的最后一列
# $1 : 存储以 >>> 分隔符的第一列
# print : 打印
4.4.3 输出指定字段
# -F 指定分隔符;$1 所在行以分隔符分隔的第一个字段
awk -F ":" '{print $1}' passwd
root
daemon
adm
y
named
lisi
apache
dhcpd
# $NF 表示所在行最后一个字段,NR 表示当前行的行号
awk -F ":" '{print NR,$NF }' passwd
1 /bin/bash
2 /sbin/nologin
3 /sbin/nologin
4 /bin/bash
5 /sbin/nologin
6 /bin/bash
7 /sbin/nologin
8 /sbin/nologin
4.4.4 输出结果指定分隔符
#输出第1和第3个字段,输出结果默认以 空格 分隔
awk -F ":" '{print $1,$3 }' passwd
root 0
daemon 2
adm 3
y 1000
named 25
lisi 1001
apache 48
dhcpd 177
awk -F ":" '{print $1","$3 }' passwd
root,0
daemon,2
adm,3
y,1000
named,25
lisi,1001
apache,48
dhcpd,177
awk -F ":" '{print $1"=="$3 }' passwd
root==0
daemon==2
adm==3
y==1000
named==25
lisi==1001
apache==48
dhcpd==177
4.4.5 OFS指定输出结果分隔符
echo 'A B C D' | awk '{OFS=":";print $0}'
A B C D
# $1=$1 用来激活$0的重新赋值,通常是在改变OFS后而需要输出$0时这样做
echo 'A B C D' | awk '{OFS=":";$1=$1;print $0}'
A:B:C:D
4.4.6 输出匹配字段的行内容
cat passwd
root:x:0:0:root:/root:/bin/bash
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
y:x:1000:1000:y:/home/y:/bin/bash
named:x:25:25:Named:/var/named:/sbin/nologin
lisi:x:1001:1001::/home/lisi:/bin/bash
apache:x:48:48:Apache:/usr/share/httpd:/sbin/nologin
dhcpd:x:177:177:DHCP server:/:/sbin/nologin
#输出第3字段大于50的行的第1和第3字段
awk -F ":" '$3>50{print $1,$3}' passwd
y 1000
lisi 1001
dhcpd 177
#输出第7字段中包含/bash的行内容
awk -F ":" '$7~"/bash"{print $0}' passwd
root:x:0:0:root:/root:/bin/bash
y:x:1000:1000:y:/home/y:/bin/bash
lisi:x:1001:1001::/home/lisi:/bin/bash
4.4.7 三元运算符
条件表达式?值1:值2
若条件表达式成立,则取值1;反之,取值2。
awk -F ":" '{print $3,$4}' passwd
0 0
2 2
3 4
1000 1000
25 25
1001 1001
48 48
177 177
#三元运算符,如果第3个字段的值大于等于第4个字段的值,则把第3个字段的值赋给max,
#否则第4个字段的值赋给max
awk -F ":" '{max=($3>=$4)?$3:$4;{print max}}' passwd
0
2
4
1000
25
1001
48
177
4.4.8 通过管道符、双引号调用shell命令
4.4.8.1 统计行数
awk -F ":" '/bash$/{print}' passwd
root:x:0:0:root:/root:/bin/bash
y:x:1000:1000:y:/home/y:/bin/bash
lisi:x:1001:1001::/home/lisi:/bin/bash
#调用 wc -l 统计使用bash的行数
awk -F ":" '/bash$/{print|"wc -l"}' passwd
3
4.4.8.2 查看当前内存使用百分比
#查看当前内存使用百分比
free -m | awk '/Mem:/{print int($3/($3+$4)*100)"%"}'
87%
4.4.8.3 查看当前cpu空闲率
# -b -n 1 表示只需要1次输出结果
top -b -n 1 | grep Cpu
%Cpu(s): 2.9 us, 2.9 sy, 0.0 ni, 96.9 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0
#输出cpu空闲率的字段
top -b -n 1 | grep Cpu | awk -F "," '{print $4}'
96.9 id
#输出Cpu空闲率
top -b -n 1 | grep Cpu | awk -F "," '{print $4}' | awk '{print$1}'
96.9
4.4.8.4 显示系统上次重启时间
#显示字符串所指的日期与时间。字符串前后必须加上双引号
date -d
#注意 :+ 和格式之间没有空格
date +“%Y-%m-%d”
常用格式:
%F:完整日期格式,等价于%Y-%m-%d
%Y:年份
%m:月份
%d:按月计的日期
%T:时间,等于%H:%M:%S
%H:小时,24小时制(00~23)
%M:分钟
%S:秒
#查看当前时间
date
2023年 05月 15日 星期一 16:24:53 CST
#显示当月的第一天
date +"%Y%m01"
20230501
#显示一天前
date -d "1 day ago" +%F
2023-05-14
#显示当月的倒数第三天,1 month 表示下个月的今天,-3 day 表示三天前
date -d "$(date -d "1 month" +"%Y%m01")-3 day" +"%Y%m%d"
20230529
#查看上次系统重启时间
#/proc/uptime 第一列输出的是,系统启动到现在的时间(以秒为单位);
#第二列输出的是,系统空闲的时间(以秒为单位)
date -d "$(awk -F "." '{print $1}' /proc/uptime) second ago" +"%F %H:%M:%S"
2023-05-11 02:15:22
4.4.8.5 getline的使用
当getline左右无重定向符"<“或”|“时,awk首先读取到了第一行,就是1,然后getline,就得到了1下面的行,就是2,因为getline之后,awk会改变对应的NF,NR,FNR和$0等内部变量,所以此时的$0的值就不再是1,而是2了,即隔行输出。然后将它打印出来。
当getline左右有重定向符”<“或”|"时,getline则作用于定向输入文件,由于该文件是刚打开,并没有被awk读入一行,只是getline读入,那么getline返回的是该文件的第一行,而不是隔行。
#当有重定向符号或 “|” 时,只会输出第1行
awk 'BEGIN {"cat a.txt" |getline; {print }}'
one
#当有重定向符号或 “|” 时,输出奇数行
cat a.txt | awk '{print $0;getline}'
one
three
five
seven
nine
eleven
#输出偶数行
cat a.txt | awk '{getline;print $0}'
two
four
six
eight
ten
twelve
4.4.8.6 BEGIN,END模式
BEGIN模式:在处理指定文本之前,需要先执行BEGIN模式中的指定的操作。
END模式:在处理指定文本结束后,需要执行END模式中的指定操作
awk '/e$/{print $0}' a.txt
one
three
five
nine
twelve
#统计以 e 结尾的行
awk 'BEGIN{x=0}; /e$/{x++};END{print x}' a.txt
5
#先处理完BEGIN的内容,再打印文本里面的内容
awk 'BEGIN{FS=":"};{if($3>=20){print}}' passwd
y:x:1000:1000:y:/home/y:/bin/bash
named:x:25:25:Named:/var/named:/sbin/nologin
lisi:x:1001:1001::/home/lisi:/bin/bash
apache:x:48:48:Apache:/usr/share/httpd:/sbin/nologin
dhcpd:x:177:177:DHCP server:/:/sbin/nologin
#统计以冒号分隔的文本段落数,END{}语句块中,往往会放入打印结果等语句
echo $PATH | awk 'BEGIN{RS=":"}{print NR,$0};END{print NR}'
1 /usr/local/sbin
2 /usr/local/bin
3 /usr/sbin
4 /usr/bin
5 /root/bin
5
4.4.8.7 awk数组
#BEGIN中的命令只执行一次
awk 'BEGIN{a[0]=1;a[1]=2;a[2]=3;print a[2]}'
3
#awk数组的下标除了数字,还可以使用字符串,字符串需要使用双引号
awk 'BEGIN{a["q"]="aaa";a["m"]="bbb";a["y"]="ccc";print a["q"]}'
aaa
awk 'BEGIN{a["q"]=1;a["m"]=2;a["y"]=3;for(i in a){print i,a[i]}}'
y 3
m 2
q 1
4.4.8.7 过滤文本中重复行数
cat b.txt
aaa
bbb
ccc
aaa
aaa
aaa
bbb
bbb
ccc
#将文本的内容作为数组下标,a[$1]++表示出现相同的行,就自加1
awk '{a[$1]++}END{for (i in a){print i,a[i]}}' b.txt
aaa 4
ccc 2
bbb 3
4.4.8.8 过滤访问本机密码输入失败的命令
#过滤密码输出错误的IP地址及输入次数
awk '/Failed password/{ip[$11]++}END{for(i in ip){print i,ip[i]}}'
/var/log/secure
192.168.88.121 4
192.168.88.20 6
#过滤输入次数大于4次的IP地址
awk '/Failed password/{ip[$11]++}END{for(i in ip){print i,ip[i]}}'
/var/log/secure | awk '$2>4{print $1}'
192.168.88.20