sed和awk

1.sed:进行文本转换和流编辑操作,不具备类似cut的切割功能的,使用的是模式匹配处理的(操作的是一行行的流文本信息)。

对应的语法信息如下:

sed [OPTION]... {script-only-if-no-other-script} [input-file]...  // 脚本是必须要使用的。其中脚本对用的是sed中使用的命令的集合信息的。

常见的使用语法是

sed  {script-only-if-no-other-script} [input-file]...  // 脚本是必须要使用的。

常用选项如下:

-e:指定运行的脚本

-f:指定运行的脚本文件,不是普通的文件信息的

-i:指明原处编辑

-r:指定使用扩展的正则表达式

-s:进行文件分割操作

-z:指定行间间隔符号

下面是使用示例:

[root@mrzhang vsftpd]# sed -e 4\atestgood /etc/fstab    // 使用e直接执行脚本的内容

[root@mrzhang test]# sed -f sc /etc/fstab  //指定脚本文件执行,其中脚本文件sc的内容信息如下:

[root@mrzhang test]# cat sc

4agoodmoring   // 对应的命令信息为a,执行的追加的内容为goodmoring

[root@mrzhang test]# sed -i -f sc fstab   //-i执行原处编辑操作,实现原处扁你操作实现

[root@mrzhang test]# sed -r -e '=' fstab    // 显示行号信息

[root@mrzhang test]# sed 'a \ good' fstab    // 给每一行的前面追加good字符信息

[root@mrzhang test]# sed 'i \ testhello' fstab    // 给每一行的前面插入字符信息

[root@mrzhang test]# sed -e i\testhello fstab   // 也可以使用这样的,但是这样脚本中间就不能够使用空格信息了

[root@mrzhang test]# sed 'agooe' -r fstab    // 指定从对应的文本中读取数据,默认的都是这样的

[root@mrzhang test]# sed '4cmytest' fstab   // 替换第4行的内容为mytest

[root@mrzhang test]# sed -i '4d' fstab    // d对应的是删除模式空间中的内容信息

[root@mrzhang test]# sed 'l' -r fstab   // 会在每一行的后面增加$显示

[root@mrzhang test]# sed 's/dev/DEV/' fstab   // 执行文档内容的替换操作,结合i选项可以实现文档的原处编辑操作实现。

[root@mrzhang test]# sed '1,4w test' fstab   //将文件内容写入到指定的文件中

[root@mrzhang test]# sed 'y/dev/DEST/' fstab  //将查找到的内容实现替换操作,和s的作用差不多,要求替换的和原来的长度一样。

备注:sed的核心操作时从文档中过滤处想要的内容并进行转换的,和vim的不同指出在于sed时非交互式的,符合Linux尽量和用于少交互的哲学要求。sed使用的时候重点在于脚本文件的书写的

sed可以实现和文件结合实现操作的。参见上面使用示例sc文件的操作的。

2.awk的操作:模式搜索和处理语言,很强大,需要好好学习

使用用法信息如下:awk   [options]  'script' var=value file(s). 

或者是awk   [options]  -f scriptfile var=value file(s)

常用选项信息如下:

-f:指定从文件中获取awk的脚本

-F :只当输入分割符

-v  val=val:在awk程序执行之前给变量赋值操作

-e:指定awk的执行脚本

-E :指定执行的脚本文件,是脚本执行的最后进行

-o:awk输出美化

-p:指定输出文件信息

-r:使用加强版的正则表达式

awk的程序是由一些列的pattern-action语句以及可选的函数定义组成的。 

@include "filename" pattern { action statements }    // 使用pattern-action语句

 function name(parameter list) { statements }    // 函数

常见的awk的内置变量信息如下:

RS:记录分割符,默认为空行

FS:变量分割符,field可以使用$1,$2.....等进行替换操作,其中$0代表的是一整条记录,一个记录存在多个field。

NF:代表的是field的个数,其中给不存在field赋值的话,会导致NF变大

NR:目前位置总的输入的记录数

OFS:输出变量间隔符号

ORS:输出记录之间的间隔符号,默认为换行

PROCINFO:可以提供运行中的awk的参数信息

ARGC:命令行的参数信息

ARGIND:参数的索引

ARGV:参数对应的数组信息

FIELDWIDTHS:field之间分割的空格的个数限制

FILENAME:当前输入文件的名称信息

