【Linux入门】正则三剑客:grep、sed和wak

gerp

grep 是一个在 Unix 和类 Unix 系统中广泛使用的文本搜索工具,它以其强大的正则表达式匹配能力而著称。

一、基本概述

  • 名称由来grep 是 Global Regular Expression Print 的缩写,表示全局正则表达式版本。
  • 功能:通过正则表达式模式搜索文本,并输出匹配的行。
  • 使用场景:适用于在大量文本数据中快速找到所需的信息,是文本处理和数据挖掘的常用工具。

二、基本语法

grep [选项]... 模式 [文件]...
  • 选项:用于指定搜索行为。
  • 模式:定义了要搜索的文本模式,可以是简单的字符串或复杂的正则表达式。
  • 文件:指定了要搜索的目标文件列表。如果未指定文件,grep 会从标准输入(stdin)读取数据。

三、常用选项

1. 搜索选项

  • -i:忽略大小写。
  • -v:反向选择,只显示不匹配的行。
  • -c:仅显示匹配的行数,而不是内容。
  • -l:仅列出包含匹配项的文件名,而不显示匹配的行。
  • -L:列出不包含匹配内容的文件名。
  • -n:显示匹配的行号。
  • -H:当输出多于一个文件时,显示文件的名称。
  • -h:当输出多于一个文件时,不显示文件的名称(默认行为)。
  • -m:后面跟数字,表示匹配到的前几个(的行)
  • -f:从指定的文件中读取搜索模式。可以将多个搜索模式存储在一个文件中,然后一次性搜索这些模式

2. 正则表达式选项

  • -E:使用扩展正则表达式(Extended Regular Expression),支持 +, {}, | 等特殊字符。
  • -F:将模式视为固定字符串,而不是正则表达式。
  • -P:使用 Perl 正则表达式,允许使用 Perl 正则表达式的语法。
  • -G:使用二进制的 regex 模式,通常与 pcregrep 命令的特定版本一起使用。

3. 其他选项

  • -r-R:递归搜索目录下的所有文件。
  • -o:仅显示匹配到的部分,而不是整行。
  • -w:只匹配整个单词,而不是部分匹配
  • -s:静默模式,不显示错误信息(除了匹配的行)。
  • -q:静默模式,不输出任何内容(包括匹配的行),只返回一个状态码来表示是否找到匹配的行。
  • -a--text:将二进制文件视为文本文件进行搜索。
  • -e:表示逻辑或,实现多个选项的匹配
  • -I:忽略二进制文件,只搜索文本文件。
  • -B NUM:输出匹配行的前 NUM 行。
  • -A NUM:输出匹配行的后 NUM 行。
  • -C NUM:输出匹配行及其前后各 NUM 行。

四、示例

  1. 搜索文件中的文本
    grep "hello" file.txt
    
    file.txt 中搜索包含 “hello” 的行,并将它们打印出来。
  2. 忽略大小写搜索
    grep -i "hello" file.txt
    
    忽略大小写地搜索 “hello”(即 “Hello”、“HELLO” 等也会被匹配)。
  3. 递归搜索目录
    grep -r "hello" /path/to/directory
    
    /path/to/directory 目录及其所有子目录中递归搜索包含 “hello” 的行。
  4. 使用扩展正则表达式
    grep -E "hello|world" file.txt
    
    使用扩展正则表达式来搜索包含 “hello” 或 “world” 的行。

sed

sed 编辑器的介绍

sed(Stream EDitor)是一种强大的流编辑器,它逐行处理文本文件,并将处理结果输出到标准输出(通常是屏幕)。与文本编辑器如 vimnano 不同,sed 主要用于在命令行中自动编辑文本,无需打开文件进行交互式编辑。sed 非常适合于执行文本替换、删除、新增等批量处理任务。

sed 流编辑器的工作过程

