一、find

  find命令用来在指定目录下查找文件。如果使用该命令时,不设置任何参数,则find命令将在当前目录下查找子目录与文件。并且将查找到的子目录和文件全部进行显示。

语法

find   path   -option   [   -print ]   [ -exec   -ok   command ]   {} \;

常用选项:

-name  查找根目录及其子目录下所有以 log 结尾的文件,文件名区分大小写,例如:find / -name '*logf'

-iname      查找当前目录及其子目录下所有文件名为 test 的文件,文件名不区分大小写,例如:find . -name test

-user    查找文件所属用户为 mysql 的所有文件,例如:find . -user mysql

-group      查找文件所属组为 git 的所有文件,例如:find . -group git

-type    根据类型查找:如下

  • f   文件        find . -type f
  • d  目录        find . -type d
  • c  字符设备文件    find . -type c
  • b  块设备文件     find . -type b
  • l   链接文件      find . -type l
  • p  管道文件      find . -type p

-size    根据文件大小查询

  • -n  小于 大小为 n 的文件
  • +n  大于 大小为 n 的文件
  • 查找 /ect 目录下,小于 10000 字节的文件。 find /etc -size +10000c
  • 查找 /etc 目录下,大于 1M 的文件。find /etc -size -1M

-mtime   根据文件更改时间查找

  • -n   n 天以内修改的文件。
  • +n  n 天以外修改的文件。
  • n    正好 n天 修改的文件
  • 查询 /etc 目录下,5天以内修改 且以 conf 结尾的文件。              find /etc -mtime -5 -name '*.conf'
  • 查询 /etc 目录下,10天之前修改,且属于 yangyang 的文件。  find /etc -mtime +10 -user yangyang

-mmin  

  • -n  n 分钟以内修改过的文件
  • +n  n 分钟之前修改过的文件
  • 查询 /etc 目录下 30分钟 之前修改过的文件。   find /etc -mmin +30
  • 查询 /etc 目录下 30分钟 之前修改过的目录。   find /etc -mmin -30 -type d

-mindepth n  从第 n 级目录开始搜索

  • 从 /etc 的第三级子目录开始搜索。  find /etc -mindepth 3

-maxdepth n  表示至多搜索到第 n-1 级子目录。

  • 在 /etc 中搜索符合条件的文件,但最多搜索到 2级 子目录。  find /etc -maxdepth 3 -name '*.conf'
  • find /etc -type f -name '*.conf' -size +10k -maxdepthc 2

操作查找到的文件:

-print  打印输出。 默认的选项,即打印出找到的结果。

-exec  对搜索到的文件执行特定的操作,固定的格式为:-exec 'commond' {} \;   注意:{} 表示查询的结果。

  • 搜索 /etc 目录下的文件(非目录),文件以 conf 结尾,且大于 10k,然后将其删除。

    • find /etc -type f -name '*.conf' -size +10k -exec rm -f {} \;
  • 将 /data/log/ 目录下以 .log 结尾的文件,且更改时间在 7 天以上的删除。
    • find /data/log -name '*.log' -mtime +7 -exec rm -f \;
  • 搜索条件同 例1 一样,但是不删除,只是将其复制到 /root/conf 目录下
    • find /etc -type f -name '*.conf' -size +10k -exec cp {} /root/conf/ \;

-ok      和 -exec 的功能一样,只是每次操作都会给用户提示。

逻辑运算符:

-a    与  (默认情况查询条件之间都是 与 的关系)

-o    或

-not | !  非

二、grep

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

语法:

grep [-abcEFGhHilLnqrsvVwxy][-A<显示列数>][-B<显示列数>][-C<显示列数>][-d<进行动作>][-e<范本样式>][-f<范本文件>][--help][范本样式][文件或目录...]

选项:

选项 描述
-a  不要忽略二进制数据
-A<显示列数> 除了显示符合范本样式的那一行之外,并显示该行之后的内容 
-b 在显示符合范本样式的那一行之外,并显示该行之前的内容 
-c 计算符合范本样式的列数 
-C<显示列数>或-<显示列数> 除了显示符合范本样式的那一列之外,并显示该列之前后的内容 
-d<进行动作> 当指定要查找的是目录而非文件时,必须使用这项参数,否则grep命令将回报信息并停止动作 
-e<范本样式> 指定字符串作为查找文件内容的范本样式 
-E 将范本样式为延伸的普通表示法来使用,意味着使用能使用扩展正则表达式 
-f<范本文件> 指定范本文件,其内容有一个或多个范本样式,让grep查找符合范本条件的文件内容,格式为每一列的范本样式 
-F 将范本样式视为固定字符串的列表 
-G 将范本样式视为普通的表示法来使用 
-h 在显示符合范本样式的那一列之前,不标示该列所属的文件名称 
-H 在显示符合范本样式的那一列之前,标示该列的文件名称 
-i 忽略字符大小写的差别 
-l 列出文件内容符合指定的范本样式的文件名称 
-L 列出文件内容不符合指定的范本样式的文件名称 
-n 在显示符合范本样式的那一列之前,标示出该列的编号 
-q 不显示任何信息 
-R/-r 此参数的效果和指定“-d recurse”参数相同 
-s 不显示错误信息 
-v 反转查找 
-w 只显示全字符合的列 
-x 只显示全列符合的列
-y 此参数效果跟“-i”相同
-o 只输出文件中匹配到的部分

示例:

# 在文件中搜索一个单词,命令会返回一个包含“match_pattern”的文本行:
grep match_pattern file_name
grep "match_pattern" file_name # 在多个文件中查找
grep "match_pattern" file_1 file_2 file_3 ... # 输出除之外的所有行 -v 选项
grep -v "match_pattern" file_name # 使用正则表达式 -E 选项
grep -E "[1-9]+"
egrep "[1-9]+" # 只输出文件中匹配到的部分 -o 选项
grep -o "match_pattern" file_name # 统计文件或者文本中包含匹配字符串的行数 -c 选项
grep -c "text" file_name # 输出包含匹配字符串的行数 -n 选项
grep "text" -n file_name
cat file_name | grep "text" -n
grep "text" -n file_1 file_2 # 打印样式匹配所位于的字符或字节偏移
echo gun is not unix | grep -b -o "not" # 搜索多个文件并查找匹配文本在哪些文件中
grep -l "text" file1 file2 file3... # 在多级目录中对文本进行递归搜索
grep "text" . -r -n # 忽略匹配样式中的字符大小写
echo "hello world" | grep -i "HELLO" # 选项 -e 制动多个匹配样式
echo this is a text line | grep -e "is" -e "line" -o #只在目录中所有的.php和.html文件中递归搜索字符"main()"
grep "main()" . -r --include *.{php,html} #在搜索结果中排除所有README文件
grep "main()" . -r --exclude "README" #在搜索结果中排除filelist文件列表里的文件
grep "main()" . -r --exclude-from filelist #不会输出任何信息,如果命令运行成功返回0,失败则返回非0值。一般用于条件测试
grep -q "test" filename #显示匹配某个结果之后的3行,使用 -A 选项:
seq | grep "" -A #显示匹配某个结果之前的3行,使用 -B 选项:
seq | grep "" -B #显示匹配某个结果的前三行和后三行,使用 -C 选项:
seq | grep "" -C #如果匹配结果有多个,会用“--”作为各匹配结果之间的分隔符:
echo -e "a\nb\nc\na\nb\nc" | grep a -A
a
b
--
a
b

grep 示例

三、sed

sed 命令是利用脚本来处理文本文件。

sed 可依照脚本的指令来处理、编辑文本文件。

Sed 主要用来自动编辑一个或多个文件、简化对文件的反复操作、编写转换程序等。

语法:

sed [选项] [脚本命令] 文件名

选项与参数

  • -n :使用安静(silent)模式。在一般 sed 的用法中,所有来自 STDIN 的数据一般都会被列出到终端上。但如果加上 -n 参数后,则只有经过sed 特殊处理的那一行(或者动作)才会被列出来。
  • -e :直接在命令列模式上进行 sed 的动作编辑;
  • -f :直接将 sed 的动作写在一个文件内, -f filename 则可以运行 filename 内的 sed 动作;
  • -r :sed 的动作支持的是延伸型正规表示法的语法。(默认是基础正规表示法语法)
  • -i :直接修改读取的文件内容,而不是输出到终端。