FNR:当前文件中的多少行

数据结构:

数组:使用[] .

if (val in array)  // 可以用于测试数组中是否含有对应的元素信息,可以用于遍历数组信息

(i, j) in array   // 使用下标判断 ,delete语句可以实现删除数组元素。

变量类型和转换

1.变量变为数字,采用加0的操作,变量变为字符串信息,加上一个空的字符串信息,推荐使用函数进行操作:strtod可以实现将字符串转化为数字,sprintf可以实现将数字装华为字符串信息的。

CONVFMT = "%2.2f"  // 定义转换格式

 a = 12  // 数字

 b = a ""   // 将数字转化为字符串信息

2. pattern-action 解析操作,awk对应的为线性语言,首先执行pattern,然后执行action。

action语句使用{}包裹。#进行注释操作,多行之间使用;进行操作管理实现。

下面是模式语句

BEGIN:在输入之前执行

END:输入执行完成之后

BEGINFILE:读取文件第一条记录之前

ENDFILE:类似的

/regular expression/: 匹配正则表达式的

relational expression: 关系表达式

pattern && pattern: 逻辑表达式

pattern || pattern : 逻辑表达式

pattern ? pattern : pattern  : 三目运算符

(pattern)  模式

! pattern: 模式取反

pattern1, pattern2 : 模式1,模式2 

其中pattern中存在一些常量:

\y:匹配单词开头或者结尾的字符串

\B:匹配单词内部的空的字符串

\s:匹配空格

\S:匹配非空格字符

\w:匹配字母数字下划线

\W:匹配字母,数字下划线以外的字符信息

actions的讲解:

    1)运算符

             ():分组

              $:变量引用

                ++ --:自增和自减

                space:字符串连接

        2)控制语句

              if (condition) statement [ else statement ]   // if-else语句

              while (condition) statement   // while语句

              do statement while (condition)    // do语句

              for (expr1; expr2; expr3) statement     // for循环

              for (var in array) statement      // for遍历数组

              break    

              continue

              delete array[index]

              delete array

              exit [ expression ]

              { statements }

              switch (expression) {

              case value|regex : statement

              [ default: statement ]

              }

    3)IO语句:

常见的io语句如下:

        print:打印当前记录

        print ... >> file:将输出追加到文件

        print ... | command: 输出使用管道

        printf语句,可以使用如下的格式控制信息展示

%c:作为单个字符进行替换

经常使用的字符串处理函数信息

gsub(r, s [, t]) :字符串t中使用正则表达式r,符合的话使用s字符串代替。

index(s, t) :返回t中字符串s的索引信息

length([s]):返回字符串s的长度

[root@mrzhang test]# awk '{print $3}' fstab    // 打印文件的第三行信息

awk ' FS= ":" { print $1 };{ sort }' /etc/passwd     // 打印和排序操作

[root@mrzhang test]# awk ' BEGIN { FS = ":" };{ print $1 | "sort" }' /etc/passwd    // 打印和排序操作

[root@mrzhang test]# awk ' { nlines++ }END { print nlines }' /etc/passwd   // 打印文件的行数信息

[root@mrzhang test]# awk ' { print FNR, $0 }' /etc/passwd   // 显示文件的行号和对应的内容,相当于给每一行增加行号信息

[root@mrzhang test]# awk '{ print NR, $0 }' /etc/passwd /etc/inittab   // 打印总的行数信息和内容

tail -f access_log | awk '/myhome.html/ { system("nmap " $1 ">> logdir/myhome.html") }'  // 实现日志过滤操作。

[root@mrzhang test]# awk -v hello=good '{ print $1hello}' good    // 使用变量替换操作

[root@mrzhang test]# awk -f scs good    // 执行脚本文件

其中脚本文件的内容信息如下;

[root@mrzhang test]# cat scs

{print $1,$4 }

其中脚本中可以书写多个命令,命令会按照从上到下的顺序执行

[root@mrzhang test]# awk -f scs good

[root@mrzhang test]# cat scs

{print $1,$4 }

{ print $0 }

其中awk的脚本的含义对应的是pattern-action的,对应的pattern-action可以只有一个pattern或者是只有一个action信息。但不能都没有的

awk使用的核心是pattern-action,这需要关注。类似于使用sed的脚本。

awk '{[pattern] action}' {filenames} 是awk的核心。

你可能感兴趣的:(sed和awk)