Linux 三剑客(grep、sed、awk)

grep

%全文搜索

Linux 命令三剑客,sed、grep、awk。

sed:擅长数据修改。
grep:擅长数据查找定位。
awk:擅长数据切片,数据格式化,功能最复杂

基本正则表达式元字符
元字符 功能 例子 匹配结果

字符的匹配 . 匹配单个任意字符 /l.ve/ love、live...

. :代表着任意一个字符

“*”:代表的是重复零个或者多个前面的单个字符,“o*”表示拥有零个或大于等于一个“o”的字符,因为允许空字符,所以执行”grep -n ‘o*’ a.txt“会将文本中所有内容都输出打印,”oo*“表示第一个o必须存在,第二个o则是零个或多个o;”ooo*“表示第一个和第二个o必须存在,第三o则是零个或多个

查找连续字符范围,“{}”可以限制一个范围内的重复的字符串,因为在shell中{}有特殊意义,所以使用“{}“字符时,需要利用转义字符”\",将”{}”字符转换成普通字符

grep "r\{2\}" a.txt 
Error 
error

  • 查询包含两个r字符的行

[] 匹配括号内的任意单个字符 /l[Oo]ve/ love、lOve
[x-y] 表示匹配一段范围中的任意一个字符 /l[a-d]ve/ lave、lbve、lcve、ldve
[0-9] 匹配0-9中的任意一个字符
[1-9][0-9] 匹配10-99中的任意一个字符
[a-z] 匹配a-z中的任意一个字符
[A-Z] 匹配A-Z中的任意一个字符
[0-9a-zA-Z] 匹配a-zA-Z0-9中的任意一个字符

.*匹配任意长度的字符串

\+ 匹配前面的字符至少出现一个

[^] 表示取反 /l[^a-c]ve/ 匹配除lave、lbve、lcve以外的其他字符

次数的匹配 * 匹配0个或多个它前面的字符 /l*ve/ ve、 lve、llve....


x\{m\} x是字符或字符串,m是一个数字 /r\{2\}/ 匹配 rr
匹配x出现m次
x\{m,\} 匹配x出现至少m次 /r\{2,\}/ 匹配 rr、rrr、rrrr...
x\{m,n\} 匹配x出现m次到n次 /r\{3,5\}/ 匹配rrr、rrrr、rrrrr
x\{0,n\} 匹配x出现最多n次 /r\{0,3\}ve/ 匹配ve、rve、rrve、rrrve

位置的定位 ^ 行首定位符 /^root/ 匹配行首的root字符串
$ 行尾定位符 /bash$/ 匹配行尾bash字符串
\< 词首定位符 /\<love/ 匹配到love、lover...
\b /\blove/ 匹配到love、lover...
\> 词尾定位符 love\> 匹配到aalove、inlove...
\b love\b 匹配到aalove、inlove...


\ 用来转义元字符 /2\.5/ 匹配2.5
\| 或者 /a\|b/ 匹配a或者是b

扩展正则表达式元字符
       元字符         功能                                      例子      匹配结果
        ?                表示0个或1个它前面的字符     /a?d/   ad d  aad
        +                表示1个或多个它前面的字符    /a+d/  ad d  aad ...   
        |                 或者                                        /a|b/   a  b  aa
        ()                将括号内的内容作为一个单位来看,内容可以是字符串也可以是一种模式   
        (..)(..) \1\2  引用前面的第#个“(”和与之对应的“)”中的模式匹配到的内容  #-->1~9     \1
       x{m}         x是字符或字符串,m是一个数字 
                           匹配x出现m次        
       x{m,}        匹配x出现至少m次
       x{m,n}      匹配x出现m次到n次
       x{0,n}       匹配x出现最多n次  

02 grep 命令常用可选参数
-n # 显示行号。 
-i # 不区分大小写。

-o 仅显示匹配的字串
-c # 统计匹配行,命中查找字符串的总行数。
-v # 显示不包含匹配文本的所有行。
-r # 递归处理。

-e # 实现多个逻辑之间的关系or 

grep -e root -e bash /etc/passwd
-E # 使用正则表达式作为匹配进行查找(注:-e 没有-E 支持的完整)。
--include # 指定匹配的文件类型。
--exclude # 过滤不需要匹配的文件类型。 使用示例:

