on
on

Shell入门——awk、sed、grep

Author:

https://www.cnblogs.com/along21/p/10366886.html

Grep

grep是Linux系统中的文本搜索工具,使用正则表达式搜索搜索文本,并把匹配的行打印出来,全称是Global Regular Expression Print。
egrep = grep -E 即扩展的正则表达式
grep [option] pattern file
命令参数:

  • -A<显示行数>:除了符合pattern的那一行外,之后的内容。
  • -B<显示行数>:除了符合pattern的那一行外,之前的内容。
  • -C<显示行数>:除了符合pattern的哪一行之外,前后的内容。
  • -c:统计匹配的行数
  • -e:实现多个选项间的逻辑或关系
  • -E:拓展的正则表达式
  • -f FILE:从FILE中获取用于匹配的pattern
  • -F:相当于fgrep,搜索字符串
  • -i –ignore-case 忽略字符大小写的差别
  • -n:显示匹配的行号
  • -o:仅显示匹配到的字符串
  • -q:静默模式,不输出任何信息
  • -s:不显示错误信息
  • -v:显示不被pattern匹配到的行
  • -w:匹配整个单词

正则表达式

在linux中,常用的正则表达式有:

  • POSIX基本正则表达式引擎
  • POSIX扩展正则表达式引擎

基本正则表达式

  • . 匹配任意单个字符,不能匹配空行
  • []匹配指定范围内的任意单个字符
  • [^]取反
  • [:alnum:]或[0-9a-zA-Z]
  • [:alpha:]或[a-zA-Z]
  • [:upper:]或[A-Z]
  • [:lower:]或[a-z]
  • [:blank:]空白字符或制表符
  • [:space:]水平或垂直的空白字符
  • [:cntrl:]不可打印的控制字符(退格、删除、警铃)
  • [:digit:]或[0-9]
  • [:xdigit:]十六进制数字
  • [:graph:]可打印的非空白字符
  • [:print:]可打印字符
  • [:punct:]标点符号

配置次数

  • * 匹配前面的字符人一次,包括0次,贪婪模式:尽可能长的匹配
  • .* 任意长度的任意字符,不包括0次
  • \? 匹配其前面的字符0或1次
  • \+ 匹配前面的字符至少1次
  • \{n\} 匹配前面的字符n次
  • \{m,n\} 匹配前面的字符至少m次,至多n次
  • \{,n\} 匹配前面的字符至多n次
  • \{n,\} 匹配前面的字符至少n次

位置锚定:定位出现的位置

  • ^ 行首锚定,用于模式的最左侧
  • $ 行尾锚定,用于模式的最右侧
  • ^PATTERN$ 用于模式匹配整行
  • ^$ 空行
  • ^[[:space:]].*$ 空白行
  • \< 或 \b 词首锚定,用于单词模式的左侧
  • \> 或 \b 词尾锚定,用于单词模式的右侧
  • \<PATTERN\>

分组和后向引用

  • 分组: \( \)将一个或多个字符捆绑在一起,当作一个整体进行处理,分组括号中的模式匹配到的内容会被正则表达式引擎记录于内部的变量中,这些变量的命名方式为:\1, \2, \3, …
  • 后向引用:引用前面的分组中的模式所匹配字符,而非模式本身,\&表示前面的分组中所有的字符
  • grep “\(HE\).*\1” test 👈 例如

扩展正则表达式

  • .任意单个字符
  • []指定方位的字符
  • [^]不在指定方位的字符
  • * 任意次 // ? 0次或1次 // + 至少一次 // {m} m次 //等其他的,不需要使用\进行转义{
  • ^ 行首
  • $ 行尾
  • \<, \b 语首 \>, \b语尾
  • () 分组,向后引用 \1,\2

sed

简介

sed是一种流编辑器,它一次处理一行内容。处理时,把当前处理的行存储在临时缓冲区,称为“模式空间”,接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。然后读入下行,执行下一个循环。如果没有使用诸如’D’的特殊命令,会在两个循环之间清空模式空间,但不会清空保留空间。文件内容并没有改变,除非你使用重定向存储输出或-i。功能:主要用来自动编辑一个或多个文件,简化对文件的反复操作。

命令格式
sed [options] ‘[地址定界] command’ file(s)

常用选项

  • -n:不输出模式空间内容到屏幕,即不自动打印,只打印匹配到的行
  • -e:多点编辑,对每行处理时,可以有多个Script
  • -f:把script写到文件当中,在执行sed时-f指定文件路径,如果是多个script,换行写
  • -r:支持拓展的正则表达式
  • -i:直接将处理的结果写入文件
  • -i.bak:在将处理的结果写入文件之前备份一份