动作:

  • a :新增行, a 的后面可以是字串,而这些字串会在新的一行出现(目前的下一行)
  • c :取代行, c 的后面可以接字串,这些字串可以取代 n1,n2 之间的行
  • d :删除行,因为是删除,所以 d 后面通常不接任何参数,直接删除地址表示的行;
  • i :插入行, i 的后面可以接字串,而这些字串会在新的一行出现(目前的上一行);
  • p :列印,亦即将某个选择的数据印出。通常 p 会与参数 sed -n 一起运行
  • s :替换,可以直接进行替换的工作,通常这个 s 的动作可以搭配正规表示法,例如 1,20s/old/new/g 一般是替换符合条件的字符串而不是整行

一般动作的前面会有一个地址的限制,例如 [地址]动作,表示我们的动作要操作的行。下面我们通过具体的例子直观的看看 sed 的使用方法。

删除行

// example.txt 内容如下
aa
bb
cc
dd
2e sed '1,2d' example.txt 输出:
cc
dd
2e

  其中1,2d中的d表示删除,而d前面的表示删除的行的地址,而1,2表示一个地址范围,也就是删除第1行和第2行。地址范围的表示一般是  m,n 表示对m和n行之间的所有行进行操作,也包含第m行和第n行。sed的地址寻址中可以使用$表示最后一行,例如 m,$ 表示对m行以及其后面的所有行进行操作,包括最后一样。m,$d就是删除m行以及其后面的所有行内容。当然我们还可以对某一行进行操作,例如2d表示仅仅删除第2行。除了使用数字范围 m,n 表示多行区间,以及m表示单行以外,我们还可以使用正则表达式选出符合条件的行,并对这些行进行操作,同样的是上面的文件:

sed '/2/d' example.txt

输出:
aa
cc

  上面的命令中 /2/ 是一个正则表达式,在sed中正则表达式是写在 /.../ 两个斜杠中间的,这个正则的意思是寻找所有包含2的行,执行相应的操作,也就是删除所有包含2的行,如果我们只想删除以2开头的行呢,只需要修改一下正则表达式就可以了:

sed '/^2/d' example.txt

输出:
aa
cc
2e

新增行

sed '1a hello world' example.txt

输出:
aa
hello world
bb
cc
dd
2e

  其中a命令表示在指定行的后面附加一行,1a则是在第一行的后面添加一行,添加的内容就是a后面的内容,如果a的前面没有地址限定则在所有行的后面都会添加指定的字符串

sed '1i hello world' example.txt

输出:
hello world
aa
bb
cc
dd
2e

命令i表示在指定的行的前面插入一行,插入的内容为其后面的字符串

替换行

sed '1c hello world' example.txt

输出:
hello world
bb
cc
dd
2e

  命令c会替换指定的行的所有内容,替换成其后面的字符串,所有的新增,删除,替换行,这些命令前面的地址修饰都可以指定地址空间,也都可以使用正则表达式,命令会应用在选出的符合地址条件的所有行上面,例如:

sed '/^2/c hello world' example.txt

输出:
aa
hello world
cc
hello world
2e

替换以2开头的行,其内容是c命令后面的字符串

替换部分字符串而不是整行

  sed中除了上面的命令是针对整行进行操作的之外,还提供一个替换命令,该命令对某一行中的部分字符串进行操作,下面举一个简单的例子,还是同样的文本内容,执行下面的命令:

sed 's/aa/AA/' example.txt

输出:
AA
bb
cc
dd
2e

  我们这里说的就是s命令,执行的结果是我们文件中的 aa 被替换成 AA ,我们看一下s命令后面接的是3个斜杠分隔的两串字符串,其含义是   s/待替换的字符串/新字符串/ 也就是说使用后面的 AA 替换文件中出现的前面的 aa 。实际上这里的替换仅仅替换每一行遇到的第一个aa,我们修改一下文件的内容:

// example.txt
aa
bb
cc
dd
2e
aaff ccaa
zz ggaa sed 's/aa/AA/' example.txt 输出:
AA
bb
cc
dd
2e
AAff ccaa
zz ggAA

  可以看到第6行的ccaa中的aa是没有被替换的,也就是说此时仅仅替换了每一行搜索到的第一个aa字符串进行操作,那么如果要对一行里面的所有的符合条件的字符串都做替换操作呢,我们可以使用参数g,例如修改命令如下:

sed 's/aa/AA/g' example.txt

