shell编程入门(四)
shell编程的时候我们绕不开的就是各种查找,那grep和sed就是必须学习的
grep
–i 查找时不区分大小写
-r 以递归的方式查找符合条件的文件
-q 或 --quiet或–silent : 不显示任何信息。
v 或 --invert-match : 显示不包含匹配文本的所有行。
-o 或 --only-matching : 只显示匹配PATTERN 部分。
-E 或 --extended-regexp : 将样式为延伸的正则表达式来使用。
文件内容:
#这是啥
can you speek Chinese
yeah
gun
ABCUIHKSLNSSL
-v
#! /bin/bash
cat grep.txt|grep -v "ABC"
结果
ZHR:md zc$ ./test.sh
#这是啥
can you speek Chinese
yeah
gun
-i
#! /bin/bash
cat grep.txt|grep 'abc'
echo "==========="
cat grep.txt|grep -i 'abc'
结果
ZHR:md zc$ ./test.sh
===========
ABCUIHKSLNSSL
-r
既然是递归查询,那么就是查询文件夹下面的多个文件了
文件one
ABCUIHKSLNSSL
poquwoeiuqoiweuq
文件two
ABCUI
IUCBA
ABCUI
asdkjalsdjalkjd
#! /bin/bash
grep -r 'ABC' /Users/zc/Desktop/md/greplocation/
结果
ZHR:md zc$ ./test.sh
/Users/zc/Desktop/md/greplocation//two.txt:ABCUI
/Users/zc/Desktop/md/greplocation//two.txt:ABCUI
/Users/zc/Desktop/md/greplocation//one.txt:ABCUIHKSLNSSL
-q
#! /bin/bash
cat grep.txt|grep 'ABC'
echo "================"
cat grep.txt|grep -q 'ABC'
结果
ZHR:md zc$ ./test.sh
ABCUIHKSLNSSL
================
-o
#! /bin/bash
cat grep.txt|grep 'ABC'
echo "================"
cat grep.txt|grep -o 'ABC'
结果
ZHR:md zc$ ./test.sh
ABCUIHKSLNSSL
================
ABC
-E
常用
常用
常用
重要的话说三遍,但是也是最复杂的,因为涉及到了正则表达式!
^ #锚定行的开始 如:'^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。
\< #锚定单词的开始,如:'\<grep'匹配包含以grep开头的单词的行。
\> #锚定单词的结束,如'grep\>'匹配包含以grep结尾的单词的行。
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 #匹配文字和数字字符,也就是[A-Za-z0-9],如:'G\w*p'匹配以G后跟零个或多个文字或数字字符,然后是p。
\W #\w的反置形式,匹配一个或多个非单词字符,如点号句号等。
\b #单词锁定符,如: '\bgrep\b'只匹配grep。
\s #它是许多regex风格中“任意空白字符”的常用速记。这包括空格、制表符和换行符。
+ #比如\w+,就是匹配一个或多个,至少一个,和*的区别就是至少一个,而*是可以为0个的
重新修改一下文件grep.txt
#这是啥
can you speek Chinese
yeah
gun
ABCUIHKSLNSSL
#! /bin/bash
echo "去除掉#号开头的行:"
cat grep.txt|grep -v -E "^#"
echo "去除掉所有的空行"
cat grep.txt|grep -v -E "^$"
echo "|的官方解释为“指明两项之间的一个选择”,但是一直不太理解,从结果看其实就是“或”,就是满足|前的或者|后的都被筛选了"
cat grep.txt |grep -v -E "^#|^$"
echo "^#和^#.*?的区别:事实证明没啥区别"
cat grep.txt |grep -v -E "^#.*?|^$"
echo "去掉行首为任意空白符的行"
cat grep.txt |grep -v -E "^\s"
echo "只输出行首为字母或者数字的行"
cat grep.txt |grep -o -E "^\w+"
结果
ZHR:md zc$ ./test.sh
去除掉#号开头的行:
can you speek Chinese
yeah
gun
ABCUIHKSLNSSL
去除掉所有的空行
#这是啥
can you speek Chinese
yeah
gun
ABCUIHKSLNSSL
|的官方解释为“指明两项之间的一个选择”,但是一直不太理解,从结果看其实就是“或”,就是满足|前的或者|后的都被筛选了
can you speek Chinese
yeah
gun
ABCUIHKSLNSSL
^#和^#.*?的区别:事实证明没啥区别
can you speek Chinese
yeah
gun
ABCUIHKSLNSSL
去掉行首为任意空白符的行
#这是啥
can you speek Chinese
gun
ABCUIHKSLNSSL
==========
can
gun
ABCUIHKSLNSSL
sed
sed是一种在线编辑器,它一次处理一行内容。处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”(pattern space),接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下一行,这样不断重复,直到文件末尾。文件内容并没有改变,除非你使用重定向存储输出。Sed主要用来自动编辑一个或多个文件;简化对文件的反复操作;编写转换程序等。
比如说文件里有很多\r 或者 \n 或者\t符。我们经常要将其去掉
\r:回车符,返回到这一行的开头,return的意思。
\n:换行符,到下一行的同一位置,纵坐标相同,new line的意思。
\t:制表符,为了在不使用表格的情况下,上下对齐,table的意思。
Enter 相当于\n\r,所以Enter的标识为 往下,再往前。当然,\n\r等价于\r\n。
sed主要的几种操作,其中最常用的其实就是替换
s :取代,可以直接进行取代的工作
a :新增, a 的后面可以接字串,而这些字串会在新的一行出现(目前的下一行)~
i :插入, i 的后面可以接字串,而这些字串会在新的一行出现(目前的上一行);
d :删除,乍一看感觉用s就能可以解决,但是如果要删除整个一行呢
p :打印,额,这个没什么好说的了。
sed常用的选项,也就-n常用
-f:选项 sed -f filename 把sed要处理的命令写到一个文件中,使用-f选项
-i选项:直接对源文件进行操作。
-n选项: quiet,silent,静默模式,不打印模式空间中的内容,而是仅打印和sed命令匹配的内容
综上所述,既然是入门,知道替换就行了。
文件内容
Hello,my name is hanmeimei
who are you
i am fine ,thank
you
替换文字
sed ‘s/被替换掉的内容/替换的内容/g’
这个g代表的是全部替代的意思,如果不加的话,只替换每行的第一个
我们先将所有的i替换成mm
#! /bin/bash
cat sed.txt|sed 's/i/mm/g'
结果
ZHR:md zc$ ./test.sh
Hello,my name mms hanmemmmemm
who are you
mm am fmmne ,thank
youZHR:md zc$
替换空格
#! /bin/bash
sed 's/ //g' sed.txt
结果
ZHR:md zc$ ./test.sh
Hello,mynameishanmeimei
whoareyou
iamfine,thank
youZHR:md zc$
删除
#! /bin/bash
sed '1,2d' sed.txt
结果
ZHR:md zc$ ./test.sh
i am fine ,thank
youZHR:md zc$
打印
#! /bin/bash
sed '1,2p' sed.txt
结果
ZHR:md zc$ ./test.sh
Hello,my name is hanmeimei
Hello,my name is hanmeimei
who are you
who are you
i am fine ,thank
youZHR:md zc$
好好想想为什么第一行和第二行打印了两遍,想不明白再回去看看sed的介绍
#! /bin/bash
sed -n '1,2p' sed.txt
结果
ZHR:md zc$ ./test.sh
Hello,my name is hanmeimei
who are you