Linux系统中: shell的文本处理( grep / sed / awk)

######1.grep文本过滤明令######

全面搜索研究正则表达式并显示出来

grep 命令是一种强大的文本搜索工具 , 根据用户指定的“模式”对目标文本进行匹配检查 ,打印匹配到的行。
由正则表达式或者字符及基本文本字符所编写的过滤条件。

###1.grep的格式###

grep   匹配条件  处理文件

###2.grep中字符的匹配位置设定###

^ 关键字             ##以 “关键字”开头
关键字 $            ##以 “关键字”结尾
\< 关键字           ##“关键字”前没有字符
关键字 \>           ##“关键字”后没有字符
\< 关键字 \>       ##“关键字”前后均没有字符

Linux系统中: shell的文本处理( grep / sed / awk)

Linux系统中: shell的文本处理( grep / sed / awk)

grep  -i    ##忽略大小写

Linux系统中: shell的文本处理( grep / sed / awk)

Linux系统中: shell的文本处理( grep / sed / awk)

Linux系统中: shell的文本处理( grep / sed / awk)

Linux系统中: shell的文本处理( grep / sed / awk)Linux系统中: shell的文本处理( grep / sed / awk)

###3.grep的正则表达式###

1)grep   r...   file         ##以r开头的任意3个字符的行
2)grep   r...t   file        ##以r开头、t结尾的,并且中间有任意3个字符的行
3)grep   ...t    file        ##以t结尾的,前面有3个字符的行

Linux系统中: shell的文本处理( grep / sed / awk)

Linux系统中: shell的文本处理( grep / sed / awk)

Linux系统中: shell的文本处理( grep / sed / awk)

###4.grep 正则表达式与扩展正则表达式###

正规的 grep 不支持扩展的正则表达式,
竖线是用于表示“或”的扩展正则表达式字符,正规的 grep 无法识别
加上反斜杠,这个字符就被翻译成扩展正则表达式,就像 egrp和grep -E 一样

Linux系统中: shell的文本处理( grep / sed / awk)

Linux系统中: shell的文本处理( grep / sed / awk)

###5.grep 中字符的匹配次数设定###

.*                  ##关键字之间匹配任意字符
*                   ##字符出现 [0- 任意次 ]
\?                 ##字符出现 [0-1 次 ]
\+                 ##字符出现 [1- 任意次 ]
\{n\}              ##字符出现 [n 次 ]
|{m,n\}          ##字符出现 [ 最少出现 m 次,最多出现 n 次 ]
\{0,n\}           ##字符出现 [0-n 次 ]
\{m,\}            ##字符出现 [ 至少 m 次 ]
\(xy\)\{n\}xy   ##关键字出现 [n 次 ]

Linux系统中: shell的文本处理( grep / sed / awk)

Linux系统中: shell的文本处理( grep / sed / awk)

*     ##字符出现 [0- 任意次 ]

Linux系统中: shell的文本处理( grep / sed / awk)

\+     ##字符出现 [1- 任意次 ]

Linux系统中: shell的文本处理( grep / sed / awk)

\{n\}            ##字符出现 [n 次 ]
|{m,n\}          ##字符出现 [ 最少出现 m 次,最多出现 n 次 ]
\{0,n\}          ##字符出现 [0-n 次 ]
\{m,\}           ##字符出现 [ 至少 m 次 ]

Linux系统中: shell的文本处理( grep / sed / awk)

\?     ##字符出现 [0-1 次 ]

Linux系统中: shell的文本处理( grep / sed / awk)

######2.sed行编辑器######

用来操作纯 ASCII 码的文本
处理时,把当前处理的行存储在临时缓冲区中,称为“模式间” (patternspace),可以指定仅仅处理哪些行
sed 符合模式条件的处理,不符合条件的不予处理
处理完成之后把缓冲区的内容送往屏幕
接着处理下一行,这样不断重复,直到文件末尾

调用sed 命令格式:
有两种形式:
sed  [options]   ' command '   file(s)
sed  [options]   -f   scriptfile   file(s)

###1.p 模式操作###

sed   -n    '/\:/p'  file              ##显示以:隔开的行,不复制
sed   -n    '/ xxx$ /p'  file
       ##显示以xxx结尾的行,不复制
sed   -n    '/ ^xxx /p'  file       ##显示以xxx开头的行,不复制
sed   -n    '2,6p'   file           ##显示第2行至第6行,不复制
sed   -n    '2,6!p'  file           ##显示除了第2行至第6行以外的行,不复制

Linux系统中: shell的文本处理( grep / sed / awk)

sed -n '/\:/p'  xxx    ##显示以:隔开的行

Linux系统中: shell的文本处理( grep / sed / awk)

sed -n /^#/p  xxx     ##显示以#开头的行

Linux系统中: shell的文本处理( grep / sed / awk)