sed 的工作流程主要包括以下三个步骤:

  1. 读取sed 从输入流(文件、管道、标准输入等)中读取一行内容,并将其存储在临时的缓冲区中,这个缓冲区被称为“模式空间”(pattern space)。
  2. 执行:在模式空间中,sed 按照指定的命令对文本进行处理。默认情况下,sed 命令会在所有行上依次执行,除非指定了特定的行地址。
  3. 显示:处理完成后,sed 将修改后的内容发送到输出流(通常是屏幕)。然后,模式空间被清空,以准备处理下一行。这个过程会一直重复,直到文件中的所有行都被处理完毕。

解决 sed 命令处理大文件效率慢的问题

当处理容量过大或内容过多的文件时,sed 命令可能会遇到性能瓶颈,导致执行效率下降。以下是一些解决方案:

解决方案一:使用 split 命令分割文件

将大文件分割成多个小文件,然后分别对每个小文件使用 sed 进行处理。这样可以并行处理多个文件,显著提高效率。

  • 按行分割
    split -l 10000 test1.txt se_part_
    # 这会将 test1.txt 分割成多个文件,每个文件包含 10000 行,文件名以 se_part_ 开头。
    
    然后,可以编写一个循环或脚本,对每个分割后的文件执行 sed 命令。
  • 按大小分割
    split -b 400M test1.txt se_size_
    # 这会将 test1.txt 分割成多个文件,每个文件大小约为 400MB,文件名以 se_size_ 开头。
    
解决方案二:优化 sed 命令的使用

虽然直接使用 cat 文件名 | sed 处理 对于中大型文件可能有效,但对于非常大的文件,这种方法可能仍然不够高效。优化 sed 命令的使用,比如减少不必要的正则表达式匹配或复杂的替换逻辑,可以稍微提升性能。

解决方案三:使用更高效的工具

对于非常大的文件,可能需要考虑使用更高效的文本处理工具,如 awkperlpython 脚本。这些工具提供了更丰富的文本处理功能,并且可能在处理大文件时表现更好。

解决方案四:并行处理

如果服务器资源允许,并且文件已经被分割成多个小文件,可以考虑使用并行处理工具(如 GNU Parallel)来同时运行多个 sed 进程,每个进程处理一个文件片段。这样可以充分利用多核处理器的优势,进一步提高处理速度。

总结

处理大文件时,sed 命令可能会遇到性能瓶颈。通过分割文件、优化命令、使用更高效的工具或并行处理等方法,可以显著提高处理效率。在实际应用中,应根据具体情况选择最合适的解决方案。

sed 命令的基本格式与选项

基本操作格式

  • 单个操作:
    sed -e '操作' 文件1 文件2
    sed -f 脚本文件 文件1 文件2
    sed -i -e '操作' 文件1 文件2  # 直接修改文件,慎用
    
  • 读取脚本文件中的操作:
    sed -f 脚本文件 文件
    

执行多条命令的格式

  • 使用 -e 选项:
    sed -e '操作1' -e '操作2' 文件
    sed -n -e '/^r/p' -e '/^b/p' /etc/passwd
    
  • 在同一 -e 选项中分隔多个命令:
    sed -e '操作1;操作2' 文件
    

常用选项

  • -e--expression=:指定一个或多个操作命令。
  • -f--file=:指定包含操作命令的脚本文件。
  • -h--help:显示帮助信息。
  • -i:直接修改目标文件(慎用)。
  • -n:仅显示处理后的结果,默认会输出未处理的行。

sed 命令的操作符

  • s:替换字符串。
  • d:删除行。
  • a:在当前行之后添加一行或多行文本。
  • i:在当前行之前插入一行或多行文本。
  • c:替换整行文本。
  • y:字符转换,前后字符长度必须相同。
  • p:打印行,常与 -n 选项一起使用。
  • =:打印行号。
  • l:打印数据流中的文本和不可打印的 ASCII 字符。
  • r:读取文件内容并追加到匹配行后(注意:这不是一个标准的 sed 操作符,可能是与某些特定版本的 sed 相关的扩展功能)。

