QQ个性网:专注于分享免费的QQ个性内容

关于我们| 网站公告| 广告服务| 联系我们| 网站地图

搜索
编程 JavaScript Java C++ Python SQL C Io ML COBOL Racket APL OCaml ABC Sed Bash Visual Basic Modula-2 Logo Delphi IDL Groovy Julia REXX Chapel X10 Forth Eiffel C# Go Rust PHP Swift Kotlin R Dart Perl Ruby TypeScript MATLAB Shell Lua Scala Objective-C F# Haskell Elixir Lisp Prolog Ada Fortran Erlang Scheme Smalltalk ABAP D ActionScript Tcl AWK IDL J PostScript IDL PL/SQL PowerShell

linux三剑客精妙招式都汇总在本文了(建议收藏)

日期:2025/04/08 13:12来源:未知 人气:59

导读:#教育优质作者发文挑战赛#熟悉linux的都知道,linux中有著名的三个命令,即grep、sed、awk。这三个命令被称为linux三剑客。三剑客包含各种招式众多,熟练掌握这三个命令的用法,将大大提高我们对文件的处理速度,大大提升运维效率。本文通过具体实例,给大家分享linux三剑客grep、sed、awk相关的精妙招式,让你真正融合三剑客相关的武功招式,真正快速行走于lin......

教育优质作者发文挑战赛

熟悉linux的都知道,linux中有著名的三个命令,即grep、sed、awk 。这三个命令被称为linux三剑客。三剑客包含各种招式众多,熟练掌握这三个命令的用法,将大大提高我们对文件的处理速度,大大提升运维效率。

本文通过具体实例,给大家分享linux三剑客grep、sed、awk相关的精妙招式,让你真正融合三剑客相关的武功招式,真正快速行走于linux江湖之中,做一个人人敬仰的侠客。

一、linux三剑客之grep

我通常把grep的招式比作横扫千军式 ,是因为它可以在众多文件中找到你想要的任何一个关键部分,这就类似于千军万马中取谁首级就取谁的!

grep是一种文本搜索工具,它通过用户指定的过滤条件(模式),对目标文本进行逐行匹配检查,打印出匹配到的行。

1、grep命令用法如下:

grep [参数选项] [过滤条件] 文件

其常见的参数选项如下:

-V:表示排除匹配结果;-n:表示显示匹配行与行号;-i:表示不区分大小写,即忽略大小写进行匹配;-c:表示只统计匹配的行数;-E:表示支持使用扩展的正则表达式元字符。-w:表示只匹配过滤到的单词;-o:表示只输出匹配到的内容;--color=auto:表示为过滤结果添加颜色。

2、grep实战场景 ---

以下通过实战让大家对grep招式不再陌生。

1)找出文件haodao.txt中与haodao有关的内容,并且忽略大小写 ,命令如下:

[root@haodaolinux1 ~]# grep -i "haodao" haodao.txt HAODAOhaodao1:x:1000:1000::/home/haodao1:/bin/bashhaodao2:x:1002:1002::/home/haodao2:/bin/bashhaodao3:x:1003:1003::/home/haodao3:/bin/bash

2)找出文件haodao.txt中与haodao有关的内容,并且忽略大小写,加上行号显示 ,命令如下:

[root@haodaolinux1 ~]# grep -i -n "haodao" haodao.txt 6:HAODAO29:haodao1:x:1000:1000::/home/haodao1:/bin/bash35:haodao2:x:1002:1002::/home/haodao2:/bin/bash36:haodao3:x:1003:1003::/home/haodao3:/bin/bash

3)统计出文件haodao.txt中与haodao有关内容的行,忽略大小写,并且只显示行数 ,命令如下:

[root@haodaolinux1 ~]# grep -i -c "haodao" haodao.txt

4)找出文件haodao.txt中存在的空行,并且将行号打印出来 ,命令如下:

[root@haodaolinux1 ~]# grep "^$" haodao.txt -n

5)找出文件haodao.txt中存在的空行,并且将空行排除,打印除空行外的内容 ,命令如下:

