首页 > 系统相关 >Linux系统中的管道命令、grep命令、sed命令和awk命令

Linux系统中的管道命令、grep命令、sed命令和awk命令

时间:2024-08-12 22:05:42浏览次数:7  
标签:文件 grep 命令 sed awk file

本章将和大家分享Linux系统中的管道命令、grep命令、sed命令和awk命令。废话不多说,下面我们直接进入主题。

一、管道命令

Linux 中的管道命令(pipe)是一种非常强大的特性,它允许你将一个命令的输出作为另一个命令的输入。管道命令极大地增强了命令行的灵活性和功能,使得复杂的数据处理任务变得简单。

1、基本语法

command1 | command2

command1 的输出会被传递给 command2 作为其输入。

可以链式使用多个管道命令,例如 command1 | command2 | command3。

2、示例

1)查看系统进程并按内存使用量排序

ps aux --sort=-%mem | less

这里,ps aux --sort=-%mem 命令列出所有进程并按内存使用率降序排序,然后通过管道传递给 less 命令,使得你可以逐页查看输出。

2)查找包含特定文本的文件,并计算行数

grep '特定文本' 文件名 | wc -l

这里,grep '特定文本' 文件名 命令查找文件中包含“特定文本”的行,然后将这些行传递给 wc -l 命令来计算行数。

3)查看当前目录的文件和目录,然后仅显示目录

ls -l | grep '^d'

ls -l 命令以长格式列出当前目录的内容,然后通过管道传递给 grep '^d' 命令,后者仅匹配以 d(表示目录)开头的行。

4)使用多个管道进行复杂的数据处理

假设你有一个日志文件,你想要找出所有错误消息(假设以 "ERROR" 开头),并计算这些消息的数量,同时忽略大小写:

grep -i 'error' 日志文件.log | wc -l

这里,grep -i 'error' 日志文件.log 命令使用 -i 选项忽略大小写地查找包含 "error" 的行,然后通过管道传递给 wc -l 命令来计数。

3、注意事项

  • 管道命令中的每个命令都在其子 shell 中运行,因此它们之间的变量不是共享的。
  • 管道命令中每个命令的输入和输出都是通过标准输入(stdin)和标准输出(stdout)进行的,除非特别重定向了输入或输出。
  • 管道命令中的错误输出(stderr)默认不会传递给下一个命令,除非使用重定向或特殊的命令(如 2>&1)来合并标准输出和错误输出。

二、grep命令

主要作用是文件过滤分割与合并,grep(global search regular expression(RE) and print out the line,全面搜索正则表达式并把行打印出来)是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹配的行打印出来。

1、基本语法

grep [选项]... 模式 [文件]...
  • 选项:可以调整 grep 的行为,如忽略大小写、显示匹配行的行号等。
  • 模式:指定要搜索的文本模式,可以是简单的字符串或复杂的正则表达式。
  • 文件:指定要搜索的文件名。如果没有指定文件名,grep 将从标准输入读取数据。

2、常用选项

  • -i:忽略大小写。
  • -v:反向选择,只显示不匹配的行。
  • -c:计算匹配的行数,而不是显示行内容。
  • -l:只列出包含匹配文本的文件名,而不显示匹配的行。
  • -n:显示匹配的行号。
  • -r 或 -R:递归搜索子目录中的文件。
  • -E:使用扩展的正则表达式。
  • -F:将模式作为固定字符串处理,而不是正则表达式。
  • -o:只输出匹配的部分,而不是整行。
  • -A 数字:显示匹配行以及之后的几行。
  • -B 数字:显示匹配行以及之前的几行。
  • -C 数字:显示匹配行以及上下文的几行。

3、示例

1)基本语法

grep pattern file.txt

2)忽略大小写

grep -i pattern file.txt

3)显示行号

grep -n pattern file.txt

4)递归搜索所有子目录

grep -rnw '/path/to/directory' -e 'pattern'