sed 命令的打印功能

  • 默认打印:
    sed -e 'p' 文件  # 默认输出加上 p 命令会打印每行两次
    sed -n 'p' 文件  # 仅打印处理后的行
    
  • 特定行打印:
    sed -n '1p' 文件  # 打印第一行
    sed -n '1,3p' 文件  # 打印 1 到 3 行
    sed -n '2,+2p' 文件  # 打印第二行及其后两行
    
  • 文本模式过滤打印:
    sed -n '/o/p' 文件  # 打印包含 'o' 的行
    sed -n '/^root/p' /etc/passwd  # 打印以 'root' 开头的行
    

sed 命令的删除操作

  • 通过行号删除:
    sed '3d' 文件  # 删除第三行
    sed '5,8d' 文件  # 删除 5 到 8 行
    
  • 通过模式匹配删除:
    sed '/one/d' 文件  # 删除包含 'one' 的行
    sed '/one/,/six/d' 文件  # 删除从 'one' 到 'six' 的所有行
    

sed 命令的替换操作

  • 基本替换格式:
    sed 's/旧字符串/新字符串/替换标记' 文件
    
  • 替换标记:
    • g:全局替换。
    • p:打印替换后的行。
    • w 文件:将替换结果写入文件。
  • 示例:
    sed -n 's/root/test/gp' /etc/passwd  # 替换所有 'root' 为 'test' 并打印
    sed 's/[A-Z]/\l&/g' 文件  # 将所有大写转换为小写
    sed 's/[a-z]/\U&/g' 文件  # 将所有小写转换为大写
    

sed 命令的增加和插入

  • a 在下一行添加:
    sed '/three/a 123' 文件
    
  • i 在上一行插入:
    sed '/three/i 123' 文件
    
  • r 读取文件内容并追加(注意:非标准 sed 操作符):
    sed '$r test2.txt' 文件  # 在文件末尾追加 test2.txt 的内容
    

sed 命令的字符位置交换

  • 使用正则表达式捕获组进行位置交换:
    echo "ky27yhtdxl" | sed -r 's/(ky27)(yht)(dxl)/\3\2\1/'
    

sed 命令与脚本文件

  • 使用 -f 选项指定脚本文件对目标文件进行操作:
    sed -f 脚本文件 目标文件
    

sed的实际应用

提取版本号

操作目的:从文件中提取出软件包的版本号。
使用工具grepsed
步骤

  1. 使用 grep 初步筛选
    grep -E "[0-9]+\." 1.txt
    
    这会筛选出所有包含至少一个数字后跟一个点(.)的行,但可能会包含不需要的额外字符。
  2. 使用 sed 精确提取
    cat 1.txt | sed -r 's/.*-(.*)\.jar/\1/'
    
    这条命令通过正则表达式匹配文件名中的版本号(即"-“后面的部分,直到”.jar"之前),并仅保留这部分。
    注意事项
  • 使用 -r-E 选项以支持扩展正则表达式。
  • 在使用 sed 进行替换时,确保正则表达式正确匹配需要提取的部分。

查看指定时间内的日志

操作目的:从日志文件中提取指定时间范围内的日志条目。
使用工具sed
步骤

sed -n '/Mar 23 21:00:01/,/Mar 23 21:30:01/p' /var/log/messages

注意事项

  • 日志时间格式需要完全一致,包括月份、日期、时间等。
  • 使用 -np 选项来仅打印匹配的行。

修改网卡的IP地址

操作目的:修改网络配置文件中指定的网卡IP地址。
使用工具sed
步骤

  1. 直接替换指定行
    sed -i '/IPADDR=192.168.233.21/c\IPADDR=10.10.10.10' ifcfg-ens33
    
    这条命令会找到包含 IPADDR=192.168.233.21 的行,并将其替换为 IPADDR=10.10.10.10
  2. 错误尝试
    sed -i 'y/10.10.10.10/192.168.233.21/' ifcfg-ens33
    
    这条命令尝试进行字符转换,但由于源字符串和目标字符串长度不同,会报错。
    注意事项
  • 使用 -i 选项时务必谨慎,因为它会直接修改文件。建议先在不加 -i 的情况下测试命令。
  • 对于复杂的替换(如整个IP地址),使用 c 命令或结合其他工具(如 awk)可能更为合适。