sed -n '/^#/!'p  xxx  ##显示除了以#开头的行

Linux系统中: shell的文本处理( grep / sed / awk)

cat -b  xxx   ##跳过空行显示行号

Linux系统中: shell的文本处理( grep / sed / awk)

cat -n  xxx   ##包括空行显示行号

Linux系统中: shell的文本处理( grep / sed / awk)

cat -n  xxx | sed -n '6p'             ##显示第6行
cat -n  xxx | sed -n '2,6p'           ##显示第2行至第6行
cat -n  xxx | sed -n -e '2p' -e '6p'  ##显示第2行和第6行
cat -n  xxx | sed -n -e '2p;6p'       ##显示第2行和第6行

Linux系统中: shell的文本处理( grep / sed / awk)

Linux系统中: shell的文本处理( grep / sed / awk)

Linux系统中: shell的文本处理( grep / sed / awk)

 

###2. d 模式操作###

sed   '/^xxx/d'  file           ##删除以xxx开头的行,并显示
sed    '/^xxx/!d'  file         ##删除除了以xxx开头的行之外的行,并显示
sed    '/xxx $/d'  file         ##删除以xxx结尾的行,并显示
sed    '1,4d'  file              ##删除第1行至第4行,并显示
sed    –n    '/^xxx/d'  file  ##删除以xxx开头的行,不显示

sed   '/^xxx/d'     ##删除以xxx开头的行,并显示
sed   '/^xxx/!d'    ##删除除了以xxx开头的行之外的行,并显示(只保留以xxx开头的行)
sed –n  '/^xxx/d'   ##删除以xxx开头的行,不显示

Linux系统中: shell的文本处理( grep / sed / awk)

Linux系统中: shell的文本处理( grep / sed / awk)

Linux系统中: shell的文本处理( grep / sed / awk)

cat -n  xxx | sed '4d'             ##删除第4行,并查看
cat -n  xxx | sed '4,6d'           ##删除第4行至第6行,并查看
cat -n  xxx | sed  -e '4d;6d'      ##删除第4行和第6行,并查看

Linux系统中: shell的文本处理( grep / sed / awk)

Linux系统中: shell的文本处理( grep / sed / awk)

Linux系统中: shell的文本处理( grep / sed / awk)

###3.a 模式操作###

sed  '/^xxx/a \hello westos'   file             ##添加hello westos到以xxx开头的行的下一行
sed  '/^xxx/a \hello \nwestos'   file      ##添加[hello换行westos]到以xxx开头的行的下一行

sed  'axxx'  ##添加xxx到每一行的下一行

Linux系统中: shell的文本处理( grep / sed / awk)

Linux系统中: shell的文本处理( grep / sed / awk)

Linux系统中: shell的文本处理( grep / sed / awk)

 

###4. i 模式操作###

sed   '/^xxx/i\hello \nwestos'   file       ##插入[hello换行westos]到以xxx开头的行的上一行

Linux系统中: shell的文本处理( grep / sed / awk)

Linux系统中: shell的文本处理( grep / sed / awk)

###5. c 模式操作###

sed '/^xxx/c\hello \nwestos'   file        ##用[hello换行westos]替换以xxx开头的行

Linux系统中: shell的文本处理( grep / sed / awk)

Linux系统中: shell的文本处理( grep / sed / awk)

###6. w 模式操作###

sed  '/^xxx/w file1'   file             ##将以xxx开头的行导入到一个新文件中,并显示
sed  -n  '/^xxx/w  file1'  file          ##将以xxx开头的行导入到一个新文件中,不显示
            

Linux系统中: shell的文本处理( grep / sed / awk)

Linux系统中: shell的文本处理( grep / sed / awk)

###7. sed的其他用法###

sed   '*/xxx'   file        ##将xxx文件里的内容插入到每一行的下一行
sed   '6r*/xxx'   file    ##将xxx文件里的内容插入到第6行的下一行

Linux系统中: shell的文本处理( grep / sed / awk)

Linux系统中: shell的文本处理( grep / sed / awk)

sed    '/^xxx/='   file                                         ##显示以xxx开头的行的行号和所有内容
sed   -n  '/^xxx/='   file                                    ##显示以xxx开头的行的行号,不显示内容
sed   -n  -e  '/^xxx/p'  -e  '/^xxx/='   file          ##显示以xxx开头的行的行号和内容

Linux系统中: shell的文本处理( grep / sed / awk)

Linux系统中: shell的文本处理( grep / sed / awk)

Linux系统中: shell的文本处理( grep / sed / awk)

Linux系统中: shell的文本处理( grep / sed / awk)

sed   -nf   file2   file     ##执行file2文件中的条件,不复制原文件内容

Linux系统中: shell的文本处理( grep / sed / awk)

Linux系统中: shell的文本处理( grep / sed / awk)

