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

Linux 三剑客(grep、sed、awk)相关推荐

  1. 15分钟搞定Linux三剑客 grep sed awk

    剑客grep 来者何人 grep是linux上的字符串搜索匹配命令.这个名字来自于linux编辑器vim的一个命令g/re/p,表示全局匹配某个正则表达式并打印出来,这也体现了grep自身的功能. 基 ...

  2. Linux三剑客 grep sed awk 详细使用方法

    Linux中最重要的三个命令在业界被称为"三剑客",它们是awk,sed,grep. 我们现在知道Linux下一切皆文件,对Linux的操作就是对文件的处理,那么怎么能更好的处理文 ...

  3. Shell ❀ 三剑客 - Grep + Sed + Awk

    文章目录 八.三剑客 - Grep + Sed + Awk 1.Grep - 过滤 1.1 常用grep参数 1.2 使用方法 2.Sed - 行匹配 2.1 执行原理 2.2 常见语法 2.3 使用 ...

  4. 三剑客grep sed awk

    三剑客 正则(RE)表达式 应用场景 规则 注意事项 正则符号 基础正则 扩展正则 正则实例 正则 VS 通配符 三剑客 grep sed sed核心应用 awk awk执行过程 内置变量 awk 正 ...

  5. Linux高级专题详解--shell编程大全(shell变量,if语句,case语句,for循环,while循环,函数调用,数组,正则表达式,shell脚本三剑客--grep,sed,awk家族)

    shell编程 初始shell 程序 语言 编程 ---------------------------------- 语言 自然语言:汉语.英语 计算机语言:c语言.c++.(java php py ...

  6. 深入浅出linux三剑客之sed必杀技一例

    缘起:上完培训课后,同学们对sed加正则处理问题的热情高涨,氛围相当好,但是,有个别同学还是有些晕乎,因此,撰写此文.此例如果搞熟练了,sed和正则的大部分常用技术你掌握起来就简单了. 如果还有不会的 ...

  7. linux三剑客及正则表达(grep,sed,awk)

    首先我们现在知道Linux下一切皆文件,对Linux的操作就是对文件的处理,那么怎么能更好的处理文件呢?这就要用到我们上面的三剑客命令. 在说这三个命令前我们要插入一个小插曲就是"正则表达式 ...

  8. linux grep sed awk

    linux 文本编辑命令grep sed awk(转)     grep grep (global search regular expression(RE) and print out the li ...

  9. Linux实战教学笔记12:linux三剑客之sed命令精讲

    第十二节 linux三剑客之sed命令精讲 标签(空格分隔): Linux实战教学笔记-陈思齐 ---更多资料点我查看 1,前言 我们都知道,在Linux中一切皆文件,比如配置文件,日志文件,启动文件 ...

  10. 正则表达式与扩展正则表达式(grep, sed, awk)

    Linux中用来在文件中搜索字符串的命令,如grep, sed, awk等命令支持正则表达式与扩展正则表达式. 1. 基础正则表达式 符号 解释 示例 * 匹配0次或多次 b.*t . 匹配任意字符 ...

最新文章

  1. 【并行编程】系统体系结构和组件具体说明
  2. VMware Tools按钮变灰色,无法安装的解决方法
  3. 主分支和'起源/主人'有分歧,如何'疏远'分支'?
  4. XP 终端服务组件 恢复补丁包 terminal service patch
  5. 从零入门 Serverless | 一文详解 Serverless 架构模式
  6. Parity Alternated Deletions
  7. 操作系统与存储:解析Linux内核全新异步IO引擎io_uring设计与实现
  8. Asp.Net Core 中IdentityServer4 授权流程及刷新Token
  9. Codeforces Round #759 (Div. 2, based on Technocup 2022 Elimination Round 3)
  10. sharepoint 2010 timejob 注意
  11. scaling之旅_机器学习算法之旅 - lwaif的个人空间 - OSCHINA - 中文开源技术交流社区...
  12. (转)PowerDesigner教程系列(二)概念数据模型
  13. 求┐(P双向Q)∧(┐P蕴含R)的主析取范式、主合取范式
  14. php iis日志分析,星外系统IIS日志分析常用的几个命令小结
  15. GitHub 热榜:不用 PS,一键去除照片中的对象,这个神器可试玩
  16. VMware Tools 支持 Windows 2000、Windows XP 和 Windows Server 2003 (81466)
  17. “斗”转星移,高精度(NTP网络授时)北斗授时系统
  18. linux下1060显卡驱动安装,ubuntu16.04 联想拯救者y7000笔记本电脑安装1060显卡驱动,及ubuntu16.04更新内核...
  19. 在职读研犹如飞轮效应,社科院与杜兰大学金融管理硕士与你奔赴未来
  20. 3d模型导入MAYA常见错误!

热门文章

  1. 解决idea 提示 Wrong tag ‘Param‘的问题
  2. android 寺库trytry_人民日报与寺库trytry合作 后共享时代迎新玩法
  3. 跳板攻击中如何追踪定位攻击者主机(上)
  4. 扬长避短,做自己最擅长的事情
  5. Elastic的Workplace Search如何使用Gmail或Google Drive等数据源
  6. UserWarning: Previous unbuffered result was left incomplete
  7. 录入设备(3)——51单片机原理图及PCB设计
  8. 图片路径转码与解码(学习)
  9. 武汉链家二手房数据分析
  10. MTCTF_Crypto