5)只显示文件名

grep -l pattern *.txt

6)只显示匹配的行数

grep -c pattern file.txt

7)匹配整个单词

grep -w pattern file.txt

8)使用正则表达式

grep -E '\bword\b' file.txt

9)显示上下文的几行

grep -C 2 pattern file.txt

10)搜索文件中的所有“error”字符串

grep "error" /var/log/syslog

11)搜索当前目录及子目录下所有文件中包含“function”的行,并显示行号

grep -rn "function" .

12)计算文件中包含“warning”的行数

grep -c "warning" file.txt

13)反向选择,显示不包含“debug”的所有行

grep -v "debug" file.txt

14)在多个文件中查找

grep "match_pattern" file_1 file_2 file_3 ...

15)标记匹配颜色 --color=auto 选项

grep "match_pattern" file_name --color=auto

16)使用正则表达式 -E 选项

grep -E "[1-9]+"
或
egrep "[1-9]+"

17)只输出文件中匹配到的部分 -o 选项

[root@localhost ~]# echo this is a test line. | grep -o -E "[a-z]+\."
line.
[root@localhost ~]# echo this is a test line. | egrep -o "[a-z]+\."
line.

18)统计文件或者文本中包含匹配字符串的行数 -c 选项

grep -c "text" file_name

19)输出包含匹配字符串的行数 -n 选项

grep "text" -n file_name
或
cat file_name | grep "text" -n

#多个文件
grep "text" -n file_1 file_2

20)搜索多个文件并查找匹配文本在哪些文件中

grep -l "text" file1 file2 file3...

4、grep递归搜索文件

1)在多级目录中对文本进行递归搜索

grep "text" . -r -n
# .表示当前目录

2)忽略匹配样式中的字符大小写

[root@localhost ~]# echo "hello world" | grep -i "HELLO"
hello world

3)选项 -e 制动多个匹配样式

[root@localhost ~]# echo this is a text line | grep -e "is" -e "line" -o
is
is
line
#也可以使用-f选项来匹配多个样式,在样式文件中逐行写出需要匹配的字符。
[root@localhost myfolder]# cat patfile
aaa
bbb
[root@localhost myfolder]# echo aaa bbb ccc ddd eee | grep -f patfile -o
aaa
bbb

4)在grep搜索结果中包括或者排除指定文件

#只在目录中所有的.php和.html文件中递归搜索字符"main()"
grep "main()" . -r --include *.{php,html}

#在搜索结果中排除所有README文件
grep "main()" . -r --exclude "README"

#在搜索结果中排除filelist文件列表里的文件
grep "main()" . -r --exclude-from filelist

5)grep静默输出

grep -q "test" filename
#不会输出任何信息,如果命令运行成功返回0,失败则返回非0值。一般用于条件测试。

6)打印出匹配文本之前或者之后的行

#显示匹配某个结果之后的3行,使用 -A 选项:
[root@localhost myfolder]# seq 10 | grep "5" -A 3
5
6
7
8

#显示匹配某个结果之前的3行,使用 -B 选项:
[root@localhost myfolder]# seq 10 | grep "5" -B 3
2
3
4
5

#显示匹配某个结果的前三行和后三行,使用 -C 选项:
[root@localhost myfolder]# seq 10 | grep "5" -C 3
2
3
4
5
6
7
8

#如果匹配结果有多个,会用“--”作为各匹配结果之间的分隔符:
[root@localhost myfolder]# echo -e "a\nb\nc\na\nb\nc" | grep a -A 1
a
b
--
a
b

三、sed命令

sed 是一种在线编辑器,它一次处理一行内容。处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”(pattern space),接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下一行,这样不断重复,直到文件末尾。文件内容并没有改变,除非你使用重定向存储输出。Sed主要用来自动编辑一个或多个文件;简化对文件的反复操作;编写转换程序等。

1、基本语法

