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.mfbz.cn/a/879629.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

IDEA 新版本设置菜单展开

IDEA 新版本设置菜单展开 使用了新版本的IDEA 新UI后&#xff0c;常用的file&#xff0c;edit&#xff0c;view&#xff0c;菜单隐藏了 在设置中搜索后show main menu in a separate toolbar中可以打开。 打开设置 搜索show main menu in a separate toolbar后勾上

keil调试变量值被篡改问题

今天遇到一个代码中变量值被篡改的问题&#xff0c;某个数组的第一个值运行一段时间之后变成了0&#xff0c;如图&#xff1a; 看现象基本可以断定是内存越界导致的&#xff0c;但是要如果定位是哪里内存越界呢? keil提供了两个工具 1、set access breakpoint at(设置访问断点…

TensorFlow深度学习框架改进K-means聚类、SOM自组织映射算法及上海招生政策影响分析研究...

全文链接&#xff1a;https://tecdat.cn/?p37652 分析师&#xff1a;Chen Zhang 在教育政策研究领域&#xff0c;准确评估政策对不同区域和学生群体的影响至关重要。2021 年上海市出台的《上海市初中学业水平考试实施办法》对招生政策进行了调整&#xff0c;其中名额分配综合…

通过C# 裁剪PDF页面

在处理PDF文档时&#xff0c;有时需要精确地裁剪页面以适应特定需求&#xff0c;比如去除广告、背景信息或者仅仅是为了简化文档内容。 本文将指导如何使用免费.NET控件通过C#实现裁剪PDF页面。 免费库 Free Spire.PDF for .NET 支持在 .NET (C#, VB.NET, ASP.NET, .NET Core)…

java数据结构----图

