关于linux:Linux三剑客AwkSedGrep-命令详解

48次阅读

共计 6793 个字符,预计需要花费 17 分钟才能阅读完成。

Linux 三剑客 Awk 命令详解

命令名称

Awk  pattern scanning and processing language

命令作用

对文本和数据进行解决

具体阐明

awk 是一种编程语言,用于在 linux/unix 下对文本和数据进行解决。数据能够来自规范输 (stdin)、一个或多个文件,或其它命令的输入。它在命令行中应用,但更多是作为脚本来应用。awk 有很多内建的性能,比方数组、函数等,这是它和 C 语言的相同之处,灵活性是 awk 最大的劣势。

语法格局

awk [options] 'scripts' var=value filename

罕用参数

  • -F 指定分隔符(能够是字符串或正则表达式)
  • -f 从脚本文件中读取 awk 命令
  • -v var=value 赋值变量,将内部变量传递给 awk

脚本根本构造

 awk 'BEGIN{print"start"} pattern{commands} END{print"end"}' filename

一个 awk 脚本通常由 BEGIN 语句 + 模式匹配 +END 语句三局部组成, 这三局部都是可选项

工作原理:

  • 第一步执行 BEGIN 语句
  • 第二步从文件或规范输出读取一行,而后再执行 pattern 语句,逐行扫描文件到文件全副被读取
  • 第三步执行 END 语句

实例展现:

echo "hello" | awk 'BEGIN{print"welcome"} END{print"2017-08-08"}'
welcome
2017-08-08

echo -e "hello" | awk 'BEGIN{print"welcome"} {print} END{print"2017-08-08"}'
welcome
hello
2017-08-08
#不加 print 参数时默认只打印以后的行

echo|awk '{a="hello"; b="nihao"; c="mingongge"; print a,b,c;}'
hello nihao mingongge
#应用 print 以逗号分隔时,打印则是以空格分界

echo|awk '{a="mgg"; b="mingg"; c="mingongge"; print a" is "b" or "c;}'
mgg is mingg or mingongge
#awk 的 print 语句中双引号其实就是个拼接作用

Awk 的变量

内置变量

$0   #以后记录
$1~$n #以后记录的第 N 个字段
FS   #输出字段分隔符(- F 雷同作用)默认空格
RS   #输出记录宰割符,默认换行符
NF   #字段个数就是列
NR   #记录数,就是行号,默认从 1 开始
OFS  #输入字段分隔符,默认空格
ORS  #输入记录宰割符,默认换行符  

内部变量

[mingongge@ ~]#a=100
[mingongge@ ~]#b=100
[mingongge@ ~]#echo |awk '{print v1*v2}' v1=$a v2=$b
10000

Awk 运算与判断

算术运算符

      •  加减
    • / & 乘 除 求余
  • ^ *  求幂
  • ++ — 减少或缩小,作为前缀或后缀
[mingongge@ ~]#awk 'BEGIN{a="b";print a,a++,a--,++a;}'
b 0 1 1

[mingongge@ ~]#awk 'BEGIN{a="0";print a,a++,a--,++a;}'
0 0 1 1

[mingongge@ ~]#awk 'BEGIN{a="0";print a,a++,--a,++a;}'
0 0 0 1

#和其它编程语言一样,所有用作算术运算符进行操作,操作数主动转为数值,所有非数值都变为 0 

赋值运算符

= += -= *= /= %= ^= **=

正则运算符

~ !~  匹配正则表达式 / 不匹配正则表达式 

逻辑运算符

||  &&  逻辑或  逻辑与 

关系运算符

< <= > >= != = 

其它运算符

$     #字段援用 
空格  #字符串链接符
?:    #三目运算符
ln    #数组中是否存在某键值 

Awk 正则

