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的核心。