linux命令之grep、sed、awk

grep、sed、awk被称为linux中的“三剑客”,下面一一介绍

一、grep

1、概念

grep (global search regular expression(RE) and print out the line,全面搜索正则表达式并把行打印出来)是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹配的行打印出来。Unix的grep家族包括grep、egrep和fgrep。egrep和fgrep的命令只跟grep有很小不同。egrep是grep的扩展,支持更多的re元字符, fgrep就是fixed grep或fast grep,它们把所有的字母都看作单词,也就是说,正则表达式中的元字符表示回其自身的字面意义,不再特殊。linux使用GNU版本的grep。它功能更强,可以通过-G、-E、-F命令行选项来使用egrep和fgrep的功能。

2、格式

grep [-option] [--color=auto] "搜寻字符串" filename

3、选项与参数 -a :将 binary 文件以 text 文件的方式搜寻数据 -c :计算找到 '搜寻字符串' 的次数 -i :忽略大小写的不同,所有大小写视为相同 -n :顺便输出行号 -v :反向选择,即显示出没有 '搜寻字符串' 内容的那一行

-l, --files-with-matches 只打印匹配FILES 的文件名

-E, --extended-regexp PATTERN 是一个可扩展的正则表达式(缩写为 ERE)

-F, --fixed-strings PATTERN 是一组由断行符分隔的定长字符串。

-G, --basic-regexp PATTERN 是一个基本正则表达式(缩写为 BRE)

-P, --perl-regexp PATTERN 是一个 Perl 正则表达式

--color=auto :将找到的关键词部分加上颜色的显示

二、sed

1、概念

sed 是一种在线编辑器,它一次处理一行内容。处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”(pattern space),接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下一行,这样不断重复,直到文件末尾。文件内容并没有 改变,除非你使用重定向存储输出。Sed主要用来自动编辑一个或多个文件;简化对文件的反复操作;编写转换程序等。

2、格式

test.txt内容如下:

清風幾許:~/program/shell$ cat test.txt

waxberry:10:2.5

banana:30:5.5

pear:90:2.3

color colour colouur

<H1>Chapter 1 - 介绍正则表达式</H1>

banana apple

bbb

bbc

bb

1)a:新增,a 的后面可以接字串,而这些字串会在新的一行出现(目前的下一行)~

echo '在test.txt文件中的第二行的下一行(第三行)插入数据'

cat test.txt | sed '2a watermelon:40:7.5'

2)d:删除,因为是删除,所以d后面通常不接任何数据

echo '将test.txt中的第二行到第三行内容删除'

cat test.txt | sed '2,3d'

3) c:取代,c的后面可以接字串,这些字串可以取代n1,n2之间的行!

echo '将test.txt中的指定行内容替换'

cat test.txt | sed '2,3c waxberry:20:1.5'

4) i:插入,i的后面可以接字串,而这些字串会在新的一行出现(目前的上一行);

echo '在test.txt文件中的第二行的上一行(第一行)插入数据'

cat test.txt | sed '2i watermelon:40:7.5'

5)s:取代,可以直接进行取代的工作哩!通常这个s的动作可以搭配正规表示法!例如 1,20s/old/new/g 就是啦!

echo '将test.txt中的指定内容替换'

cat test.txt | sed 's/orange/waxberry/'

cat test.txt | sed '1s/5/6/'

6)p:列印,亦即将某个选择的数据印出。通常p会与参数sed -n一起运行

echo '将test.txt中的第二行到第三行内容打印出来'

cat test.txt | sed -n '2,3p'

3、 选项与参数

1)-i :直接修改读取的文件内容,而不是输出到终端。

#将test.txt中的apple替换为waxberry

sed -i 's/apple/waxberry/' test.txt

2)-n :使用安静(silent)模式。在一般sed的用法中,所有来自STDIN的数据一般都会被列出到终端上。但如果加上-n参数后,则只有经过sed 特殊处理的那一行(或者动作)才会被列出来。

echo '将test.txt中匹配的banana行打印出来'

cat test.txt | sed -n '/banana/p'

3) -e :直接在命令列模式上进行sed的动作编辑;

echo '删除第二到第三行,继续删除匹配到pear的行'

cat test.txt | sed -e '2,3d' -e '/pear/d'

4)-f :直接将sed的动作写在一个文件内,-f filename则可以运行filename内的sed动作;

5)-r :sed的动作支持的是延伸型正规表示法的语法。(默认是基础正规表示法语法)

三、awk

1、概念

awk:报告生成器,格式化文本输出。awk其名称得自于它的创始人 Alfred Aho 、Peter Weinberger 和 Brian Kernighan 姓氏的首个字母,awk默认以换行符为标记识别下一行。awk其实是一门编程语言,它支持条件判断、数组、循环等功能。所以,我们也可以把awk理解成一个脚本语言解释器

2、格式

awk [options] 'Pattern{Action}' file1 file2 ...

Pattern:awk默认是逐行处理文本内容,”模式“其实就是追加条件,只有满足条件的的行才会被处理,常见的模式有以下几种

1)BEGIN/END模式,前者表示处理文本之前的行为 ,后者表示处理完文本后的行为

2)关系运算符模式,使用关系运算符来添加限定条件控制awk的输出,常见关系运算符有 < <= == > >= ~ !~

awk -F: '$1=="banana" {print $0}' test.txt

3)空模式,即不加限定条件

4)正则模式,即使用正则表达式来匹配,限定awk输出

5)行范围模式,例如awk '/正则1/,/正则2/{动作}' file这种语法,指定匹配正则1和正则2之间的行来执行动作

Action:因为需要输出格式化后的文本,所以awk最常用的动作就是print和printf

options:

1)-F:指定输入分隔符

$1和$2之间加逗号表示输出分隔符默认为空格,不加则不加分隔符

awk -F: 'BEGIN{print "begin"} {print $1,$2} END{print FILENAME" end\n"}' test.txt

awk -F: 'BEGIN{print "begin"} {print $1 $2} END{print FILENAME" end\n"}' test.txt

2)-v:设置变量的值

awk -v FS=":" 'BEGIN{print "begin"} {print $1,$2} END{print FILENAME" end\n"}' test.txt

3、内置变量

1)FS:输入分隔符,默认为空白字符

2)OFS:输出分隔符,默认为空白字符

3)RS:输入记录分隔符,区别下一行内容的标记,默认为换行符

4)ORS:输出记录分隔符,设定每行内容之间的标记,默认为换行符(使用print输出)

5)NF:number of field,当前行的字段个数(即当前行被分割成了几列)

6)NR:bumber of row,行号

7)FNR:file number of row,读取多个文件时区分设定的行号

8)FILENAME:当前文件名字

9)ARGC:命令行参数的个数

10)ARGV:数组,保存的是命令行给定的各个参数

awk 'BEGIN{print ARGV[0],ARGV[1],ARGC}' test.txt

可知ARGC表示的是awk加上{}之后的参数总和,ARGV[0]表示的是awk本身,ARGV[1]依次类推表示的是{}之后的参数

注意:在awk中,$0:表示当前整行的内容 $1,$2依次类推表示当前行第一列,第二列等等列的内容,只有引用$0、$1等内置变量是才会用到$,引用其他变量,无论是内置变量还是自定义变量,都不使用$,而是直接使用变量名

猜你喜欢

转载自blog.csdn.net/qq_33575901/article/details/81284198