grep
用于查找一个或多个文件里符合条件的字符串,默认输出匹配的行
格式:grep [option...] [patterns...] [file1,file2...]
-A num :在匹配的行之后,尾随打印后num行
-B num :在匹配的行打印之前,打印前num行
-C num :在匹配的行前后,各打印num行
--group=string : 在使用-A -B -C时,每个文件输出行直接打印的分隔符,默认是 --
--no-group : 在使用-A -B -C时,不要在每组之间打印分隔符
-a :像处理文本一样处理二进制文件
-b :在匹配行前面,显示该行第一个字符的编号(从0开始,shell默认前后有0字节)
-c :输出匹配到的行数
-d(-r) : 递归读取和处理目录中的所有文件
-e : 指定匹配模式,通常省略
-f : 指定规则文件,从文件中读取匹配模式,一行为一个模式
-h :匹配行前面,不显示该行所属的文件名(单文件查找的默认值)
-H :匹配行前面,显示该行所属的文件名(多文件查找的默认值)
-i (-y):忽略大小写
-I : 打印有匹配的输入文件的名称(大写i)
-L : 打印没有匹配的输入文件的名称
-m num : 指定最大的匹配行数,匹配num行就停止
-n : 在匹配行前面,输出行号,从1开始
-o : 只打印匹配部分(没啥用)
-q : 静默输出,不输出任何内容
-s : 不显示错误信息
-v : 反转匹配,输出未匹配上的行
-w : 全词匹配
-x : 整行匹配
-G : 将模式解释为基本的表达式(默认)
-E :将模式解释为延伸的正则表达式
-F :将模式解释为固定的字符串,而不是正则表达式
匹配模式:-G -E -F -P
匹配控制:-e -f -i -y --no-igonre-case** -v -w -x(< 和/>匹配单次开头和结尾)
输出控制: -c -I -L-m -o -q -s
输出行的前缀字段控制:-b -n** -h -H (-T -z )
输出行上下文控制: -A -B -C --group=storing --no-group
文件和目录的选择:-a -d** -r** -R
Sed
- Sed(流编辑器)是非交互式命令行文本编辑器。主要用来自动编辑一个或多个文件、简化对文件的反复操作、编写转换程序等
- Sed通常用于过滤文本,也就是说,它接受文本输入,对其执行一些操作(或一组操作),并输出修改后的文本。Sed通常用于使用模式匹配来提取文件的一部分或替换文件中多次出现的字符串。
参数说明:
-e <script> :指定脚本,通常单个脚本时省略
-f <script文件> :读取脚本文件,使用文件中的脚本来处理文件
-h :显示帮助
-n :默认情况下,sed打印所有处理过的输入。-n限制输出,p命令打印特定的行
-s :当输入多个文件时,分开处理每个文件(sed默认将多个输入文件视为一个长流)
-V :显示版本信息
动作说明:
a : 新增,a的后面接字符串,在指定行的下一行新增字符串
c:取代,c的后面接字符串,可以取代n1,n2之间的行
d:删除,后面不接任何东西
i:插入,i的后面接字符串,在指定行的上一行新增字符串。配合s 使用时,可以在原文件中修改;后面可跟参数(比如i.bak)
p: 打印,也可以将某个选择的数据打印。通常会与 -n 一起使用
S:取代,可以直接进行取代的工作,通常搭配正则使用,例如:sed ****‘****1,20s/old/new/g****’
g:全局,默认替换只替换每行的第一个匹配,加上g可以全局替换匹配
q:退出
注:1,sed后面的动作,必须用单引号括起来
2,字符串前后必须用正斜杠: ‘****/字符串/****’
3,如果遇到路径匹配,需用其他字符包裹,例:****’****s/\bin/bash/****’
1,下面的示例打印第一个文件(one.txt)的第一行和最后一个文件(three.txt)的最后一行
sed -n ‘1p;$p’ one.txt two.txt three.txt
2,使用-s参数会分开处理每个文件,下面的例子会返回每个文件的第一行和最后一行
sed -ns ‘1p;$p’ one.txt two.txt three.txt
3,替换文件中每行的第一个hello为hi
sed ‘s/hello/hi/’ file
4,替换文件中的所有hello 为 hi (g的使用)
sed ‘s/hello/hi/g’ file
以行为单位的新增/删除**** a i d
在 testfile 文件的第四行后添加一行,并将结果输出到标准输出
sed ‘4a new line txt’ testfile
sed ‘5i new line txt’ testfile
** 第4行后面,即是第5行。所以4a 等同于 5i
在 testfile 文件的第四行后添加2行,并将结果输出到标准输出
sed ‘4a new line txt
Two new line222’ testfile
** 行与行之间需要用反斜杠 \ 来进行新行标记,并且需要换行
将 testfile 的内容列出并且列印行号,同时,请将第 2~5 行删除!
nl testfile | sed ‘2,5d’
只要删除第 2 行:
sed ‘2d’ testfile
要删除第 3行以及第5到最后一行:
sed ‘3d;5,$d’ testfile
** 分号隔开命令,逗号是区间连接,$表示最后一行,d表示删除
以行为单位的替换与显示****c和p
将第 2-5 行的内容取代成为 No 2-5 number
sed ‘2,5c NO 2-5 number’ file
仅列出 testfile 文件内的第 5-7 行(n禁止输出,p选择行输出)
sed -n ‘5,7p’ file
搜索 testfile 有 oo 关键字的行
sed -n ‘/oo/p’ testfle
删除 testfile 所有包含 oo 的行,其他行输出
sed ‘/oo/d’ testfle
搜索 testfile,把 所有的oo 替换为 kk,再输出匹配到的行
sed -n ‘s/oo/kk/gp’ testfile
将 testfile 文件中每行第一次出现的 oo 用字符串 kk 替换,然后将该文件内容输出到标准
sed ‘s/oo/kk/p’ testfile
利用 sed 直接在 regular_express.txt 最后一行加入 # This is a test(最后一行后面新增,修改原文件)
sed -i ‘$a # This is a test’ testfile
也可以用echo来实现
echo this is a test >> testfile
利用 sed 将 regular_express.txt 内每一行结尾若为 . 则换成 !
sed -i 's/.$/!/' testfile
一条 sed 命令,删除 testfile 第三行到末尾的数据,并把 HELLO 替换为 RUNOOB :
sed -i -e ‘3,$d’-e ‘s/HELLO/RUNOOB/g’ testfile
打印第一个文件的第一行,和最后一个文件的最后一行
sed -n ‘1p;$p’ file1 file2 file3
打印每个输入文件的第一行和最后一行(-s)
sed -ns ‘1p;$p’ file1 file2 file3
-i 后面如果不跟扩展名,则修改覆盖原文件,如果跟扩展名,则覆盖原文件后会生成一个备份文件,文件名为原文件名.扩展名
sed -i.bak ‘s/hello/word/’ file 修改原文件,且生成一个file.bak的备份文件
Sed -i ‘s/hello/word/’ file 修改原文件,没有备份文件
打印所有的行,如果找到foo开头的行,则退出,状态为35(可自定义),如果没有找到这样的行,sed将自动退出,状态为0
sed ‘/^foo/q35’ file
地址选择行:****地址决定了sed命令将在哪些行上执行,如果不指定则在所有行上执行。
多个地址之间用逗号表示地址范围,地址可以是数字、正则或者两者的结合。
在地址的末尾(即字母s的前面)加!,表示不匹配
在所有行上执行sed命令
sed ‘/s/hello/word/’ file
只在140行上执行sed命令
sed ‘140s/hello/word/’ file
只在包含apple的行中执行替换命令
sed ‘/apple/s/hello/word/’ file
在10到20行上执行sed命令
sed ‘10,20s/hello/word/’ file
在4到17行之外执行命令
sed ‘4,17!s/hello/word/’ file
数字选择行:****number(指定行),$(最后一行),frist~step(GUN扩展,从first行起,每step行打印一行,0在此处有效)
打印2到7行
seq 10 | sed ‘2,7p’
打印3,4-6以及最后一行
seq 10 | sed ‘3p;4,6p;$p’
从第3行开始,每3行打印一行(即3,6,9)
seq 10 | sed ‘3~3p’
打印奇数行(即1,3,5,7,9, 从1开始,每2行打印一行。seq生成序列)
seq 10 | sed ‘0~2’
打印偶数行(即2,4,6,8,10,从0开始,每2行打印一行)
seq 10 | sed ‘0~2’
通过文本匹配行:****GUN支持BRE和ERE正则表达式,默认BRE。当使用-E或-R表达式时,需要使用ERE正则表达式。
BRE:https://www.gnu.org/software/sed/manual/sed.html#BRE-syntax
ERE:<u>https://www.gnu.org/software/sed/manual/sed.html#ERE-syntax</u>
/regexp/ 选择任何匹配正则表达式的行,如果regexp包含/,需要用反斜杠\来转义,如果包含多个/,则可以使用此方法:%regexp
/regexp/I (大写的i),忽略大小写
/regexp/M ,多行匹配
awk :