sed [选项]... '{命令}' [输入文件]...
  • 选项:控制sed的行为,如-i直接修改文件内容,-e允许多个编辑命令等。
  • 命令:用单引号括起来,指定要对文本执行的操作。
  • 输入文件:指定sed要处理的文件。如果未指定文件,sed将从标准输入读取数据。

2、常用选项

  • -e:添加一个编辑命令。
  • -f:从文件中读取编辑命令。
  • -i:直接修改文件内容。
  • -n:抑制默认输出,只输出被明确指定的行。
  • -r:启用扩展正则表达式支持。
  • -u:以原子方式更新文件(与 -i 一起使用)。

3、命令格式

sed 命令的基本格式是:

[address][,address] command
  • address:可以是行号或正则表达式,用于指定命令作用的范围。
  • command:要执行的操作。

4、常用命令

  • p:打印匹配的行。
  • d:删除匹配的行。
  • s:替换文本。
  • i:在指定行之前插入文本。
  • a:在指定行之后追加文本。
  • c:替换匹配的行。

5、示例

1)打印文件的前几行

sed -n '1,5p' filename

-n选项和p命令一起使用,仅打印被p命令指定的行(这里是前1~5行)。

2)删除文件中的空行

sed '/^$/d' filename

使用正则表达式/^$/匹配空行,d命令删除这些行。

3)替换文本

sed 's/old/new/g' filename

将文件中的"old"替换为"new"。g标志表示全局替换(即每行中的所有匹配项)。

4)直接修改文件(危险动作,注意确认)

sed -i 's/old/new/g' filename

-i选项允许sed直接修改文件内容,而不是输出到标准输出。

5)在特定行之前或之后插入文本

sed '3i\New line' filename  # 在第3行之前插入"New line"  
sed '3a\New line' filename  # 在第3行之后追加"New line"

6)替换整行

sed '3c\This is a new line' filename

将第3行替换为"This is a new line"。

7)替换字符串并保存结果

sed -i 's/pattern/replacement/g' file.txt

这将直接修改 file.txt 文件中的内容。

8)读取多个文件并应用相同的编辑

sed 's/pattern/replacement/g' file1.txt file2.txt

9)使用多个编辑命令

sed -e 's/pattern1/replacement1/g' -e 's/pattern2/replacement2/g' file.txt

10)使用行号指定编辑范围

sed '1,10 s/pattern/replacement/g' file.txt

11)以行为单位的新增/删除

将 ./file 的内容列出并且打印行号,同时删除2~5行内容:

[root@localhost myfolder]# nl ./file | sed '2,5d'
     1  11
     6  66
     7  77
     8  88
     9  99
......

因为2~5行内容被删除了,所以就不显示2~5行的内容了。

只要删除第 2 行:

[root@localhost myfolder]# nl ./file | sed '2d'
     1  11
     3  33
     4  44
     5  55
     6  66
......

要删除第 10 到最后一行:

[root@localhost myfolder]# nl ./file | sed '10,$d'
     1  11
     2  22
     3  33
     4  44
     5  55
     6  66
     7  77
     8  88
     9  99

在第2行后面加上[drink tea]字样:

[root@localhost myfolder]# nl ./file | sed '2a drink tea'
     1  11
     2  22
drink tea
     3  33
     4  44
     5  55
     6  66
     7  77
     8  88
     9  99
......

在第2行前面加上[drink tea]字样:

[root@localhost myfolder]# nl ./file | sed '2i drink tea'
     1  11
drink tea
     2  22
     3  33
     4  44
     5  55
     6  66
     7  77
......

如果要增加两行以上,例如:[Drink tea or …..]与[drink beer?]:

[root@localhost myfolder]# nl ./file | sed '2a Drink tea or ......\
> drink beer?'
     1  11
     2  22
Drink tea or ......
drink beer?
     3  33
     4  44
     5  55
...省略...

每一行之间都必须要以反斜杠“\”来进行新行的添加。