^    行首定位符
$    行尾定位符
.    匹配任意单个字符
*    匹配 0 个或多个前导字符(包含回车)+    匹配 1 个或多个前导字符
?    匹配 0 个或 1 个前导字符 
[]   匹配指定字符组内的任意一个字符 /^[ab]
[^]  匹配不在指定字符组内的任意一个字符
()   子表达式
|    或者
\    本义符
~,!~ 匹配或不匹配的条件语句
x{m} x 字符反复 m 次
x{m,} x 字符至多反复 m 次
X{m,n} x 字符至多反复 m 次但不起过 n 次(需指定参数 -posix 或 --re-interval)

Linux 三剑客 Sed 命令详解

命令名称

Sed 一个弱小的流式文本编辑器

具体阐明

sed 是一种流编辑器,也是文本处理中十分好的工具,配合正则应用更弱小解决时,把以后解决的行存储在长期缓冲区中,称为“模式空间”,接着用 sed 命令解决缓冲区的内容,实现后输入到屏幕,接着解决下一行.

命令格局

 sed [options] 'command' file(s)

 sed [options] -f scriptfile file(s)

罕用参数

-e #以指定的指令来解决输出的文本文件
-n  #勾销默认输入(如果和 p 命令同时应用只会打印产生扭转的行 **)-h #帮忙
-V #显示版本信息 

常用命令

a #在以后行上面插入文本 

i #在以后行下面插入文本 

c #把选定的行改为新的文本 

d #删除,删除抉择的行 

D #删除模板块的第一行 

s #替换指定字符 

h #拷贝模板块的内容到内存中的缓冲区

H #追加模板块的内容到内存中的缓冲区 

g #取得内存缓冲区的内容,并代替以后模板块中的文本 

G #取得内存缓冲区的内容,并追加到以后模板块文本的前面 

l #列表不能打印字符的清单 

n #读取下一个输出行,用下一个命令解决新的行而不是用第一个命令 

N #追加下一个输出行到模板块前面并在二者间嵌入一个新行,扭转以后行号码 

p  #打印匹配的行 

P #(大写) 打印模板的第一行

q  #退出 Sed 

b  #lable 分支到脚本中带有标记的中央,如果分支不存在则分支到脚本的开端 

r #file 从 file 中读行 

t #label if 分支,从最初一行开始,条件一旦满足或者 T,t 命令,将导致分支到带有标号的命令处,或者到脚本的开端 

T #label 谬误分支,从最初一行开始,一旦产生谬误或者 T,t 命令,将导致分支到带有标号的命令处,或者到脚本的开端 

w #file 写并追加模板块到 file 开端

W #file 写并追加模板块的第一行到 file 开端

!  #示意前面的命令对所有没有被选定的行产生作用 

=  #打印以后行号码

# #把正文扩大到下一个换行符以前

Sed 替换命令

g #示意行内全面替换(全局替换配合 s 命令应用)p #示意打印行 

w  #示意把行写入一个文件 

x #示意调换模板块中的文本和缓冲区中的文本 

y #示意把一个字符翻译为另外的字符(然而不用于正则表达式)1  #子串匹配标记 

& #已匹配字符串标记

Sed 正则

^ #匹配行开始 

$ #匹配行完结

. #匹配一个非换行符的任意字符

 #匹配 0 个或多个字符

[] #匹配一个指定范畴内的字符

[^]  #匹配一个不在指定范畴内的字符 

(..) #匹配子串

&  #保留搜寻字符用来替换其余字符

< #匹配单词的开始

>  #匹配单词的完结

x{m} #反复字符 x,m 次

x{m,} #反复字符 x,至多 m 次 

x{m,n} #反复字符 x,至多 m 次,不多于 n 次

Sed 罕用实例

1、替换操作

echo "hello world" |sed 's/ /-/1g'
hello-world 
#从第一个空格开始全局替换成 -,只不过文本中只有一个空格 

2、删除操作

sed '/^$/d' filename #删除空白行

sed '2d' filename #删除第二行

sed '2,$d' filename #删除第二直到未尾所有行

sed '$d' filename #删除最初一行

sed '/^test/'d filename #删除以 test 结尾行

3、匹配替换