总结

  1. sed命令处理sed 是一种强大的文本处理工具,适用于逐行读取和处理文本。对于大文件,考虑分批处理或优化正则表达式以提高效率。
  2. 正则表达式:熟练使用正则表达式是高效使用 grepsed 的关键。
  3. 安全操作:在使用 -i 选项修改文件前,确保命令的正确性,并考虑先备份原文件。
  4. 扩展应用sed 不仅限于文本替换,还可以用于文本的增删改查等多种操作,是脚本编程中的重要工具。

awk

awk 概述

awk 是一个强大的文本处理工具,在 Linux/UNIX 系统中广泛使用。它逐行读取输入文本,并根据空格或制表符(或其他自定义分隔符)将每行分割成多个字段,然后按照指定的模式或条件执行编辑命令。

awk 的基本格式

awk [选项] '模式或条件 {操作}' 文件1 文件2...

常用选项

  • -F "分隔符": 指定输入字段的分隔符,默认为空白字符(空格或制表符)。
  • -v var=value: 在程序开始前设置变量。

awk 的工作原理

  1. BEGIN 语句块:在处理任何输入行之前执行,主要用于初始化操作。
  2. 处理输入行:对于每一行输入,awk 会检查是否匹配指定的模式或条件,如果匹配,则执行相应的操作。
  3. END 语句块:在处理完所有输入行之后执行,常用于汇总或输出最终结果。

内置变量

  • $0: 当前处理的行的整行内容。
  • $n: 当前处理行的第 n 个字段(第 n 列)。
  • NR: 当前处理的行的行号。
  • NF: 当前行的字段数。
  • FS: 输入字段分隔符(默认为空白字符)。
  • OFS: 输出字段分隔符(默认为空白字符)。
  • FILENAME: 当前被处理的文件名。
  • RS: 输入记录分隔符(默认为换行符)。

基本用法示例

  1. 打印所有行
    awk '{print}' filename
    
  2. 打印特定行
    • 打印第三行:
      awk 'NR==3 {print}' filename
      
    • 打印第3到第5行:
      awk 'NR==3,NR==5 {print}' filename
      
    • 使用正则表达式打印3到5行:
      awk '(NR>=3)&&(NR<=5) {print}' filename
      
  3. 奇偶行打印
    • 打印偶数行:
      awk 'NR%2==0 {print}' filename
      
    • 打印奇数行:
      awk 'NR%2==1 {print}' filename
      
  4. 使用内置变量
    • 打印每行的行号和整行内容:
      awk '{print NR, $0}' filename
      
    • 打印每行的字段数:
      awk '{print NF}' filename
      
  5. BEGIN 和 END 语句块
    • 在处理文件前打印头部信息:
      awk 'BEGIN {print "Processing file..."} {print} END {print "Processing complete."}' filename
      
  6. 算术运算
  • 加法:
awk 'BEGIN{print 100+200}'  # 输出: 300
awk 'BEGIN{print 10.2+20.3}'  # 输出: 30.5
  • 乘法:
awk 'BEGIN{print 10.2*20.3}'  # 输出: 207.06
  • 除法:
awk 'BEGIN{print 10.2/20.3}'  # 输出: 0.502463
  • 减法:
awk 'BEGIN{print 10.2-20.3}'  # 输出: -10.1
  • 幂运算:
    awk中,幂运算通常使用^符号,但也有**的用法,某些版本的awk(如gawk)中有效,但在标准awk中可能不被支持。
# 使用 ^ 符号进行幂运算
awk 'BEGIN{print 3^2}'  # 输出: 9
awk 'BEGIN{print 2^3}'  # 输出: 8

# 注意:在某些awk版本中(如gawk),** 也可能有效
# awk 'BEGIN{print 3**2}'  # 在支持 ** 的awk版本中输出: 9