输出:
AA
bb
cc
dd
2e
AAff ccAA
zz ggAA

  在最后一个斜杠后面加上g选项之后,表示进行全局替换,也就是说一行中所有符合条件的旧字符串都会被替换成新字符串,而不仅仅是第一个。与其他针对行的操作一样,s命令也可以进行地址选择,其地址使用方法与我们之前的一样,也就是在s的前面加上地址空间限定,例如:

sed '1s/aa/AA/g' example.txt

输出:
AA
bb
cc
dd
2e
aaff ccaa
zz ggaa

可以看到仅仅对第一行进行了替换操作,其他的地址限定方法同样也是可以使用的,我们可以使用m,n的限定,例如:

sed '5,$s/aa/AA/g' example.txt

输出:
aa
bb
cc
dd
2e
AAff ccAA
zz ggAA

  表示对第5行直到文件末尾的所有行进行搜索替换操作,同样s命令的地址限定也支持使用正则表达式限定符合条件的行,然后在这些行中进行字符串的搜索替换操作,例如:

sed '/^[0-9]/s/aa/AA/g' example.txt

输出:
AA
bb
cc
dd
2e
AAff ccAA
zz ggaa

我们在s命令前面添加了 /^[0-9]/ 这个修饰,该正则表达式表示对所有以数字开头的行,执行s操作

另外一个要说明的是  s/待替换的字符串/新字符串/ 这种格式中 / 作为分隔符并不是一定的,当使用s命令时候,我们可以使用别的分隔符,实际上s后面紧接着的字符就是分隔符,所以不一定是 / 符号。例如:

echo 'aabbccaadd' | sed s#aa#AA#g

输出:
AAbbccAAdd

这里s命令后面跟着的#符号被当作分隔符了

搜索并输出行内容

sed还提供一个p命令用于搜索符合条件的行,并输出该行的内容,而不做其他的任何修改,例如:

// example.txt
aa
bb
cc
dd sed '2p' example.txt 输出:
aa
bb
bb
cc
dd

  可以看到第二行被输出来了,但是sed好像将文件的所有内容输出了一遍,而第2行则多输出了一次,实际上sed默认情况下是会将所有标准输入的数据又重新输出到标准输出的,我们可以加上 -n 选项让sed仅仅是输出经过处理之后的那些行,而不是输出之前从标准输入中获取到的所有行内容,例如:

sed -n '2p' example.txt

输出:
bb

  这样仅仅会输出p命令的处理结果了,-n 选项一般是与p命令联合使用的,其他的增加,删除,替换行的命令是不需要 -n 选项的

将修改应用到文件当中

我们之前做的所有实验,实际上都没有修改test.txt文件的内容,也就是说我们看到的修改结果仅仅输出到控制台上,而文件test.txt的内容是没有修改的,我们可以使用 -i 选项告诉sed直接修改文件的内容,而不是将修改结果输出到终端上,例如:

sed -i '2d' example.txt 

命令运行之后,我们发现example.txt的第2行没有了

sed正则中的元字符

我们知道sed中的命令前面可以使用地址范围进行限制,表示对文件的某些符合条件的行执行相应的操作,其中我们可以使用正则表达式选出要操作的行,而sed中正则的语法可能与我们其他命令的正则语法有一些不同,这里我们有必要列出sed中常用的正则元字符:

$ 表示行尾
^ 表示行首
[a-z0-]表示字符范围
[^]表示除了字符集中的字符以外的字符 sed的正则中 \(\) 和 \{m,n\} 需要转义
. 表示任意字符
* 表示零个或者多个
\+ 一次或多次  
\? 零次或一次
\| 表示或语法

四、awk

https://www.cnblogs.com/wangqiguo/p/5863266.html (转)

五、grep、sed、awk总结

  • grep:适合单纯的查找或匹配文本;
  • sed:适合对匹配到的文本进行编辑;
  • awk:适合对文本进行较复杂的格式化处理;