12)以行为单位的替换与显示

将第2~5行的内容替换为[No 2~5]:

[root@localhost myfolder]# nl ./file | sed '2,5c No 2~5'
     1  11
No 2~5
     6  66
     7  77
     8  88
......

通过这个方法我们就能够将数据整行取代了!

仅列出 ./file 文件内的第 5~7 行内容:

[root@localhost myfolder]# nl ./file | sed -n '5,7p'
     5  55
     6  66
     7  77

13)数据的搜寻并显示

搜索 ./file 有aa关键字的行,并且只输出匹配的行:

[root@localhost myfolder]# nl ./file | sed -n '/aa/p'
    17  aa
    32  dsaaaaaaaaaassdasdassdadadssdasdasd3213213213
    37  Gaaa
    59  aaaaa

其中使用-n表示只打印匹配的行。

14)数据的搜寻并删除

删除 ./file 所有包含“22”的行,其他行输出:

[root@localhost myfolder]# nl ./file | sed '/22/d'
     1  11
     3  33
     4  44
     5  55
     6  66
......

15)数据的搜寻并执行命令

搜索 ./file 文件找到root对应的行,执行后面花括号中的一组命令,每个命令之间用分号分隔,这里把 test 替换为 testNew,再输出这行:

[root@localhost myfolder]# nl ./file | sed -n '/root/{s/test/testNew/;p}'
    32  testNew admin root

如果只替换 ./file 的第一个 test 关键字为 testNew ,就退出:

[root@localhost myfolder]# nl ./file | sed -n '/test/{s/test/testNew/;p;q}'
    32  testNew admin root

最后的q表示退出。

16)数据的搜寻并替换

除了整行的处理模式之外,sed 还可以用行为单位进行部分数据的搜寻并取代。基本上 sed 的搜寻、替代与 vi 类似:

sed 's/要被取代的字串/新的字串/g'

四、awk命令

awk是行处理器:相比较屏幕处理的优点,在处理大文件时不会出现内存溢出或是处理缓慢的问题,通常用来格式化文本信息。

awk处理过程:依次对每一行进行处理,然后输出。

1、基本语法

awk [options] 'pattern {action}' [filename]
  • options:命令行选项,用于控制awk的工作方式。这些选项包括设置字段分隔符、定义变量等。
  • pattern:模式匹配,用于指定哪些行或记录需要被处理。模式可以是正则表达式、条件表达式或布尔表达式。如果省略pattern,则对所有行执行action。
  • action:当模式匹配成功时,需要执行的命令或语句。这些命令或语句可以是内置的awk命令,也可以是自定义的代码块。
  • filename:指定要处理的文件名。如果省略,则默认从标准输入读取。

2、常用选项

  • -F fs 或 --field-separator=fs:设置字段分隔符,默认为空格。
  • -v var=val 或 --assign=var=val:定义变量及其初始值。
  • -f script-file 或 --file=script-file:从文件中读取awk脚本。
  • -i inplace 或 --inplace:直接在原文件上修改(注意:这个选项在GNU awk中可能不被支持,需要使用其他工具如sed实现)。
  • -n 或 --non-decimal-data:允许非十进制数被识别。
  • -W interactive 或 --interactive:以交互模式运行。

3、脚本语法

awk 脚本通常由模式(pattern)和动作(action)组成。基本形式为:

pattern { action }
  • pattern:一个表达式,如果为真,则执行 action。
  • action:一组要执行的命令。

如果省略 pattern,则默认为 true,意味着 action 将应用于每一行。

4、内置变量

awk 提供了一些内置变量来简化脚本编写:

  • ARGC:命令行参数的数量。
  • ARGV:命令行参数的数组。
  • ENVIRON:环境变量的数组。
  • FILENAME:当前文件名。
  • FNR:当前文件中的记录编号。
  • FS:字段分隔符。
  • NF:当前记录中的字段数量。
  • NR:所有处理过的记录总数。
  • OFS:输出字段分隔符。
  • ORS:输出记录分隔符。
  • RS:输入记录分隔符。

