一.awk

1.什么是awk

awk 是一种程序语言. 它具有一般程序语言常见的功能。 
因awk语言具有某些特点, 如 : 使用直译器(Interpreter)不需先行编译; 变量无类型之分(Typeless), 可使用文字当数组的下标(Associative Array)...等特色. 因此, 使用awk撰写程序比起使用其它语言更简洁便利且节省时间. awk还具有一些内建功能, 使得awk善于处理具数据行(Record), 字段(Field)型态的资料; 此外, awk内建有pipe的功能, 可将处理中的数据传送给外部的 Shell命令加以处理, 再将Shell命令处理后的数据传回awk程序, 这个特点也使得awk程序很容易使用系统资源。

2.awk语法

SYNOPSIS  

awk [options] 'program' file file ...  
awk [options] 'PATTERN{action}' file file ...    

注:linux版本的awk为一个软链接,链接到gawk

Pattern:一般常使用 "关系表达式"(Relational expression) 来充当

Actions:是由许多awk指令构成 包含:print, printf

3.awk内建变量

变量名变量说明
$0整个一行
$1第一个字段
$2第二个字段
NF字段数
NR行数,所有文件的一并计数
FNR行数,各文件分别计数
ARGV数组,保存命令本身这个字符
ARGC保存awk命令中参数的个数
FILENAME正在处理的当前文件的名称


自定义变量:

-v VAR_NAME=VALUE

变量名区分字符大小写;

(1) 可以program中定义变量;  
(2) 可以命令行中通过-v选项自定义变量;

4.printf

命令的使用格式:printf format, item1, item2,...

(1) 要指定format;  
(2) 不会自动换行;如需换行则需要给出\n    
(3) format用于为后面的每个item指定其输出格式;

format格式的指示符都%开头,后跟一个字符:  
%c: 显示字符的ASCII码;    
%d, %i: 十进制整数;    
%e, %E: 科学计数法显示数值;    
%f: 显示浮点数;    
%g, %G: 以科学计数法格式或浮点数格式显示数值;    
%s: 显示字符串;

%u: 显示无符号整数;  
%%: 显示%自身;

修饰符:  
#:显示宽度    
-:左对齐    
+:显示数值的符号    
.#: 取值精度

p_w_picpath    

5.awk输出重定向

将awk输出的结果直接写入文件

print items > output-file  
print items >> output-file

例  
p_w_picpath

 

6.模式

(1) Regexp: 格式为/PATTERN/  
仅处理被/PATTERN/匹配到的行;    
(2) Expression: 表达式,其结果为非0或非空字符串时满足条件;    
仅处理满足条件的行;    
(3) Ranges: 行范围,此前地址定界,    
NR    
仅处理范围内的行    
(4) BEGIN/END: 特殊模式,仅在awk命令的program运行之前(BEGIN)或运行之后(END)执行一次;    
(5) Empty:空模式,匹配任意行;

p_w_picpath

p_w_picpath

7.

action

(1) Expressions  
(2) Control statements    
(3) Compound statements    
(4) input statements    
(5) output statements

8.控制语句

if—else

格式:if (condition) {then body} else {else body}

p_w_picpath

while  
            格式:while (condition) {while body}

p_w_picpath

注:没有设置结束条件容易产生死循环

do-while循环  
            格式:do {do-while body} while (condition)

for循环  
            格式:for (variable assignment; condition; iteration process) {for body}

p_w_picpath

case语句  
            语法:switch (expression) {case VALUE or /RGEEXP/: statement1;... default: stementN}

 

二.sed

1.sed简介

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

2.sed语法

sed [options] 'command' file(s)  
sed [options] -f scriptfile file(s) 

3. 元字符集

^:锚定行的开始 如:/^sed/匹配所有以sed开头的行。   
$:锚定行的结束 如:/sed$/匹配所有以sed结尾的行。   
.:匹配一个非换行符的字符 如:/s.d/匹配s后接一个任意字符,然后是d。   
*:匹配零或多个字符 如:/*sed/匹配所有模板是一个或多个空格后紧跟sed的行。 
[]:匹配一个指定范围内的字符,如/[Ss]ed/匹配sed和Sed。 
[^]:匹配一个不在指定范围内的字符,如:/[^A-RT-Z]ed/匹配不包含A-R和T-Z的一个字母开头,紧跟ed的行。 
\(..\):保存匹配的字符,如s/\(love\)able/\1rs,loveable被替换成lovers。 
&:保存搜索字符用来替换其他字符,如s/love/**&**/,love这成**love**。   
\< :锚定单词的开始,如:/\<love/匹配包含以love开头的单词的行。   
\>  :锚定单词的结束,如/love\>/匹配包含以love结尾的单词的行。   
x\{m\} :重复字符x,m次,如:/0\{5\}/匹配包含5个o的行。   
x\{m,\} :重复字符x,至少m次,如:/o\{5,\}/匹配至少有5个o的行。   
x\{m,n\} :重复字符x,至少m次,不多于n次,如:/o\{5,10\}/匹配5--10个o的行。 

4.vim编辑中文本的查找替换:

地址定界s/要查找的内容/替换为的内容/  
要查找的内容:可使用正则表达式    
替换为的内容:不支持正则表达式,但支持引用前面正则表达式分组中的内容    
地址定界:%, startline,endline

5.sed工作机制

每次读取一行文本至“模式空间(pattern space)”中,在模式空间中完成处理;将处理结果输出至标准输出设备;

-r: 支持扩展正则表达式;  
-n: 静默模式;    
-e script1 -e script2 -e script3:指定多脚本运行;    
-f /path/to/script_file:从指定的文件中读取脚本并运行;    
-i: 直接修改源文件;

6.sed编辑命令

d 删除

s 替换 %为全部文件

i 插入,直接编辑文件

a 附加

7.练习

(1) 删除/boot/grub/grub.conf文件中所有行的行首的空白字符;

p_w_picpath    
(2) 删除/etc/fstab文件中所有以#开头,后跟至少一个空白字符的行的行首的#和空白字符;

p_w_picpath    
(3) 把/etc/fstab文件的奇数行另存为/tmp/fstab.3;

p_w_picpath    
(4) echo一个文件路径给sed命令,取出其基名;进一步地,取出其路径名;

p_w_picpath

p_w_picpath