echo "hello world" |sed 's/w+/[&]/g'

[hello] [world]

echo "hello world" |sed 's/w+/"&"/g'

"hello" "world"

#w+ 匹配每一个单词,& 示意匹配到的字符串

echo AAA bbb |sed 's/([A-Z]+) ([a-z]+)/[2] [1]/'

[bbb] [AAA]

#子串匹配替换

4、选定范畴

sed -n '/= 0/,/max/p' svnserve.conf

#min-encryption = 0

#max-encryption = 256

#所有在 = 0 到 max 范畴内的行都会被打印进去 

5、sed 多点编辑性能(-e)

[root@centos001 ~]#cat -n test 
1  this is a test file
2  welcome
3  to
4  here
5  hello WORLD
6
7  linux centos6.8
8  redhat

sed -e '2,6d' -e 's/linux centos6.8/Linux Centos6.8/' test
this is a test file
Linux Centos6.8
redhat
#如果两条命令性能一样,那么就须要用到上面的参数

sed --expression='s/linux centos6.8/Linux Centos6.8/' --expression='s/to/TO/' test**
this is a test file
welcome
TO
here
hello WORLD
Linux CenTOs6.8
redhat

6、读入与写入

[root@centos001 ~]#cat test1
welcom 
to 
here

[root@centos001 ~]#sed '/here/r test1' test
this is a test file
welcome
to
here
#welcom
to
here#
hello WORLD
linux centos6.8
redhat

#将 test1 的文件内容读取显示所有匹配 here 行的前面
sed -n '/centos6.8/w test2' test

[root@centos001 ~]#cat test2
linux centos6.8

#将 test 文件匹配到 centos6.8 的所有行都写入到 test2 文件中,文件能够不存在.
#如果文件存在,就会被重定向不是追加

7、追加与插入

[root@centos001 ~]#sed '/^l/a2017-08-08' test2
linux centos6.8
2017-08-08
#在匹配以 l 结尾的行的前面追加 2017-08-08

[root@centos001 ~]#sed '1a2017-08-08' test2
linux centos6.8
2017-08-08
#在第一行的前面追加 2017-08-08

[root@centos001 ~]#sed '/^l/i2017-08-08' test2
2017-08-08
linux centos6.8
#在匹配以 l 结尾的行的后面插入 2017-08-08
####### 以上操作是不会扭转文件内容 ################

[root@centos001 ~]#sed -i '/^l/i2017-08-08' test2
[root@centos001 ~]#cat test2
2017-08-08
linux centos6.8

8、其它命令实例

[root@centos001 ~]#cat -n test2
 1 2017-08-08
 2 linux centos6.8
 3 08
 4
 5 test

[root@centos001 ~]#**sed '/08/{n; s/l/L/;}' test2
2017-08-08
Linux centos6.8
08
test
#如果 08 匹配到就跳到下一行,将小写 l 替换成大写,留神到第三行也是被匹配到
#然而前面的条件不满足,所有没有被替换

[root@centos001 ~]#sed '1,4y/8/9/' test2
2017-09-09
linux centos6.9
09
test
#将 1 至 4 行所有的数字 8 替换成 9

[root@centos001 ~]#**sed '1q' test2**
2017-08-08
#打印第一行内容后退出 

9、打印奇数或公偶数行

[root@centos001 ~]#sed -n 'p;n' test2
20170808
08

[root@centos001 ~]#sed -n 'n;p' test2
linux centos6.8
test

[root@centos001 ~]#sed -n '1~2p' test2
20170808
08

[root@centos001 ~]#sed -n '2~2p' test2
linux centos6.8
test

10、打印匹配字符串行的下一行

[root@centos001 ~]#sed -n '/linux/{n;p}' test2
08

[root@centos001 ~]#awk '/linux/{getline; print}' test2
08

Linux 三剑客 Grep 命令详解

命令名称:
grep

命令作用:

文本查找或搜寻工具

具体阐明:

同样能够配合正则表达式来搜寻文本,并将匹配的行打印输出, 也可用于过滤与搜寻特定字符串,应用非常灵便

罕用参数

-a  #不要疏忽二进制数据

-A  #除了显示合乎范本款式的那一行之外,并显示该行之后的内容

-b  #在显示合乎范本款式的那一行之外,并显示该行之前的内容

-B  #除了显示合乎款式的那一行之外,并显示该行之前的内容

-c  #计算合乎范本款式的列数

-C  #除了显示合乎范本款式的那一列之外,并显示该列之前后的内容

-d  #当指定要查找的是目录而非文件时,必须应用这项参数,否则 grep 命令将回报信息并进行动作

-e  #指定字符串作为查找文件内容的范本款式

-E  #将范本款式为延长的一般表示法来应用,意味着应用能应用扩大正则表达式

-f  #指定范本文件,其内容有一个或多个范本款式,让 grep 查找合乎范本条件的文件内容,格局为每一列的范本款式

-F  #将范本款式视为固定字符串的列表

-G  #将范本款式视为一般的表示法来应用

-h  #在显示合乎范本款式的那一列之前,不标示该列所属的文件名称

-H  #在显示合乎范本款式的那一列之前,标示该列的文件名称

-i  #疏忽字符大小写的差异

-l  #列出文件内容合乎指定的范本款式的文件名称

-L  #列出文件内容不合乎指定的范本款式的文件名称

-n  #在显示合乎范本款式的那一列之前,标示出该列的编号

-q  #不显示任何信息

-R/-r #此参数的成果和指定“-d recurse”参数雷同

-s  #不显示错误信息

-v  #反转查找

-V  #显示版本信息 

-w  #只显示全字合乎的列

-x  #只显示全列合乎的列

-y  #此参数成果跟“-i”雷同

-o  #只输入文件中匹配到的局部

正则表达式

^  #匹配以 XX 结尾的行

$  #匹配以 XX 结尾的行 

罕用实例

1、在多个文件中查找:

grep "file" file_1 file_2 file_3 

2、输入除之外的所有行 -v 选项:

grep -v "file" file_name

3、标记匹配色彩 –color=auto 选项:

grep "file" file_name --color=auto

4、应用正则表达式 -E 选项:

grep -E "[1-9]+"

egrep "[1-9]+"

5、只输入文件中匹配到的局部 -o 选项:

echo this is a test line. | grep -o -E "[a-z]+."

line.

echo this is a test line. | egrep -o "[a-z]+."

line.

6、统计文件或者文本中蕴含匹配字符串的行数 -c 选项:

grep -c "text" file_name

2

7、输入蕴含匹配字符串的行数 -n 选项:

grep "text" -n file_name

或

cat file_name | grep "text" -n

8、多个文件

grep "text" -n file_1 file_2

9、搜寻多个文件并查找匹配文本在哪些文件中:

grep -l "text" file1 file2 file3...

10、grep 递归搜寻文件

在多级目录中对文本进行递归搜寻:

grep "text" . -r -n

11、疏忽匹配款式中的字符大小写:

echo "hello world" | grep -i "HELLO"

hello

12、选项 -e 指定多个匹配款式:

echo this is a text line | grep -e "is" -e "line" -o

is

line

13、也能够应用 -f 选项来匹配多个款式,在款式文件中逐行写出须要匹配的字符。

cat patfile

aaa

bbb

echo aaa bbb ccc ddd eee | grep -f patfile -o

14、在 grep 搜寻后果中包含或者排除指定文件:

只在目录中所有的.php 和.html 文件中递归搜寻字符 ”main()”

grep "main()" . -r --include *.{php,html}

15、在搜寻后果中排除所有 README 文件

grep "main()" . -r --exclude "README"

16、在搜寻后果中排除 filelist 文件列表里的文件

grep "main()" . -r --exclude-from filelist

Linux 三剑客 Awk、Sed、Grep 命令详解, 到这里就介绍完了。欢送评论、点赞、转发分享反对。

正文完
 0