5、函数

awk 提供了多种内置函数来处理文本和数值数据:

  • print:输出数据。
  • printf:格式化输出数据。
  • getline:从文件中读取一行。
  • split:分割字符串到数组。
  • gsub:全局替换。
  • match:正则表达式匹配。
  • rand 和 srand:生成随机数。
  • sqrt, exp, log, sin, cos, atan2:数学函数。
  • tolower 和 toupper:转换字符串为小写或大写。
  • length:返回字符串长度。
  • index:返回子字符串的位置。
  • substr:获取子字符串。
  • mktime:转换日期字符串为时间戳。

6、awk命令形式

awk [-F|-f|-v] 'BEGIN{} /pattern/ {command1;command2} END{}' [filename]
  • [-F|-f|-v]  大参数,-F指定分隔符,-f调用脚本,-v定义变量 var=value
  • ' '  引用代码块
  • BEGIN  初始化代码块,在对每一行进行处理之前,初始化代码,主要是引用全局变量,设置FS分隔符
  • /pattern/  匹配代码块,可以是字符串或正则表达式
  • {}  命令代码块,包含一条或多条命令
  • ;  多条命令使用分号分隔
  • END  结尾代码块,在对每一行进行处理之后再执行的代码块,主要是进行最终计算或输出结尾摘要信息
  • [filename]  需要处理的文件

7、特殊要点

$0 表示整个当前行
$1 每行第一个字段
$n 当前记录的第n个字段,字段间由FS分隔
NF 字段数量变量
NR 每行的记录号,多文件记录递增
FNR 与NR类似,不过多文件记录不递增,每个文件都从1开始
\t 制表符
\n 换行符
FS BEGIN时定义分隔符(默认是任何空格)
RS 输入的记录分隔符, 默认为换行符(即文本是按一行一行输入)
~ 匹配,与==相比不是精确比较
!~ 不匹配,不精确比较
== 等于,必须全部相等,精确比较
!= 不等于,精确比较
&& 逻辑与
||  逻辑或
OFS 输出字段分隔符, 默认也是空格,可以改为制表符等
ORS 输出的记录分隔符,默认为换行符,即处理结果也是一行一行输出到屏幕
-F'[:#/]' 定义三个分隔符

8、示例

1) 打印所有行

awk '{print}' file.txt

2)打印特定列

awk '{print $1}' file.txt  # 打印第一列

3)计算总和

awk '{sum += $1} END {print sum}' numbers.txt

4)过滤特定模式

awk '/pattern/ {print}' file.txt

5)使用多个模式

awk '/pattern1/ || /pattern2/ {print}' file.txt

6)自定义分隔符

awk -F: '{print $1}' /etc/passwd  # 使用冒号作为分隔符,打印/etc/passwd文件的第一列(用户名)

9、注意事项

  • awk默认按行处理文本,并使用空格作为字段分隔符。
  • awk支持变量定义、流程控制(如if、else、for、while)、数学函数和字符串函数等高级功能。
  • awk还提供了BEGIN和END两个特殊的模式块,BEGIN块在读取任何输入行之前执行,END块在读取完所有输入行之后执行。
  • awk中的$0代表整行文本,$1、$2、$3...代表第一个、第二个、第三个字段等。
  • awk还包含一些内置变量,如NR(当前记录号,即行号)、NF(当前记录的字段数,即每行的列数)等。

这些只是 awk 基础使用的冰山一角。awk 的功能非常强大,可以编写复杂的脚本来处理各种各样的任务。

 

此文由博主精心撰写转载请保留此原文链接:https://www.cnblogs.com/xyh9039/p/18337347

版权声明:如有雷同纯属巧合,如有侵权请及时联系本人修改,谢谢!!! 

标签:文件,grep,命令,sed,awk,file
From: https://www.cnblogs.com/xyh9039/p/18337347