注意

  • 默认情况下,awk的算术运算结果是浮点数(如果有小数部分的话)。
  • ^符号在awk中用于幂运算。
  • 某些版本的awk(如gawk)可能支持**作为幂运算的替代符号,但这并不是所有awk实现的标准功能。
  • 所有的算术运算都可以在BEGIN块中进行,这意味着它们将在处理任何输入行之前执行。
  • 当处理整数和浮点数时,awk会自动进行类型转换和计算。

结论

这些示例展示了awk在处理基本算术运算时的能力,包括加法、减法、乘法、除法和幂运算。通过使用BEGIN块,您可以在处理任何输入行之前执行这些计算,这在需要初始化变量或执行计算以生成报告标题等场景中非常有用。### 注意

  • awk 的模式或条件必须放在单引号内。
  • 内置变量不应放在双引号内,以避免被解释为字符串。
  • awk 支持丰富的算术和字符串操作,以及内置函数,可以执行复杂的文本处理任务。

getline 的工作原理

getlineawk 中用于从输入文件、管道或重定向中读取一行数据。其行为取决于其使用上下文:

  1. 无重定向或管道时

    • awk 首先读取文件的当前行。
    • getline 读取下一行数据,并将该行的内容存储在 $0 中,同时更新 NR(当前记录号)、NF(当前字段数)等内部变量。
  2. 有重定向或管道时

    • getline 直接从指定的文件或管道中读取数据,而不是从 awk 当前处理的文件中。
    • 如果文件是刚打开,getline 将读取文件的第一行。

示例

  • 打印偶数行:
    awk '{getline; print $0}' test1.txt
    
  • 打印奇数行:
    awk '{print $0; getline}' test1.txt
    
  • 使用重定向:
    awk '{getline < "test1.txt"; print $0 > "test2.txt";}' test1.txt  # 注意:这实际上可能不是预期行为,因为它对每行都尝试打开并读取test1.txt的第一行
    
  • 管道示例(通常用于处理外部命令的输出):
    ls | awk '{getline line; print $0, line;}'  # 注意:这里可能不是最佳实践,因为getline通常不用于直接处理管道输入
    

文本内容匹配过滤打印

  • 匹配行首为 root 的行:
    awk '/^root/{print}' /etc/passwd
    
  • 匹配行尾为 bash 的行:
    awk '/bash$/{print}' /etc/passwd
    

BEGIN 和 END 模式

  • BEGIN 在处理任何输入行之前执行。
  • END 在处理完所有输入行之后执行。

示例

  • 打印处理文件的总行数:
    awk 'BEGIN{x=0};{x++};END{print x}' test1.txt
    

字段处理

  • 使用 -F 设置输入字段分隔符,-v 传递变量给 awk

示例

  • 打印 /etc/passwd 的第一列和第三列(以冒号为分隔符):
    awk -F: '{print $1, $3}' /etc/passwd
    
  • 使用 -v 传递变量:
    a=3; b=4; num=$(awk -v a="$a" -v b="$b" 'BEGIN{print a + b}')
    
  • 修改输出字段分隔符:
    awk -v FS=':' -v OFS='==' '{print $1, $3}' /etc/passwd
    

条件判断

示例

  • 打印 UID 大于 500 的用户:
    awk -F: '$3 > 500 {print $0}' /etc/passwd
    
  • 使用 if 语句:
    awk -F: '{if ($3 > 500) print $0}' /etc/passwd
    

BEGIN 模式指定分隔符

示例

  • 打印 /etc/passwd 的第五列(以冒号为分隔符):
    head -n5 /etc/passwd | awk 'BEGIN{FS=":"}; {print $5}'
    

awk的三元表达式

awk 的三元表达式与 Java 类似,用于在 awk 程序中实现简单的条件判断。其格式如下:

awk '(条件表达式)?(A表达式或者值):(B表达式或者值)'

示例(比较 /etc/passwd 文件中每行的第三个和第四个字段,并打印较大值及整行内容的前6行):

awk -F: '{max=($3>=$4)?$3:$4; print max,$0}' /etc/passwd | sed -n '1,6p'