地址定界

不给地址:默认对全文进行处理
单地址: #:指定行;/pattern/:被此模式能够匹配到的每一行
地址范围: #,#; #, +# ; /pat1/, /pat2/; #, /pat1/
步进:sed -n ‘1~2p’ 只打印奇数行,sed -n ‘2~2p’只打印偶数行

编辑命令

  • d:删除模式空间匹配的行,并立即启用下一轮循环
  • p:打印当前模式空间内容,追加到默认输出之后
  • a:在指定行后面追加文本,支持使用\n实现多行追加
  • i:在行前面插入文本,支持使用\n实现多行追加
  • c:替换行为单行或多行文本,支持使用\n实现多行追加
  • w:保存模式匹配的行到指定文件
  • r:读取指定文件的文本至模式空间中匹配到的行后
  • =:为模式空间中的行打印行号
  • !:模式空间中匹配行取反处理
  • s///查找替换,支持使用其他分割符,如:s@@@, s###;
  • s/pattern_o/pattern_r/g

sed高级编辑命令

  • h 把模式空间中的内容覆盖到保持空间中
  • H 把模式空间中的内容追加至保持空间中
  • g 从保持空间取出数据覆盖至模式空间
  • G 从保持空间取出内容追加至模式空间
  • x 把模式空间中的内容与保持空间中的内容进行呼唤
  • n 读取匹配到的行的下一行覆盖至模式空间
  • N 读取匹配到的行的下一行追加至模式空间
  • d 删除模式空间中的行
  • D 删除当前模式空间开端至\n的内容,放弃之后的命令,但是对剩余的模式空间重新执行sed

Awk

awk简介

awk是一种编程语言,用于在linux/unix下对文本和数据进行处理。数据可以来自标准输入(stdin)、一个或多个文件,或其它命令的输出。它支持用户自定义函数和动态正则表达式等先进功能,是linux/unix下的一个强大编程工具。它在命令行中使用,但更多是作为脚本来使用。awk有很多内建的功能,比如数组、函数等,这是它和C语言的相同之处,灵活性是awk最大的优势。

awk [options] ‘program’ var=value file…
awk [options] -f programfile var=value file…
awk [options] ‘BEGIN{action;…} pattern{action;…} END{action;…}’ file…

常用命令选项

  • -F fs:fs指定输入分隔符,fs可以是字符串或正则表达式
  • -v var=value:赋值一个用户定义变量,将外部变量传递给awk
  • -f scripfile:从脚本文件中读取awk命令

awk变量

变量:内置和自定义变量,每个变量前加-v

  • FS:输入字段分隔符,默认为空白字符
  • OFS:输出字段分隔符,默认为空白字符
  • RS:输入记录分隔符,指定输入时的换行符,原换行符仍然有效
  • ORS:输出记录分隔符,输出时用指定符号代替换行符
  • NF:字段数量,共有多少字段,$NF引用最后一列,$(NF-1)引用倒数第二列
  • NR:行号,后可跟多个文件,第二个文件行号继续从第一个文件最后行号开始
  • FNR:个文件分别计数,行号
  • FILENAME:当前文件名
  • ARGC:命令行参数的个数
  • ARGV:数组,保存的是命令行所给定的各参数

操作符

  • 算术操作符:+ – * / ^ %
  • 赋值操作符:= += -= *= /= %= ^= ++ —
  • 比较操作符:== != > >= < <=
  • 模式匹配符:~左边是否和右边匹配,!~是否不匹配
  • 逻辑操作符:&& || !
  • 函数调用:function_name(arg1, arg2,…)
  • 条件表达式:selector?if-true-expression:if-false-expression

awk PATTERN 匹配

PATTERN:根据pattern条件,过滤匹配的行,再做处理

  • 如果未指定:空模式,匹配每一行
  • /regular expression/:进处理能够匹配到的行,使用正则规则
  • relation expression:关系表达式,结果为真才会被处理
  • line ranges行范围
  • BEGIN仅在开始处理文件中的文本前执行一次END尽在文本处理完后执行

awk if-else判断

if(condition){statement;….}[else statement]
if(condition1){statement1}else if(condintion2){statement2} else {statement3}

awk while循环

while(condition){statement;…}

awk do-while循环

do{statement;…}while(condition)

awk for循环

for(expr1;expr2;expr3){statement;…}

for(var in array){statement}