脚本处理数据——shell&python

1、shell数据处理之grep

2020-12-15  本文已影响0人  云里睡大觉

shell数据处理之grep

0、写在最前面

系统:macOS Mojave 10.14.6
终端:自带shell(一些命令结果在Linux shell上的输出可能会有些偏差)

1、定义

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

2、使用

grep "abc" file.txt #返回文件file.txt中包含"abc"的行,abc不加引号结果相同
grep "abc" file01.txt file02.txt ... #在多个文件中查找包含"abc"的行。对于多个文件,其他命令类似,不一一说明
grep -v "abc" file.txt #反向查找,输出文件file.txt中不含有"abc"的行
grep -n "abc" file.txt #输出文件file.txt中包含"abc"的行数、以及包含"abc"的行,形式如 2:abchf
grep -c "abc" file.txt #输出文件file.txt中包含"abc"的总行数,例如若file.txt中有3行含有"abc",则输出3
grep -i "abc" file.txt #不区分大小写查询
grep -w "abc" file.txt #精确查询,输出包含单词"abc"的行,若某一行为 abcd is ***,则此时-w abc获取不到结果
grep -o "abc" file.txt #只要文件file.txt某一行包含"abc",则输出"abc",不输出该行的其他内容
grep -E "[a-z]+." file.txt #使用正则表达式进行查询,输出包含 小写英文字母. 的行
grep "abc\|def" file.txt #或查询,查询文件file.txt中包含"abc"或"def"的行
grep -A 3 "abc" file.txt #输出包含"abc"的行以及其后面3行,-A:after,-A 3 也可以放在文件后面
grep -B 3 "abc" file.txt #输出包含"abc"的行以及其前面3行,-B:before
grep -C 3 "abc" file.txt #输出包含"abc"的行以及其前面3行、后面3行

3、终端实操

#file.txt 中的数据如下:  
Han Meimei:"My name is Han Meimei. What's your name?"
Li Lei:"My name is Li Lei."
Han Meimei:"Nice to meet you."
Li Lei:"Nice to meet you,too."

Poly:"Welcome to Unit 1!"
#测试几个
#1、输出包含 name 的行
#grep "name" file.txt
Han Meimei:"My name is Han Meimei. What's your name?"
Li Lei:"My name is Li Lei."

#2、输出不包含 name 的行(空行也会输出)
#grep -v "name" file.txt
Han Meimei:"Nice to meet you."
Li Lei:"Nice to meet you,too."

Poly:"Welcome to Unit 1!"

#3、输出文件中包含 name 的行数
#grep -c "name" file.txt
2

#4、精确匹配 Li Lei(此时 -w Li Le 无结果输出)
#grep -w "Li Lei" file.txt
Li Lei:"My name is Li Lei."
Li Lei:"Nice to meet you,too."

#5、正则匹配包含字母 a-c 的行
#grep -E "[a-c]+" file.txt 或者 grep -E "[a,b,c]+" file.txt
Han Meimei:"My name is Han Meimei. What's your name?"
Li Lei:"My name is Li Lei."
Han Meimei:"Nice to meet you."
Li Lei:"Nice to meet you,too."
Poly:"Welcome to Unit 1!"

#6、输出包含 name或者包含Li Lei 的行
#grep "name\|Li Lei" file.txt
Han Meimei:"My name is Han Meimei. What's your name?"
Li Lei:"My name is Li Lei."
Li Lei:"Nice to meet you,too."

#7、输出包含 name 及其后面的3行
#grep -A  3 "name" file.txt,等价于 grep "name" file.txt -A 3
Han Meimei:"My name is Han Meimei. What's your name?"
Li Lei:"My name is Li Lei."
Han Meimei:"Nice to meet you."
Li Lei:"Nice to meet you,too."


4、注意点:单引号、双引号和不加引号

1)、单引号

可以说是所见即所得,单引号里面看到的是什么就会输出什么,即单引号内的内容原样输出。被单引号括起的内容不管是常量还是变量都不会发生替换。

2)、双引号

把双引号内的内容输出来;如果内容中有命令、变量等,会先把变量、命令解析出结果,然后再输出最终内容。双引号是部分引用,被双引号括起的内容常量还是常量,变量则会发生替换,替换成变量内容。

3)、不加引号

不会将含有空格的字符串视为一个整体输出, 如果内容中有变量、命令等,会先把变量、命令解析出结果,然后再输出最终内容。如果字符串中带有空格等特殊字符,则不能完整的输出,需要改加双引号;或者在特殊字符前加转译字符\。一般连续的字符串,数字,路径等可以使用。

4)、使用规则

一般常量用单引号''括起,如果含有变量则用双引号""括起。

##测试,还是以文件file.txt 为例
#1、输出包含 " 的行:
# grep  '"' file.txt  <==>  grep "\"" file.txt  <==>  grep \" file.txt
Han Meimei:"My name is Han Meimei. What's your name?"
Li Lei:"My name is Li Lei."
Han Meimei:"Nice to meet you."
Li Lei:"Nice to meet you,too."
Poly:"Welcome to Unit 1!"

#2、变量传输
#a='name'
#echo $a  或者  echo ${a}
name
#grep "${a}" file.txt  或者  grep "$a" file.txt  (grep '$a' file.txt,grep '${a}' file.txt均不会有行输出)
Han Meimei:"My name is Han Meimei. What's your name?"
Li Lei:"My name is Li Lei."

5、参考

1)、linux命令---grep命令https://blog.csdn.net/llljjlj/article/details/89810340
2)、 shell 正则表达式https://www.cnblogs.com/hb91/p/9969307.html

上一篇下一篇

猜你喜欢

热点阅读