-A 匹配内容后面几行

-B 匹配内容前面几行

-C 匹配内容前后几行

grep -in "ERROR" info.log #不区分大小写,并显示行号

grep 同时查找多个文件
grep -in "key"  access.log  error.log # 从文件access.log 和 error.log 查找字符串"key",不区分大小写,并显示行号

 grep 递归查找
前面已经总结过,-r/R参数,即 recursion,递归的意思。

grep -rn "key" * # 递归查询当前目录及其子目录所有文件中包含字符串"key",并显示对应的行号。

grep 命令,擅长查找字符串,正向查找,反向查找,正则查找,多文件查找,递归查找等。

用grep 过滤出以#号开头的和空行的行

1、grep -nv '^$'| grep -v '^#' /etc/hosts 

2、grep -nv '^#\|^$' /etc/hosts

3、grep -n '^[^#]' /etc/hosts

查看时间节点的日志

grep "2021/05/18 15:20:5[1-5]" logfile
grep "2021-05-18 15:2[1-5]" logfile
grep "31/May/2021:19:3[1-5]" logfile
grep "2[3-7]/May/2021" logfile 按照天数过滤

过滤IP

 egrep -o "([0-9]{1,3}\.){3}[0-9]" 

grep -o "[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]" secure

grep -E  "([0-9]{1,3}\.){3}[0-9]" secure 

ifconfig eth0 | grep -w inet | tr -d '[a-zA-Z]'| tr -s " " | cut -d " " -f2
 

rename命令 批量修改文件名

rename命令用字符串替换的方式批量改变文件名。

格式:rename  原名  替换名  要改的文件 

命令格式  
    sed   [options]    'command'      file(s)  

1、选项说明
-i:直接修改文件内容,而不是输出到终端。
 
-n:安静模式,屏蔽默认输出(全部文本),只有经过sed特殊处理的那一行才会被列出来。
-e :指定sed动作,可以由多个-e指定多个动作。
 
-r:启用扩展的正则表达式,若与其他选项一起使用,应作为首个选项
 
-f :直接将sed的动作写在一个文件内,-f filename则可以运行filename 内的sed动作;
 
--help:显示帮助。
 
--version:显示版本。
 
-{}:可组合多个命令,以分号分隔
 

1. 删除操作

sed '2d' file_name 删除file_name文件的第二行  

sed '2,$d' file_name 删除file_name文件的第二行到末尾所有行  

sed '/test/'d file_name 删除file_name文件所有包含test的行  

2. 替换操作 

sed '作用范围s/替换查找目标/替换成为/替换目标option' 文件名

# 替换字符串,并更改原文件内容
# 在sed后面加 -i,即编辑文档“edit files in place”选项
sed -i '作用范围s/替换查找目标/替换成为/替换目标option' 文件名

sed 's/a/b/g' file         在整行范围内把a替换为b  

(    s  作用范围在全局   )
sed -n 's/^a/b/p' file   (-n)选项和p标志表示只打印替换的行  

指定行,写上行号;指定某行到某行,用逗号连接行号

# 作用范围在第1行
sed '1s/cat/dog/g' pet.txt

# 作用范围在第6行到第10行
sed '6,10s/cat/dog/g' pet.txt

# 作用范围在第6行到最后一行
sed '6,$s/cat/dog/g' pet.txt

sed '1i 添加的内容' file    #这是在第一行前添加字符串
sed '$i 添加的内容' file    #这是在最后一行行前添加字符串
sed '$a添加的内容' file    #这是在最后一行行后添加字符串
 

sed '1 astring1 string2 ' /etc/passwd   #在第1行后插入两行字符串。

sed '1 istring1 string2 ' /etc/passwd   #在第1行前插入两行字符串

sed -i.bak '/apache/d' /etc/passwd   修改文件时先备份

sed -n '/^#/!p' /etc/fstab   打印非#的行

 sed -Ei.bak '/^#/!s/^/#/g' /etc/fstab  打印非0的行,首行加上#号

替换一行的内容 -c

sed '2c\file already exist!' a.txt 
111 
file already exiF


:s/vivian/sky/ #替换当前行第一个 vivian 为 sky
 