相关文章

  • Windows命令行基础
    一、什么是命令行命令行的基本概念命令行是一种通过在文本界面输入指令来与计算机进行交互的方式。用户可以通过命令行输入特定的命令来执行各种操作,例如文件管理、系统管理和网络操作等。命令行与图形界面的区别与图形界面相比,命令行更加灵活高效,可以直接通过指令完成任......
  • Java学习笔记3--java编译和运行的CMD命令
    windows下利用cmd命令行可以调用jdk里的javac.exe和java.exe对java文件进行编译和执行,前提是jdk已成功安装并正确配置相关环境变量执行命令解析:javac命令用于将java源文件编译为class字节码文件,如:javacHelloWorld.java。运行javac命令后,如果成功编译没有错误的话,会出现......
  • Linux命令总结
    linux命令大全常用快捷命令 停止进程:ctrl+c 清屏:ctrl+l或者clear 彻底清屏:reset 提示和补全功能:tab 切换至以前执行过的命令:↑和↓ CentOS切换至命令行界面:ctrl+alt+F2 CentOS切换至图形界面:ctrl+alt+F1Vim快捷操作 跳到末尾:shift+g 跳到开头:g主机......
  • JDK自带命令:深入理解Java程序的运行机制
    JDK(JavaDevelopmentKit)是Java开发和运行环境的核心,它提供了丰富的命令和工具来帮助我们更好地理解和控制Java程序的运行。本文将详细介绍JDK自带的一些关键命令,以及它们的详细参数和执行结果。1.jps(JavaVirtualMachineProcessStatusTool)jps命令用于列出正在运行的......
  • 京粉智能推广助手-LLM based Agent在联盟广告中的应用与落地
    一、前言拥有一个帮你躺着赚钱的助手,听起来是不是有点心动?依托于京东联盟广告平台,借助AIGC大语言模型出色的理解、推理、规划能力,我们推出了京粉智能推广助手机器人,帮助合作伙伴拥有自己的智能助理,为京东联盟的推客提供更加智能的一站式经营服务。1、京东联盟是什么?《京东联盟......
  • Linux常用基础命令
    1.1Linux系统的文件结构1/bin二进制文件,系统常规命令2/boot系统启动分区,系统启动时读取的文件3/dev设备文件4/etc大多数配置文件5/home普通用户的家目录6/lib32位函数库7/lib6464位库8/media......
  • 使用adb命令安装安卓apk包
       虽然网上也有许多adb安装安卓包的教程,但经过自己亲自试了一下后,觉得自己写下来的才是自己的收获。一、下载安装adb工具    下载地址有很多,这里是我下载的地址:https://pan.baidu.com/s/1mgGkNZM,下载文件比较齐全。    下载后是个压缩包,解压后一共有5......
  • Android studio报错 Caused by: org.gradle.api.internal.plugins.PluginApplicationE
    Androidstudio报错Causedby:org.gradle.api.internal.plugins.PluginApplicationExceptionAndroidstudio运行报错:Causedby:org.gradle.api.internal.plugins.PluginApplicationException:Failedtoapplyplugin[id‘com.android.application’]解决方法:在项......
  • Docker命令
    一、卸载1)systemctlstopdocker2)yum-yremovedocker-ce3)rm-rf/var/lib/docker 二】常用命令1)systemctldaemon-reload2)systemctlrestartdocker3)dockerinfo4)dockerimages5)systemctlstatusdocker6)dockersearchhello-world7)dockerpul......
  • grep命令详解
    grep是Linux和Unix系统中用于搜索文本的强大命令之一。它通过指定的模式(通常是正则表达式)在文件或标准输入中搜索匹配的行,并输出这些行。基本用法grep[选项]PATTERN[FILE...]PATTERN:要搜索的模式(字符串或正则表达式)。[FILE…]:要搜索的文件名列表。如果省略文件......