图的存储结构: 代码实现 public class Graph {// 标记顶点数目private int V;// 标记边数目private int E;// 邻接表private Queue<Integer>[] adj;public Graph(int v) {V v;this.E 0;this.adj new Queue[v];for (int i 0; i < adj.length; i) {adj[i] new Queu…

使用阿里OCR身份证识别

1、开通服务 免费试用 2、获取accesskay AccessKeyId和AccessKeySecret 要同时复制保存下来 因为后面好像看不AccessKeySecret了 3.Api 参考 https://help.aliyun.com/zh/ocr/developer-reference/api-ocr-api-2021-07-07-recognizeidcard?spma2c4g.11186623.0.0.7a9f4b1e5C…

PHP及Java等其他语言转Go时选择GoFly快速快速开发框架指南

概要 经过一年多的发展GoFly快速开发框架已被一千多家科技企业或开发者用于项目开发&#xff0c;他的简单易学得到其他语言转Go首选框架。且企业版的发展为GoFly社区提供资金&#xff0c;这使得GoFly快速框架得到良好的发展&#xff0c;GoFly技术团队加大投入反哺科技企业和开…

红黑树的插入(NGINX源码)

下载并查看NGINX源码 访问NGINX下载页面&#xff0c;找到所需版本 https://nginx.org/en/download.html 使用wget下载源码包&#xff0c;替换版本号为所需版本 wget http://nginx.org/download/nginx-1.24.0.tar.gz解压源码包 tar -xzvf nginx-1.24.0.tar.gz进入解压后的目…

【算法题】64. 最小路径和-力扣(LeetCode)

【算法题】64. 最小路径和-力扣(LeetCode) 1.题目 下方是力扣官方题目的地址 64. 最小路径和 给定一个包含非负整数的 *m* x *n* 网格 grid &#xff0c;请找出一条从左上角到右下角的路径&#xff0c;使得路径上的数字总和为最小。 **说明&#xff1a;**每次只能向下或者…

Tiny Universe - Llama3架构

Llama3和Llama2和Qwen2的整体架构相似&#xff0c;本篇文章主要讲解它们的一些主要不同点。 关于Qwen2架构可参考 Qwen2架构 学习笔记 llama3区别于llama2在模型层面的区别主要体现在全模型使用GQA。 基础知识 MLP MLP&#xff08;Multi-Layer Perceptron&#xff09;多层感…

1 elasticsearch安装

【0】官网参考 https://www.elastic.co/guide/en/elasticsearch/reference/7.11/targz.html 【1】Centos7 下载安装 【1.1】下载 官网&#xff1a;Download Elasticsearch | Elastic 选择好自己想要的相关版本即可&#xff1b; 【2】Centos7.X 前置环境配置&#xff08;uli…

STM32MP157/linux驱动学习记录(二)

38.Linux INPUT 子系统实验 按键、鼠标、键盘、触摸屏等都属于输入(input)设备&#xff0c;Linux 内核为此专门做了一个叫做 input子系统的框架来处理输入事件。输入设备本质上还是字符设备&#xff0c;只是在此基础上套上了 input 框架&#xff0c;用户只需要负责上报输入事件…

vue使用vue-i18n实现国际化

我使用的是vue2.6版本&#xff0c;具体使用其他版本可以进行修改 一、安装 npm install vue-i18n -D 二、配置 1、文件配置 ①在src下创建 i18n 目录 ②在 i18n 目录下创建 langs 文件夹 和 index.js文件&#xff0c;具体如下 2、index.js代码如下&#xff0c;这里使用了…

[Python]一、Python基础编程

F:\BaiduNetdiskDownload\2023人工智能开发学习路线图\1、人工智能开发入门\1、零基础Python编程 1. Python简介 Python优点: 学习成本低开源适应人群广泛应用领域广泛1.1 Python解释器 下载地址:Download Python | Python.org 1.2 Python开发IDE -- Pycharm 2. 基础语法…

链表--(1)链表的概念

前言引入 之前我们学习了数组这一概念,使用数组可以在编程时增加程序的灵活性。但在c语言中不允许定义动态数组的类型也不能随意调整数组的大小,往往会导致内存空间的浪费。由此我们推出链表。链表是动态进行内存分配的一种结构,它可以随时为其结点分配需要的存储空间也方便…

CSS中的位置定位总结

文章目录 静态定位相对定位绝对定位固定定位 静态定位 静态定位(position:static)/默认的文档流布局 块级元素按照书写顺序从上往下依次排列行内/行内块元素按照书写顺序从左到右依次排列&#xff0c;一行放不下才换行文档流中的元素都是紧密排布的&#xff0c;没有大的空隙&…

windows查找端口号被占用

在很多开发的时候&#xff0c;可能端口号有被占用的情况&#xff0c;导致项目打不开。 用下面这个命令即可&#xff1a; 比如我的3000端口被占用&#xff0c;我找找哪个进程在占用我的3000端口号

数据结构:堆的算法

目录 一堆的向上调整算法二堆的向下调整算法三堆的应用:堆排序四TOPK问题 一堆的向上调整算法 我们在堆中插入一个数据一般实在堆的最后插入然后可以一步一步与上层结点&#xff08;父结点进行比较&#xff09;&#xff0c;继而进行交换&#xff0c;完成二叉树的结构&#xff0…

人工智能辅助汽车造型设计

随着科技的不断进步&#xff0c;人工智能&#xff08;AI&#xff09;在各个领域的应用越来越广泛&#xff0c;汽车设计行业也不例外。尤其在车辆外观造型设计中&#xff0c;AI正在成为设计师的重要助手&#xff0c;通过提供强大的工具和独特的创意方式&#xff0c;革新了传统设…

code eintegrity npm err sha512

当 npm install 出现报错的时候&#xff1a; 你应该这样去解决&#xff1a; 删除 package-lock.json 文件&#xff0c;重新执行 npm install。 问题出现的原因 EINTEGRITY 错误码表示在npm缓存中无法找到 指定sha512校验合的模块。 出现这个问题的原因是缓存不一致&…