[root@haodaolinux1 ~]# grep "^$" haodao.txt -n -v1:root:x:0:0:root:/root:/bin/bash2:ROOT:x:1:1:bin:/bin:/sbin/nologin3:root5:ROOT6:HAODAO7:haohao9:haohaolinux10:daemon:x:2:2:daemon:/sbin:/sbin/nologin11:#linux13:#1234567815:adm:x:3:4:adm:/var/adm:/sbin/nologin16:lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin17:sync:x:5:0:sync:/sbin:/bin/sync18:shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown19:halt:x:7:0:halt:/sbin:/sbin/halt20:mail:x:8:12:mail:/var/spool/mail:/sbin/nologin21:operator:x:11:0:operator:/root:/sbin/nologin22:games:x:12:100:games:/usr/games:/sbin/nologin23:ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin24:nobody:x:99:99:Nobody:/:/sbin/nologin25:avahi-autoipd:x:170:170:Avahi IPv4LL Stack:/var/lib/avahi-autoipd:/sbin/nologin26:systemd-bus-proxy:x:999:997:systemd Bus Proxy:/:/sbin/nologin27:systemd-network:x:998:996:systemd Network Management:/:/sbin/nologin28:dbus:x:81:81:System message bus:/:/sbin/nologin29:polkitd:x:997:995:User for polkitd:/:/sbin/nologin30:tss:x:59:59:Account used by the trousers package to sandbox the tcsd daemon:/dev/null:/sbin/nologin31:postfix:x:89:89::/var/spool/postfix:/sbin/nologin32:sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin33:haodao1:x:1000:1000::/home/haodao1:/bin/bash34:mysql:x:1001:1001::/home/mysql:/sbin/nologin35:zabbix:x:996:992:Zabbix Monitoring System:/var/lib/zabbix:/sbin/nologin36:apache:x:48:48:Apache:/opt/rh/httpd24/root/usr/share/httpd:/sbin/nologin37:ntp:x:38:38::/etc/ntp:/sbin/nologin38:tcpdump:x:72:72::/:/sbin/nologin39:haodao2:x:1002:1002::/home/haodao2:/bin/bash40:haodao3:x:1003:1003::/home/haodao3:/bin/bash

6)找出文件haodao.txt中,没有以#开头的行,并且也不是空行的内容 ,命令如下:

grep "^#" haodao.txt -v |grep "^$" -v

3、grep正则表达式元字符集整理:

^ :锚定行的开始 如:’^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。

\ <word :以某单词开头

word\ > :以某单词结尾

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 :匹配文字和数字字符

\b :单词锁定符,如: ‘\bgrep\b’只匹配grep。

4、grep结合正则表达式用法:

1)在文件haodao.txt中找出以haodao结尾的行 ,命令如下:

[root@haodaolinux1 ~]# grep -n "haodao$" haodao.txt 21:operator:x:11:0:operator:/root:/sbin/haodao28:dbus:x:81:81:System message bus:/:/sbin/haodao32:sshd:x:74:74:Privilege-separated SSH:haodao

2)找出文件haodao.txt中包含大写字母有关的行 ,命令如下:

[root@haodaolinux1 ~]# grep -n [A-Z] haodao.txt

2:ROOT:x:1:1:bin:/bin:/sbin/nologin5:ROOT6:HAODAO23:ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin24:nobody:x:99:99:Nobody:/:/sbin/nologin25:avahi-autoipd:x:170:170:Avahi IPv4LL Stack:/var/lib/avahi-autoipd:/sbin/nologin26:systemd-bus-proxy:x:999:997:systemd Bus Proxy:/:/sbin/nologin27:systemd-network:x:998:996:systemd Network Management:/:/sbin/nologin28:dbus:x:81:81:System message bus:/:/sbin/haodao29:polkitd:x:997:995:User for polkitd:/:/sbin/nologin30:tss:x:59:59:Account used by the trousers package to sandbox the tcsd daemon:/dev/null:/sbin/nologin32:sshd:x:74:74:Privilege-separated SSH:haodao

二、linux三剑客之sed

sed 简称流编辑器,即stream editor的缩写。sed是一个操作、过滤和转换文本内容的强大工具 。常用的功能有通过结合正则表达式对文件实现快速的增删改查。最常用的查询功能是过滤(过滤指定字符串)、取行(取出指定行)。

1、sed常用语法如下:

sed [选项参数] [sed内置命令字符] 文件

1)sed常用参数选项 如下:

-n:表示取消默认的sed输出,通常与sed内置命令p一起使用;-i:表示直接将修改结果写入文件,如果不加-i,sed修改的是内存数据;-e:表示多次编辑,不需要管道符号;-r:表示支持正则表达式;

2)sed内置的命令字符 ,主要是用于对文件进行增删改查等操作,常见内置命令字符有:

a:表示对文本进行追加操作,在指定行后面添加一行或多行文本;d:表示删除匹配行;i:表示插入文本,在指定行前添加一行或多行文本;p:表示打印匹配行内容,通常与-n一同使用;s/正则/替换内容/g:表示匹配正则内容,然后替换内容(支持正则表达式),结尾g表示全局匹配;

3)sed匹配范围主要有:

