shell编程入门(四)

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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值