:s/vivian/sky/g #替换当前行所有 vivian 为 sky
 
:n,$s/vivian/sky/ #替换第 n 行开始到最后一行中每一行的第一个 vivian 为 sky
 
:n,$s/vivian/sky/g #替换第 n 行开始到最后一行中每一行所有 vivian 为 sky
 
# (n 为数字,若 n 为 .,表示从当前行开始到最后一行)
 
:%s/vivian/sky/ #(等同于 :g/vivian/s//sky/) 替换每一行的第一个 vivian 为 sky
 
:%s/vivian/sky/g #(等同于 :g/vivian/s//sky/g) 替换每一行中所有 vivian 为 sky
 
# 过滤输出
cat 20200927-9-10_1983712 | egrep '\|2020-09-27 .{8}\|9\|10\|' > 9-10.txt
 
# 取第N个字段,去重排序
cat sdk.log | grep sdk_login | wk -F '|' '{print $20}' | sort | uniq | wc -l
 

给指定行加注释

给1,5行加注释
s/^/#/

sed -i -e "1,5 s/^/#/" hello

截取字符串

 biaobiao=http://www.baidu.com.7777.txt

删除左边的,保留右边的

实例一

echo ${biaobiao#*//}

www.baidu.com.7777.txt----------输出结果

echo ${biaobiao#*.}
baidu.com.7777.txt

echo ${biaobiao##*.}  -----------会删除左边所有复合条件的.
txt
 

%删除右边的保留左边的

biaobiao=http://www.baidu.com.7777.txt

echo ${biaobiao%.*}
http://www.baidu.com.7777

echo ${biaobiao%%.*}
http://www             会删除右边所有复合条件的.

截取起始到结束字符

echo ${biaobiao:0:5}
http:
 

3、打印

sed -n '/k8s/=' sed.task   

## =打印行号

nl会打印出行数(空格不算)

 nl sed.task 
     1    openssh
     2    docker
     3    k8s
       
     4    openssh
     5    docker

 

4、追加 a追加的意思,也可以说是插入

sed -i '3a jenkins' sed.task 
### 在第三行添加一行

sed -i '4a gitlab\nshell' sed.task

###添加多行

awk  '{print "hello,world"}'    字符串一定要加双引号,要不然会认为是变量.

awk 默认是逗号作为空格分隔符。

awk

$0:表示整个文本

$1:表示文本行中的第一个字段

$NF:表示文本行中最后一个数据字段

$NR : 表示行

要求打印第三行

案例1: awk -F: 'NR == 3{print $0} /etc/passwd'

解析: NR : 行号 NR == 3 :

行号等于3

注意: $1 : 是列

NR == 3 : 是行

awk 数学运算

[root@101 scripts]# awk 'BEGIN{print 100+3}'
103
[root@101 scripts]# awk 'BEGIN{print 100/3}'
33.3333
[root@101 scripts]# awk 'BEGIN{print 100-3}'
97
[root@101 scripts]# awk 'BEGIN{print 100*3}'
300
[root@101 scripts]# awk 'BEGIN{print 100%3}'
1
 

cut

 Linux cut命令用于显示每行从开头算起 num1 到 num2 的文字

说明:默认分隔符是制表符。

选项与参数:

-d:分隔符,按照指定分隔符分割列。与 -f 一起使用

-f:依据 -d 的分隔字符将一段信息分割成为数段,用 -f 取出第几段的意思(列号,提取第几列)

-c:以字符 (characters) 的单位取出固定字符区间

-b:以字节为单位进行分割

如果文件里面的某些域是由若干个空格来间隔的,那么用cut就有点麻烦了,因为cut只擅长处理“以一个字符间隔”的文本内容。

tr

Linux tr 命令用于转换或删除文件中的字符。

tr 指令从标准输入设备读取数据,经过字符串转译后,将结果输出到标准输出设备。

参数说明:

  • -c, --complement:反选设定字符。也就是符合 SET1 的部份不做处理,不符合的剩余部份才进行转换
  • -d, --delete:删除指令字符
  • -s, --squeeze-repeats:缩减连续重复的字符成指定的单个字符
  • -t, --truncate-set1:削减 SET1 指定范围,使之与 SET2 设定长度相等
  • --help:显示程序用法信息
  • --version:显示程序本身的版本信息

字符集合的范围:

  • \NNN 八进制值的字符 NNN (1 to 3 为八进制值的字符)
  • \\ 反斜杠
  • \a Ctrl-G 铃声
  • \b Ctrl-H 退格符
  • \f Ctrl-L 走行换页
  • \n Ctrl-J 新行
  • \r Ctrl-M 回车
  • \t Ctrl-I tab键
  • \v Ctrl-X 水平制表符
  • CHAR1-CHAR2 :字符范围从 CHAR1 到 CHAR2 的指定,范围的指定以 ASCII 码的次序为基础,只能由小到大,不能由大到小。
  • [CHAR*] :这是 SET2 专用的设定,功能是重复指定的字符到与 SET1 相同长度为止
  • [CHAR*REPEAT] :这也是 SET2 专用的设定,功能是重复指定的字符到设定的 REPEAT 次数为止(REPEAT 的数字采 8 进位制计算,以 0 为开始)
  • [:alnum:] :所有字母字符与数字
  • [:alpha:] :所有字母字符
  • [:blank:] :所有水平空格
  • [:cntrl:] :所有控制字符
  • [:digit:] :所有数字
  • [:graph:] :所有可打印的字符(不包含空格符)
  • [:lower:] :所有小写字母
  • [:print:] :所有可打印的字符(包含空格符)
  • [:punct:] :所有标点字符
  • [:space:] :所有水平与垂直空格符
  • [:upper:] :所有大写字母
  • [:xdigit:] :所有 16 进位制的数字
  • [=CHAR=] :所有符合指定的字符(等号里的 CHAR,代表你可自订的字符)

cat test.tr_txt |cut -d= -f2 | tr  '\n' +  | grep -Eo '.*[0-9]+' | bc

find

find [查找路径 ...] [查找条件] [处理动作]

还有种表述方式:find PATH OPTION [-exec COMMAND { } \;]

find命令会根据我们给的option

Linux之find exec

-exec参数后面跟的是command命令,它的终止是以;为结束标志的,所以这句命令后面的分号是不可缺少的,考虑到各个系统中分号会有不同的意义,所以前面加反斜杠。

find . -type f -name '*.sh' -exec mv {} /data/scripts/ \;  --刚测试了本地的  

带大家理解一下find查找的以.sh开头的 ;exec 重定向到 {} 里面; 当执行mv的时候、就会把.sh 移动到目标路径里面----; 
 

在option中,具体有参数:

-name ’字串’ 查找文件名匹配所给字串的所有文件,字串内可用通配符 *、?、[ ]。

-lname ’字串’ 查找文件名匹配所给字串的所有符号链接文件,字串内可用通配符 *、?、[ ]。

-gid n 查找属于ID号为 n 的用户组的所有文件。

-uid n 查找属于ID号为 n 的用户的所有文件。

-group ’字串’ 查找属于用户组名为所给字串的所有的文件。

-user ’字串’ 查找属于用户名为所给字串的所有的文件。

-empty 查找大小为 0的目录或文件。

-path ’字串’ 查找路径名匹配所给字串的所有文件,字串内可用通配符*、?、[ ]。

-perm 权限 查找具有指定权限的文件和目录,权限的表示可以如711,644。

-size n[bckw] 查找指定文件大小的文件,n 后面的字符表示单位,缺省为 b,代表512字节的块。

-type x 查找类型为 x 的文件,x 为下列字符之一:

b 块设备文件

c 字符设备文件

d 目录文件

p 命名管道(FIFO)

f 普通文件

l 符号链接文件(symbolic links)

s socket文件

-xtype x 与 -type 基本相同,但只查找符号链接文件。

以文件的大小查找

-size [+/-]#        

{k|M|G}    

-size 2M    0.8M 1M    1.1M    

-size 1k

以时间为条件查找

-amin n 查找n分钟以前被访问过的所有文件。

-atime n 查找n天以前被访问过的所有文件。

-cmin n 查找n分钟以前文件状态被修改过的所有文件。

-ctime n 查找n天以前文件状态被修改过的所有文件。

-mmin n 查找n分钟以前文件内容被修改过的所有文件。

-mtime n 查找n天以前文件内容被修改过的所有文件。

-print:将搜索结果输出到标准输出。

sort

. sort的-u选项

它的作用很简单,就是在输出行中去除重复行。

. sort的-r选项

uniq options filename
-i:忽略大小写
-c:统计重复行次数
-d:只显示重复行

sort默认的排序方式是升序,如果想改成降序,就加个-r就搞定了。

sort -n  

按以数值排序。

diff 比较两个文件内容的不同

[root@101 scripts]# echo -e "\n 111 \n 222 \n 333" > a.txt
[root@101 scripts]# cat a.txt 

 111 
 222 
 333
[root@101 scripts]# echo -e "\n 111 \n 222 \n 444" > b.txt
[root@101 scripts]# cat b.txt 

 111 
 222 
 444
[root@101 scripts]# diff a.txt b.txt 
4c4
<  333
---
>  444
 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Linux三剑客指的是 awksedgrepawk 是一种用来处理文本文件的工具,它可以根据指定的模式进行自动分割并进行数据处理。 sed 是一种流编辑器,它可以对文本文件进行替换、删除和插入操作。 grep 是一种文本搜索工具,它可以在文本文件中搜索指定的字符串。 ### 回答2: Linux三剑客,分别是awksedgrep,它们是Linux系统中非常重要的命令行工具,它们通常被称为文本处理工具。这些工具通常被用于筛选、搜索和处理文本文件。 grep是一种常见的文本搜索工具,可以在文件和文件夹中搜索指定的字符串或正则表达式。grep可以搜索多个文件并返回匹配行的输出。它是处理日志文件或查找匹配模式的最佳工具之一。 sed是一种流编辑器,可以按照行处理文本文件。它可以通过替换、删除和插入操作来修改文件内容。在大型文件中查找并替换模式是sed的主要作用。该工具通常在文本文件中提取有用信息是常用。 awk是一种强大的文本操作工具,可以分析大型文本文件并对其进行处理。该工具可以遍历行和列,并提供强大的文本处理工具,如计算、过滤和转换数据。awk的处理速度非常快,适用于处理大型数据文件。 Linux三剑客awk是最强大的工具,它可以执行复杂的文本数据操作和转换,可大大简化开发和管理过程。sed主要用于简单的文本数据过滤和替换,而grep主要用于搜索文件和定位特定行。 总之,Linux三剑客在文本数据处理方面具有不可替代的重要作用。对于Linux操作系统的开发人员和管理员来说,熟练使用这些工具可以提高他们的工作效率,使他们更容易管理和操作文本文件。 ### 回答3: Linux三剑客awk sed grep是我们在日常工作中经常使用的三个命令。它们都属于文本处理工具,可以用于查找、处理、分析文本文件等。 首先,grep是最常用的文本搜索工具。grep可以用来快速查找文件中指定的字符串或正则表达式,并将包含该字符串或正则表达式的行打印出来。常用的命令有grep、egrep和fgrep。比如,我们可以使用grep命令来查找一个文件中包含指定关键字的行,可以使用egrep来支持正则表达式搜索,使用fgrep来进行快速搜索,不支持正则表达式。 其次,sed是一种流编辑器,主要用于对文本文件进行替换、删除、添加、插入等操作。sed命令可以通过管道(|)将多个命令组合起来,从而进行复杂的文本操作。sed可以快速完成对文本文件的修改操作,比如替换文件中的某些内容、删除特定的行、在文件中插入新的文本等。sed的命令形式是“command", 比如"s/old/new/g",表示将old替换成new。 最后,awk是一种强大的文本处理工具,主要用于在文本文件中查找、处理以及格式化特定的字段。和grepsed不同的是,awk更加灵活,可以在处理过程中做到数据过滤和加工,对于大数据的处理特别有用。awk命令的常用语法是"pattern {action}"。其中,pattern代表要匹配的模式,而action代表模式匹配时需要执行的动作,我们可以在其中添加处理语句来对文件进行各种处理操作,比如计算、统计、格式化等。 综上所述,Linux三剑客awk sed grep是我们在文本处理工作中不可或缺的三个工具,不同的工具可以用于处理不同的文本操作,也可以用于搭配使用,以完成更加复杂的文本处理工作。对于需要经常处理文本的人员来说,掌握这些工具是非常必要的。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值