空地址:表示全文处理;单地址:表示指定文件某一行;/pattern/:表示被模式匹配到的每一行;范围区间:如12,22表示十二行到二十二行,如12,+5表示第12行向下5行;步长:如1~2,表示1,3,5,7,9行;2~2,表示2,4,6,8,10行;

2、以下通过实际例子来练习,加深大家对sed命令的用法。

准备一个haotest01.txt文件 ,文件内容如下:

1)通过sed命令输出1行向下4行的数据 ,命令如下所示:

[root@haodaolinux1 ~]# sed "1,+4p" -n haotest01.txt He is a good BOY.she is a girl !I have a dream.We will study linux.we will study Python.

2)通过sed命令输出文件中的4到6行数据 ,命令如下所示:

[root@haodaolinux1 ~]# sed "4,6p" -n haotest01.txt We will study linux.we will study Python.So we will go study together.

3)通过sed命令输出有study字符串的行 ,命令如下所示:

[root@haodaolinux1 ~]# sed "/study/p" -n haotest01.txt We will study linux.we will study Python.So we will go study together.

4)通过sed命令将文件中的good修改替换为bad ,并且输出,命令如下所示:

[root@haodaolinux1 ~]# sed "s/good/bad/g" haotest01.txt He is a bad BOY.she is a girl !I have a dream.We will study linux.we will study Python.So we will go study together.[root@haodaolinux1 ~]# cat haotest01.txt He is a good BOY.she is a girl !I have a dream.We will study linux.we will study Python.So we will go study together.

此时发现只是修改输出,原文件并没有实际替换成功,这是因为sed只是修改替换内存中的数据,要加上-i才能修改原文件内容 ,命令如下所示:

[root@haodaolinux1 ~]# sed "s/good/bad/g" -i haotest01.txt [root@haodaolinux1 ~]# cat haotest01.txt He is a bad BOY.she is a girl !I have a dream.We will study linux.we will study Python.So we will go study together.[root@haodaolinux1 ~]#

如果需要在一行中多次编辑替换多个地方的数据,则要在每个sed编辑语句前加带-e选项参数。

5)通过sed命令在文件的第3行下追加一行数据,内容为:we he he ,命令如下所示:

[root@haodaolinux1 ~]# sed "3a we he he" -i haotest01.txt

替换后原文件内容如下图所示:

这里是通过内置命令符a 在指定行下面追加,如果需要在指定行上面加,则要内置命令符i

如果需要在指定行下追加多行数据,可以在数据中需要换行的地方添加换行符号\n

*6)sed匹配范围空地址的使用,即通过sed命令,在每一行的下面追加5个,** 命令如下所示:

[root@haodaolinux1 ~]# sed "a *****" -i haotest01.txt

追加后内容如下图所示:

三、linux三剑客之awk

awk 相对于其它两个剑客,功能稍微强大点。其有着强大的文本格式化能力,对文本进行复杂处理 ,造就了它独有绝招,同时awk还是一门编程语言,支持条件判断、数组、循环等功能。

1、awk语法如下:

awk [选项参数] '模式[动作]' 文件

这里的动作主要是指awk对文本的一些格式化处理,并且输出格式化处理后的结果,常见有print等,动作写在命令的{} 里面。

1)awk常见参数 有:

-F :表示指定分隔符

-v :表示定义或修改一个awk内置变量;

-f :表示从脚本中读取awk命令;

2)awk有很多内置变量, 可以通过man awk查看,以下是常见的内置变量:

$0 :表示完整的输入记录;

$n :表示指定分隔符后,当前指定的第n个字段;

FS :表示字段输入分隔符,默认以空格为分隔符;

OFS :表示字段输出分隔符;

NF :表示字段的个数,即以分隔符分割后,当前行一共有多少个字段;

NR :表示当前记录数,即行数;

awk涉及内容或语法比较多,想要一篇文章学完是不带现实,以下通过实例讲解它常见的那些招式,让你在日常工作中足以应付自如。

2、准备一个haotest02.txt文件 ,内容如下所示:

先执行以下awk命令,如下所示:

[root@haodaolinux1 ~]# awk '{print $0}' haotest02.txt haodao1 haodao2 haodao3haodao4 haodao5 haodao6haodao7 haodao8 haodao9[root@haodaolinux1 ~]# awk '{print $1}' haotest02.txt haodao1haodao4haodao7[root@haodaolinux1 ~]# awk '{print $2}' haotest02.txt haodao2haodao5haodao8[root@haodaolinux1 ~]#

通过以上awk命令,针对动作{print $0}这里代表一整行输出,针对动作{print $1}代表第一列输出,针对动作{print $2}代表第二列输出

awk默认是以空格符为分隔符 ,不管有多少个空格,也会当成一个来处理。