注意:这里的命令实际上会先打印每行的最大值和整行内容,然后通过 sed 选取前6行。如果您只想基于 max 值进行筛选并打印前6行,那么逻辑会更加复杂,因为 awk 内部的 max 变量并不会改变行的输出顺序或选择。

awk的精准筛选

awk 提供了多种条件表达式,用于基于字段内容筛选行。

数值比较

  • $n > value
  • $n < value
  • $n == value

字符串匹配

  • $n ~ /正则表达式/:第n个字段包含匹配正则表达式的字符串
  • $n !~ /正则表达式/:第n个字段不包含匹配正则表达式的字符串
  • $n == "字符串":第n个字段精确等于某个字符串
  • $n != "字符串":第n个字段不等于某个字符串

最后一个字段

  • $NF:表示当前行的最后一个字段

实例

实例1:输出第七个字段包含“bash”的行的第一个字段和最后一个字段。

awk -F: '$7 ~ /bash/ {print $1, $NF}' /etc/passwd

实例2:输出第七个字段不包含“nologin”的行的第一个字段和最后一个字段。

awk -F: '$7 !~ /nologin/ {print $1, $NF}' /etc/passwd

实例3:指定第六个字段为/home/dn且第七个字段为/bin/bash,输出满足这些条件的行的第一个和最后一个字段。

awk -F: '($6 == "/home/dn") && ($7 == "/bin/bash") {print $1, $NF}' /etc/passwd

awk的分隔符

行分隔符(RS)

RSawk中的一个内置变量,用于定义输入记录的分隔符。默认情况下,RS的值为换行符\n,这意味着awk会按行读取输入。但您可以根据需要修改RS的值来定义不同的记录分隔符。

echo $PATH | awk 'BEGIN{RS=":"};{print NR,$0}'

这个命令实际上并不会按您预期的方式工作,因为RSBEGIN块中设置后,会在处理第一条记录之前生效,但$PATH中通常不包含换行符,所以整个$PATH会被视为一个记录。正确的使用场景是处理多行文本,其中每行或每几个字符由特定的分隔符分隔。

输出字段分隔符(OFS)

OFSawk的内置变量,用于定义输出字段的分隔符。默认情况下,OFS的值为空格。要使OFS生效,您通常需要对某个字段进行赋值操作(如$1=$1),这样awk才会重新格式化输出行。

echo a b c d | awk '{OFS=":"; $1=$1; print $0}'
# 输出: a:b:c:d

awk结合数组运用

awk中,数组是一种非常强大的数据结构,可以用来存储和遍历数据。

  • 定义数组并打印
awk 'BEGIN{a[0]=10;a[1]=20;a[2]=30;print a[1]}'
# 输出: 20
  • 数组遍历
awk 'BEGIN{a[0]=10; a[1]=20; a[2]=30; for(i in a) print i,a[i]}'
# 注意:遍历数组时,元素的顺序可能不是按索引顺序的,因为awk内部使用哈希表实现数组。
  • 文件去重统计
cat test3.txt
aaa
aaa
bbb
ccc
aaa
bbb
aaa

awk '{a[$1]++};END{for(i in a){print i,a[i]}}' test3.txt  #在awk中打印变量不需要加$

awk -v debug=1 '{print "Processing line", NR, "with value", $1; a[$1]++};END{for(i in a){print "Result for value", i, "is", a[i]}}' test2.txt
检测运行机制
# 输出(顺序可能不同):
aaa 4
bbb 2
ccc 1

