当前位置: 首页 > article >正文

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命令单独使用:
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
-zOnly 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 命令只能去除相邻的重复行。

-duniq 命令的 -d 选项用于只显示重复的行
-uuniq 命令的 -u 选项用于只显示唯一的行
-cuniq 命令的 -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

http://www.kler.cn/a/309855.html

相关文章:

  • 【贪心算法】——力扣763. 划分字母区间
  • ORA-01092 ORA-14695 ORA-38301
  • 微服务架构面试内容整理-SpringCloud Netflix‌与Spring Cloud Alibaba比较
  • Django 的 ModelViewSet 中的 get_queryset 方法自定义查询集
  • 基于BILSTM及其他RNN序列模型的人名分类器
  • 009_SSH_Mysql图书管理系统(学生注册 借书 还书 绵阳)——lwplus87(免费送)
  • HT3163 免电感滤波25W AB/D类音频功放
  • 图数据库 neo4j 安装
  • RocketMQ实战与集群架构详解
  • C# 在WPF中实现图表生成
  • 大数据时代下会计数字化的思考与建议
  • 实战04-http请求
  • flutter集成百度地图定位 ‘BMKLocationManager.h‘ file not found报错
  • 消防指挥中心控制台:守护安全的关键枢纽
  • TCP/IP协议概述
  • 【乐吾乐大屏可视化组态编辑器】使用手册
  • Android 用线程池实现一个简单的任务队列(Kotlin)
  • 红队打点的思路与信息收集
  • android.view.InflateException: Binary XML file line #7: Error inflating class
  • xilinx vivado PULLMODE 设置思路
  • linux 使用SSH密钥配置免密登录
  • 我要走遍三山五岳之---嵩山
  • 问题:WINCC 7.5 结构变量只能是内部变量吗?
  • linux 获取指定端口的PID netsat awk
  • 构建未来教育:智慧校园的功能与特色
  • MacOS安装MAT教程