sed   ' = '   file                                   ##在文件每一行的上一行插入行号
sed   ' N;s/ \ n /  /g'  file                     ##将文件中显示的行号移至每一行前面,并空格

Linux系统中: shell的文本处理( grep / sed / awk)

Linux系统中: shell的文本处理( grep / sed / awk)

sed   's/^xxx/***/g'   file                                 ##将文件中所有的xxx替换成***,并显示
sed   -e  's/xxx/***/g;s/###/+++/g'  file       ##将文件中所有的xxx替换成***和###替换成+++,并显示
sed   's/ \ / / # /'   file                                   ##将文件中的 / 替换成#,只替换第一个,并显示

Linux系统中: shell的文本处理( grep / sed / awk)

Linux系统中: shell的文本处理( grep / sed / awk)

Linux系统中: shell的文本处理( grep / sed / awk)

sed  '4s/xxx/***/g'   file                           ##将第4行的xxx替换成***,并显示全文
sed  '2,4s/xxx/***/g'  file                         ##将第2行到第4行的xxx替换成***,并显示全文
sed  '/###/,/+++/s/xxx/***/g'  file            ##将以###开头的行至以+++开头的行中的xxx替换成***,并显示全文

Linux系统中: shell的文本处理( grep / sed / awk)

Linux系统中: shell的文本处理( grep / sed / awk)

Linux系统中: shell的文本处理( grep / sed / awk)

sed   's/ \ / /  /g'  file               ##将文中的所有“ \ ”换为“ ”,并显示
sed   '[email protected]/@  @g'  file          ##@和 / 是一个意思,为了方便区分使用
sed   '[email protected]@***@g'  file   ##将文中的所有xxx换为***,并显示

Linux系统中: shell的文本处理( grep / sed / awk)

Linux系统中: shell的文本处理( grep / sed / awk)

Linux系统中: shell的文本处理( grep / sed / awk)

sed    'G'   file              ##将文件中的每一行都空一行
sed   '$!G'   file           ##除了最后一行后不空行外,其他的每一行都空一行
sed   -n  '$p'  file         ##显示最后一行

Linux系统中: shell的文本处理( grep / sed / awk)

Linux系统中: shell的文本处理( grep / sed / awk)

Linux系统中: shell的文本处理( grep / sed / awk)

######3. awk报告生成器######

awk处理机制:逐行处理文本,支持在处理第一行之前做一些准备工作,以及在处理完最后一行做一些总结性质的工作。
awk在命令格式上分别体现如下 :
BEGIN{}: 读入第一行文本之前执行 , 一般用来初始化操作
{}: 逐行读入文本,执行相应的处理。是最常见的编辑指令块
END{}: 处理完最后一行文本之后执行 , 一般用来输出处理结果


###awk基本用法###

awk  -F '{print FILENAME}'    file              ##将文件的所有行替换为file的名称,并显示
awk  -F '{print 第 "NR" 行 }'    file             ##显示文中的所有行号             
awk  -F'{print 有 "NF" 列 }'    file              ##显示每一行的列数

Linux系统中: shell的文本处理( grep / sed / awk)

Linux系统中: shell的文本处理( grep / sed / awk)Linux系统中: shell的文本处理( grep / sed / awk)

Linux系统中: shell的文本处理( grep / sed / awk)

Linux系统中: shell的文本处理( grep / sed / awk)

awk 'BEGIN{print  xxx}'  file                ##文件以xxx开头,并显示xxx       
awk 'END{print  ***}'  file                    ##文件以***结尾,并显示***
awk -F : 'BEGIN{print  xxx}{print $n}END{***}'  file        ##显示文件以xxx开头,第n列,以***结尾

Linux系统中: shell的文本处理( grep / sed / awk)Linux系统中: shell的文本处理( grep / sed / awk)

Linux系统中: shell的文本处理( grep / sed / awk)Linux系统中: shell的文本处理( grep / sed / awk)
awk '/bash$/' file                             
awk -F : '/bash$/{print $1}'  file                 ##显示第1列的第1行
awk -F : '!/bash$/{print $1}'  file               ##显示除了第1列的第1行之外的所有行
awk 'BEGIN{a=34;print a+12}'                  ##显示34+12的结果

Linux系统中: shell的文本处理( grep / sed / awk)

Linux系统中: shell的文本处理( grep / sed / awk)

Linux系统中: shell的文本处理( grep / sed / awk)

awk -F : '/^[a-d]/{print $1,$6}' passwd.txt
awk -F : '/^a|nologin$/{print $1,$7}' passwd.txt

Linux系统中: shell的文本处理( grep / sed / awk)

Linux系统中: shell的文本处理( grep / sed / awk)

awk -F : '$6~/bin$/{print $1,$6}'
awk -F : '$7!~/nologin$/{print $1,$7}' passwd.txt

Linux系统中: shell的文本处理( grep / sed / awk)