Linux三剑客grep,sed,awk及使用介绍(2)

在模式空间中,完成匹配的操作。当没有匹配上的时候,文本行内容会默认输出stdout;当匹配上文本行的时候,会执行编辑命令,执行结果输出到stdout中。
保持空间可以理解为一个暂存区,只是用于完成额外的动作。

参数
h:把模式空间中的内容覆盖至保持空间中;
H:把模式空间中的内容追加至保持空间中;
g:把保持空间中的内容覆盖至模式空间中;
G:把保持空间中的内容追加至模式空间中;
x:把模式空间中的内容与保持空间中的内容互换;
n:覆盖读取匹配到的行的下一行(改变指向)至模式空间中;
N:追加读取匹配到的行的下一行(改变指向)至模式空间中;
d:删除模式空间中的行;
D:删除多行模式空间中的所有行;

3. 举例 sed -n 'n;p' FILE:显示偶数行; sed '1!G;h;$!d' FILE:逆序显示文件的内容; sed '$!d' FILE:取出最后一行; sed '\$!N;$!D' FILE:取出文件后两行; sed '/^$/d;G' FILE:删除原有的所有空白行,而后为所有的非空白行后添加一个空白行; sed 'n;d' FILE:显示奇数行; sed 'G' FILE:在原有的每行后方添加一个空白行;

举例:提取字符串

/bin/bash info="hellozimskyshenzhen" echo $info | sed 's/hello\(\w\+\)shenzhen/\1/g'

备注:

sed中不支持\d,如果要用数字用[0-9],但是支持\w。

sed中的()要转义,+要转义,<>大于小于号要转义。

举例:判断是否存在指定格式的字符串

#!/bin/bash # 判断输入是否为整数 if [ -n "$(echo $1 | sed -n '/^[0-9]\+$/p')" ] ; then echo 'yes' else echo 'no' fi 五、awk命令 5.1. awk概述

awk是发明该工具三个作者姓名的首字母简称,awk是一个报表生成器,主要用于格式化输出。格式化文本输出器。

5.2. 基本用法

1. 语法
gawk [option] 'program' FILE
其中program: PATTERN{ACTION STATEMENTS}
{动作指令}可以理解成为命令,最常用的是print、printf

2. awk读取文档过程
按照行来读取文档,根据输入分隔符切分成小部分(用內建变量来表示$0$1$2...),用ACTION STATEMENTS来处理。$0表示显示整行。

3. 选项option
-F:指名输入字段的分隔符;
-v:用来实现自定义变量var=value;

4. PATTERN(用于定界)
 空:表示处理文件的每一行
 /pattern/:使用正则匹配需要处理的行
 !/pattern/:上面取反
 关系表达式:结果为真假,结果为真的处理,假的不处理。非0非空字符串为真,其余为假。
 行定界:不支持直接给出数字的格式(1,2{...})。见举例。
 BEGIN/END模式:BEGIN{}表示仅在开始处理文件中的文本之前执行一次的程序,例如打印表头。END{}表示文本处理完成之后执行一次,例如汇总数据。

举例: awk -F: '$NF=="/bin/bash" {print $1, $NF}' /etc/passwd awk -F: '$NF!"/bash/$"{print $1,$NF}' passwd awk -F: '$3<1000 {print $1, $3}' /etc/passwd awk -F; '(NR>=2&&NR<=10){print $1}' /etc/passwd 行定界 awk -F: '{printf "%-15s %10s\n", $1, $2}' /etc/passwd

5. 变量

內建变量(在引用变量时不用加$)
FS:input field seperator:输入字段分隔符,默认空白字符。使用-v指定。
OFS:输出字段分隔符。使用-v指定。
RS:输入时的换行符
ORS:输出时的换行符
NF:number of field 每一行的字段数量。加上$NF表示最后一列
NR:number of record 文件的行数,打印出来是打印行号
FNR:多个文件中的行数分别计数
FILENAME:当前文件的文件名
ARGC:参数命令行中参数的个数
ARGV:返回数组,命令行中的每个参数
举例:awk 'BEGIN {print ARGV[0]}' /etc/fstab /etc/issue
在这里ARGV[0]是awk,固定为第0个参数。ARGV[1]是/etc/fstab,ARGV[2]是/etc/issue
举例:awk -v FS=':' '{print $1}' -v OFS=':' /etc/passwd 指名冒号作为输入的分隔符。同awk -F: ...

自定义变量
方法1:-v var=value (区分字符的大小写)
方法2:在program中定义

举例:awk -v test='hello' 'BEGIN {print test}'
awk 'BEGIN {test='hello' print test}'

6. 常用的ACTION命令

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/11665.html