awk是按行处理文件的,一行处理完毕后,再处理下一行,并且是根据用户指定的分隔符去处理,没有指定分隔符的,则默认以空格来当作分隔符。

1)针对haotest02.txt文件,输出第1列,第3列的内容 ,命令如下所示:

[root@haodaolinux1 ~]# awk '{print $1$3}' haotest02.txt haodao1haodao3haodao4haodao6haodao7haodao9[root@haodaolinux1 ~]# awk '{print $1 $3}' haotest02.txt haodao1haodao3haodao4haodao6haodao7haodao9[root@haodaolinux1 ~]# awk '{print $1,$3}' haotest02.txt haodao1 haodao3haodao4 haodao6haodao7 haodao9[root@haodaolinux1 ~]#

对比看出,动作中$1和$3用逗号,可以以空格输出。

可以添加自定义内容进行输出,如下命令所示:

[root@haodaolinux1 ~]# awk '{print "第1列为:"$1,"第2列为:"$3}' haotest02.txt 第1列为:haodao1 第2列为:haodao3第1列为:haodao4 第2列为:haodao6第1列为:haodao7 第2列为:haodao9[root@haodaolinux1 ~]#

2)针对haotest02.txt文件,输出第1行内容 ,命令如下所示:

[root@haodaolinux1 ~]# awk 'NR==1{print $0}' haotest02.txt haodao1 haodao2 haodao3[root@haodaolinux1 ~]#

3)针对haotest02.txt文件,输出第2行到第3行的内容 ,命令如下所示:

[root@haodaolinux1 ~]# awk 'NR==2,NR==3{print $0}' haotest02.txt haodao4 haodao5 haodao6haodao7 haodao8 haodao9

4)针对haotest02.txt文件,输出第2行到第3行的内容,并且加上行号 ,命令如下所示:

[root@haodaolinux1 ~]# awk 'NR==2,NR==3{print NR,$0}' haotest02.txt 2 haodao4 haodao5 haodao63 haodao7 haodao8 haodao9[root@haodaolinux1 ~]#

5)针对haotest02.txt文件,输出第1列的内容,并且显示出字段数(总列数) ,命令如下所示:

[root@haodaolinux1 ~]# awk '{print $1,NF}' haotest02.txt haodao1 3haodao4 3haodao7 3[root@haodaolinux1 ~]#

6)针对haotest02.txt文件,输出第1列和最后一列的内容 ,命令如下所示:

[root@haodaolinux1 ~]# awk '{print $1,$(NF)}' haotest02.txt haodao1 haodao3haodao4 haodao6haodao7 haodao9[root@haodaolinux1 ~]#

3、自定义分隔符,进行文件格式化后输出。

准备一个haotest03.txt文件,内容如下所示:

1)通过指定输入分隔符,如以:为输入分隔符,输出文件第一列的内容 ,命令如下所示:

[root@haodaolinux1 ~]# awk -F ":" '{print $1}' haotest03.txt rootbindaemonmailntptcpdumphaodao2haodao3[root@haodaolinux1 ~]#

或者通过修改系统默认输入分隔符变量(FS),进行输出 ,命令如下所示:

[root@haodaolinux1 ~]# awk -v FS=':' '{print $1}' haotest03.txt rootbindaemonmailntptcpdumphaodao2haodao3[root@haodaolinux1 ~]#

2)通过修改默认输出分隔符变量(OFS),输出文件第一列和最后一列内容,并且两列之间就是通过输出分隔符隔开的 ,命令如下所示:

[root@haodaolinux1 ~]# awk -F ":" -v OFS='' '{print $1,$NF}' haotest03.txt root/bin/bashbin/sbin/nologindaemon/sbin/nologinmail/sbin/nologinntp/sbin/nologintcpdump/sbin/nologinhaodao2/bin/bashhaodao3*****/bin/bash[root@haodaolinux1 ~]#

结语

本文通过各种实例引出三剑客各自独有的武功招式,就类似给大家呈现了绝世剑谱。俗话说的好,勤能补拙。了解江湖的都知道,一个武林高手,即所得武功绝不是一日就可以达成。必须通过不断磨练,方能成就他日的非凡成就。所以针对以上三剑客的精华妙招,我们也要通过自己不断去敲命令,方能为自己所用,真正成为武林高手!

转自:https://www.sohu.com/a/506941295_121124371

Sed排行

关于我们|网站公告|广告服务|联系我们| 网站地图

Copyright © 2002-2023 某某QQ个性网 版权所有 | 备案号:粤ICP备xxxxxxxx号

声明: 本站非腾讯QQ官方网站 所有软件和文章来自互联网 如有异议 请与本站联系 本站为非赢利性网站 不接受任何赞助和广告