Linux高级命令 ==> find、grep、sed、awk的更多相关文章

  1. Linux三剑客grep/sed/awk

    grep/sed/awk被称为linux的“三剑客” grep更适合单纯的查找或匹配文本: sed更适合编辑匹配到的文本: awk更适合格式化文本,对文本进行较复杂各式处理: Grep --color ...

  2. linux三剑客grep|sed|awk实践

    最好先学习正则表达式的基本用法,以及正则表达式BREs,EREs,PREs的区别 此坑待填 grep sed awk

  3. Linux高级命令进阶(week1_day2)

    Linux高级命令进阶(week1_day2)--技术流ken   输出重定向   场景:一般命令的输出都会显示在终端中,有些时候需要将一些命令的执行结果想要保存到文件中进行后续的分析/统计,则这时候 ...

  4. Linux查找命令:grep,awk,sed

    grep grep (global search regular expression(RE) and print out the line,全面搜索正则表达式并把行打印出来)是一种强大的文本搜索工具 ...

  5. grep sed awk 3个Linux中对文件内容操作的命令

    在学习Linux命令中,发现3个有关于文件内容操作的命令grep,sed和awk,在这里简单汇总这3个命令主要作用,在实际中找到最合适的情景应用,详细用法可以参考其他文章. 1.grep命令 主要作用 ...

  6. linux grep,sed,awk和diff的使用

    1:grep//显示行 # grep 'main' /home/myhome/a.c//将a.c含有main的行显示出来 # grep -v 'main' /home/myhome/a.c //显示除 ...

  7. 【Linux】 字符串和文本处理工具 grep & sed & awk

    Linux字符串&文本处理工具 因为用linux的时候主要用到的还是字符交互界面,所以对字符串的处理变得十分重要.这篇介绍三个常用的字符串处理工具,包括grep,sed和awk ■ grep ...

  8. [svc]linux正则实战(grep/sed/awk)

    企业实战: 过滤ip 过滤出第二行的 192.168.2.11. eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 ine ...

  9. grep/sed/awk命令查看指定时间段的日志

    *grep命令 今天遇到研发要求查询定时任务(elastic-job)在14:00-14:40的日志,使用grep命令很方便: 命令: grep '时间' '日志文件名 ' 1.例如查询2020-02 ...

随机推荐

  1. mysql 5.6.38 数据库编译安装

    一.系统环境: # cat /etc/redhat-release CentOS release 6.9 (Final) 二.mysql 编译安装: 1.安装依赖包: yum install -y n ...

  2. python_连接MySQL数据库(未完)

    1.增 # 导入库 import pymysql # 创建连接 conn = pymysql.connect(host='localhost',user='root',password='fuqian ...

  3. 【Amaple教程】4. 组件

    在Amaple单页应用中,一个页面其实存在两种模块化单位,分别是 模块 (am.Module类),它是以web单页应用跳转更新为最小单位所拆分的独立块: 组件 (am.Component类),它的定位 ...

  4. vue 多层组件相互嵌套的时候 数据源更新 dom没更新 彻底清除组件缓存

    当项目中存在多层组件相互嵌套 组件存在严重缓存时  this.$nextTick(() => { ..... }); 不管用 this.$forceUpdate(); 不管用 只能通过深拷贝浅拷 ...

  5. [Docker] Run a command inside Docker container

    For example you are working in a backend project, you have setup Dockerfile: FROM node:10.16.0-stret ...

  6. Educational Codeforces Round 34 (Rated for Div. 2) B题【打怪模拟】

    B. The Modcrab Vova is again playing some computer game, now an RPG. In the game Vova's character re ...

  7. toggleClass(class|fn[,sw])

    toggleClass(class|fn[,sw]) 概述 如果存在(不存在)就删除(添加)一个类.直线电机参数   参数 classStringV1.0 CSS类名 class,switchStri ...

  8. 校验正确获取对象或者数组的属性方法(babel-plugin-idx/_.get)

    背景: 开发中经常遇到取值属性的时候,需要校验数值的有效性. 例如: 获取props对象里面的friends属性 props.user && props.user.friends &a ...

  9. B/S架构大文件上传问题

    核心原理: 该项目核心就是文件分块上传.前后端要高度配合,需要双方约定好一些数据,才能完成大文件分块,我们在项目中要重点解决的以下问题. * 如何分片: * 如何合成一个文件: * 中断了从哪个分片开 ...

  10. BZOJ 4017 小 Q 的无敌异或 ( 树状数组、区间异或和、区间异或和之和、按位计贡献思想 )

    题目链接 题意 : 中文题 分析 : 首先引入两篇写的很好的题解 题解一.题解二 听说这种和异或相关区间求和的问题都尽量按位考虑 首先第一问.按二进制位计贡献的话.那么对于第 k 位而言 其贡献 = ...