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 行。
四、示例
- 搜索文件中的文本:
在grep "hello" file.txt
file.txt
中搜索包含 “hello” 的行,并将它们打印出来。 - 忽略大小写搜索:
忽略大小写地搜索 “hello”(即 “Hello”、“HELLO” 等也会被匹配)。grep -i "hello" file.txt
- 递归搜索目录:
在grep -r "hello" /path/to/directory
/path/to/directory
目录及其所有子目录中递归搜索包含 “hello” 的行。 - 使用扩展正则表达式:
使用扩展正则表达式来搜索包含 “hello” 或 “world” 的行。grep -E "hello|world" file.txt
sed
sed 编辑器的介绍
sed
(Stream EDitor)是一种强大的流编辑器,它逐行处理文本文件,并将处理结果输出到标准输出(通常是屏幕)。与文本编辑器如 vim
或 nano
不同,sed
主要用于在命令行中自动编辑文本,无需打开文件进行交互式编辑。sed
非常适合于执行文本替换、删除、新增等批量处理任务。
sed 流编辑器的工作过程
sed
的工作流程主要包括以下三个步骤:
- 读取:
sed
从输入流(文件、管道、标准输入等)中读取一行内容,并将其存储在临时的缓冲区中,这个缓冲区被称为“模式空间”(pattern space)。 - 执行:在模式空间中,
sed
按照指定的命令对文本进行处理。默认情况下,sed
命令会在所有行上依次执行,除非指定了特定的行地址。 - 显示:处理完成后,
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
命令的使用,比如减少不必要的正则表达式匹配或复杂的替换逻辑,可以稍微提升性能。
解决方案三:使用更高效的工具
对于非常大的文件,可能需要考虑使用更高效的文本处理工具,如 awk
、perl
或 python
脚本。这些工具提供了更丰富的文本处理功能,并且可能在处理大文件时表现更好。
解决方案四:并行处理
如果服务器资源允许,并且文件已经被分割成多个小文件,可以考虑使用并行处理工具(如 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的实际应用
提取版本号
操作目的:从文件中提取出软件包的版本号。
使用工具:grep
和 sed
步骤:
- 使用
grep
初步筛选:
这会筛选出所有包含至少一个数字后跟一个点(grep -E "[0-9]+\." 1.txt
.
)的行,但可能会包含不需要的额外字符。 - 使用
sed
精确提取:
这条命令通过正则表达式匹配文件名中的版本号(即"-“后面的部分,直到”.jar"之前),并仅保留这部分。cat 1.txt | sed -r 's/.*-(.*)\.jar/\1/'
注意事项:
- 使用
-r
或-E
选项以支持扩展正则表达式。 - 在使用
sed
进行替换时,确保正则表达式正确匹配需要提取的部分。
查看指定时间内的日志
操作目的:从日志文件中提取指定时间范围内的日志条目。
使用工具:sed
步骤:
sed -n '/Mar 23 21:00:01/,/Mar 23 21:30:01/p' /var/log/messages
注意事项:
- 日志时间格式需要完全一致,包括月份、日期、时间等。
- 使用
-n
和p
选项来仅打印匹配的行。
修改网卡的IP地址
操作目的:修改网络配置文件中指定的网卡IP地址。
使用工具:sed
步骤:
- 直接替换指定行:
这条命令会找到包含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
。 - 错误尝试:
这条命令尝试进行字符转换,但由于源字符串和目标字符串长度不同,会报错。sed -i 'y/10.10.10.10/192.168.233.21/' ifcfg-ens33
注意事项:
- 使用
-i
选项时务必谨慎,因为它会直接修改文件。建议先在不加-i
的情况下测试命令。 - 对于复杂的替换(如整个IP地址),使用
c
命令或结合其他工具(如awk
)可能更为合适。
总结
- sed命令处理:
sed
是一种强大的文本处理工具,适用于逐行读取和处理文本。对于大文件,考虑分批处理或优化正则表达式以提高效率。 - 正则表达式:熟练使用正则表达式是高效使用
grep
和sed
的关键。 - 安全操作:在使用
-i
选项修改文件前,确保命令的正确性,并考虑先备份原文件。 - 扩展应用:
sed
不仅限于文本替换,还可以用于文本的增删改查等多种操作,是脚本编程中的重要工具。
awk
awk 概述
awk
是一个强大的文本处理工具,在 Linux/UNIX 系统中广泛使用。它逐行读取输入文本,并根据空格或制表符(或其他自定义分隔符)将每行分割成多个字段,然后按照指定的模式或条件执行编辑命令。
awk 的基本格式
awk [选项] '模式或条件 {操作}' 文件1 文件2...
常用选项
-F "分隔符"
: 指定输入字段的分隔符,默认为空白字符(空格或制表符)。-v var=value
: 在程序开始前设置变量。
awk 的工作原理
- BEGIN 语句块:在处理任何输入行之前执行,主要用于初始化操作。
- 处理输入行:对于每一行输入,
awk
会检查是否匹配指定的模式或条件,如果匹配,则执行相应的操作。 - END 语句块:在处理完所有输入行之后执行,常用于汇总或输出最终结果。
内置变量
$0
: 当前处理的行的整行内容。$n
: 当前处理行的第 n 个字段(第 n 列)。NR
: 当前处理的行的行号。NF
: 当前行的字段数。FS
: 输入字段分隔符(默认为空白字符)。OFS
: 输出字段分隔符(默认为空白字符)。FILENAME
: 当前被处理的文件名。RS
: 输入记录分隔符(默认为换行符)。
基本用法示例
- 打印所有行:
awk '{print}' filename
- 打印特定行:
- 打印第三行:
awk 'NR==3 {print}' filename
- 打印第3到第5行:
awk 'NR==3,NR==5 {print}' filename
- 使用正则表达式打印3到5行:
awk '(NR>=3)&&(NR<=5) {print}' filename
- 打印第三行:
- 奇偶行打印:
- 打印偶数行:
awk 'NR%2==0 {print}' filename
- 打印奇数行:
awk 'NR%2==1 {print}' filename
- 打印偶数行:
- 使用内置变量:
- 打印每行的行号和整行内容:
awk '{print NR, $0}' filename
- 打印每行的字段数:
awk '{print NF}' filename
- 打印每行的行号和整行内容:
- BEGIN 和 END 语句块:
- 在处理文件前打印头部信息:
awk 'BEGIN {print "Processing file..."} {print} END {print "Processing complete."}' filename
- 在处理文件前打印头部信息:
- 算术运算:
- 加法:
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
的工作原理
getline
在 awk
中用于从输入文件、管道或重定向中读取一行数据。其行为取决于其使用上下文:
-
无重定向或管道时:
awk
首先读取文件的当前行。getline
读取下一行数据,并将该行的内容存储在$0
中,同时更新NR
(当前记录号)、NF
(当前字段数)等内部变量。
-
有重定向或管道时:
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)
RS
是awk
中的一个内置变量,用于定义输入记录的分隔符。默认情况下,RS
的值为换行符\n
,这意味着awk
会按行读取输入。但您可以根据需要修改RS
的值来定义不同的记录分隔符。
echo $PATH | awk 'BEGIN{RS=":"};{print NR,$0}'
这个命令实际上并不会按您预期的方式工作,因为RS
在BEGIN
块中设置后,会在处理第一条记录之前生效,但$PATH
中通常不包含换行符,所以整个$PATH
会被视为一个记录。正确的使用场景是处理多行文本,其中每行或每几个字符由特定的分隔符分隔。
输出字段分隔符(OFS)
OFS
是awk
的内置变量,用于定义输出字段的分隔符。默认情况下,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
, 和$9
是awk
的内置变量,分别代表每行日志的第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}') # 不取小数点,只取整数
- 解释:使用
awk
的BEGIN
块可以在不处理输入文件的情况下执行代码。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
文件系统的使用百分比,并去除百分号,以便进行数值比较或其他处理。