#原理:a[$1]初始为0,a[$1]++后即为1,
#而这里awk中的a[$1]++最终的值是由test2.txt文本内容有多少行决定的,awk本#身就是编程语言,不要按照shell来
#文本逐行读取完毕后再执行END中的命令
#awk会按行读取文件test2.txt的内容,然后逐个单词存储到数组a中。
#每个单词都作为数组a的索引,所以每个单词都对应一个值,初始值为0。
#读取文件的第一行,单词为 aaa,此时a[aaa]为0,执行 a[$1]++ 后,a[aaa]变成1。
#读取文件的第二行,单词为 aaa,此时a[aaa]为1,执行 a[$1]++ 后,a[aaa]变成2。
#读取文件的第三行,单词为 bbb,此时a[bbb]为0,执行 a[$1]++ 后,a[bbb]变成1。
#读取文件的第四行,单词为 ccc,此时a[ccc]为0,执行 a[$1]++ 后,a[ccc]变成1。
#读取文件的第五行,单词为 aaa,此时a[aaa]为2,执行 a[$1]++ 后,a[aaa]变成3。
#读取文件的第六行,单词为 bbb,此时a[bbb]为1,执行 a[$1]++ 后,a[bbb]变成2。
#读取文件的第七行,单词为 aaa,此时a[aaa]为3,执行 a[$1]++ 后,a[aaa]变成4。
#最终,数组a中的元素值变成:a[aaa]=4,a[bbb]=2,a[ccc]=1。

实例应用

简单的日志分割

awk '{print $1, $7, $9}' /var/log/messages
  • 解释:这个命令使用 awk 来处理 /var/log/messages 文件。$1, $7, 和 $9awk 的内置变量,分别代表每行日志的第1、第7和第9个字段。print 命令用于输出这些字段,以空格分隔。

只分割前两行内容的第一个和第四个字段

awk 'NR<=2{print $1, $4}' /var/log/messages
  • 解释:这个命令仅处理文件的前两行,并打印每行的第1和第4个字段。

取小数点几位和取整数

result=$(awk 'BEGIN{printf "%.2f", 2.331*2.542}') #取小数点2位
result=$(awk 'BEGIN{printf "%.0f", 2.331*2.542}')  # 不取小数点,只取整数
  • 解释:使用 awkBEGIN 块可以在不处理输入文件的情况下执行代码。printf 函数用于格式化输出,%.2f 表示保留两位小数,%.0f 表示不保留小数。

提取host.txt主机名后再放回host.txt文件

cat file.txt | awk -F '[ .]+' '{print $2}' >> host.txt
  • 解释:这个命令从 file.txt 中提取主机名,并将其追加到 host.txt 文件中。-F '[ .]+' 设置字段分隔符为任意空白字符或点号。

统计磁盘总共使用容量

df | tail -n +2 | grep -v tmpfs | awk '{sum+=$4} END{print "磁盘可用容量:"sum/1024/1024"G"}'
  • 解释:这个命令统计所有非 tmpfs 文件系统的可用空间总和,并转换为GB单位。

统计/etc下文件总大小

ls -l /etc | awk '/^-/{sum+=$5} END{print "文件总大小:"sum/1024"M"}'
  • 解释:这个命令统计 /etc 目录下所有普通文件的总大小,并转换为MB单位。

CPU使用率

sum=$(top -b -n 1 | grep -w st |awk '{print $2+$4}')
echo $sum
  • 解释:这个命令使用 top 命令以批处理模式运行一次,获取用户空间和内核空间的CPU使用率之和。

统计内存

memory_used=$(free -m | grep "Mem:" |awk '{print $3 }')
memory_total=$(free -m | grep "Min:" |awk '{print $2 }')
echo '当前内存的使用量'$memory_used
echo '当前内存的总量'$memory_total
z=$(echo "scale=2;${memory_used}/${memory_total}*100"|bc)
echo $z
b=$(echo $z | awk -F '.' '{print $1}')
echo $b
echo "当前的使用占比:${b}%"
if [ $b -lt 90 ]
then
    echo "内存的使用量正常:${b}%"
else
    echo "内存的使用量为:"$b"大于90%,请注意!"
fi
  • 解释:这个脚本计算当前内存的使用量和总量,并计算使用百分比。如果使用率超过90%,则发出警告。

监控硬盘

a=$(df -h | grep -w centos-root | awk '{print $5}') | tr -d "%"
echo $a
b=$(echo "$a" | sed 's/%//g')
echo $b
  • 解释:这个命令获取 /centos-root 文件系统的使用百分比,并去除百分号,以便进行数值比较或其他处理。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值