评论

收藏

[PHP] shell脚本中的sed与awk

开发技术 开发技术 发布于:2021-12-27 17:03 | 阅读数:685 | 评论:0

@[toc]

1.sed编辑器
1.什么是sed编辑器?
sed是一种流编辑器,流编辑器会在编辑器处理数据之前基于预先提供的—组规则来编辑数据流
2.sed编辑器作用
sed编辑器可以根据命令来处理数据流中的数据,这些命令要么从命令行中输入,要么存储在一个命令文本文件中
3.sed的工作流程
DSC0000.png

4.命令格式
DSC0001.png DSC0002.png

常用选项

  • -e 或--expression=: 表示用指定命令来处理输入的文本文件,只有一个操作命令时可省略,                                  一般在执行多个操作命令使用
  • -f 或--file=: 表示用指定的脚本文件来处理输入的文本文件
  • -h 或--help: 显示帮助
  • -n、--quiet 或 silent: 禁止sed编辑器输出,但可以与p命令一起使用完成输出
--i: 直接修改目标文本文件
常见操作

  • s: 替换,替换指定字符
  • d: 删除,删除选定的行
  • a: 增加,在当前行下面增加一行指定内容
  • i: 插入,在选定行上面插入一行指定内容
  • c: 替换,将选定行替换为指定内容
  • y: 字符转换,转换前后的字符长度必须相同
  • p: 打印,如果同时指定行,表示打印指定行;如果不指定行,则表示打印所有内容;如果有非打印字符,则以ASCII码输出。其通常与“-n”选项一起使用
    =: 打印行号
  • l (小写L): 打印数据流中的文本和不可打印的ASCII字符(比如结束符$、制表符\t)5.打印内容
    DSC0003.png

6.用文本模式来过滤出行
DSC0004.png

7.删除行
DSC0005.png

8.替换
行范围 s/旧字符串/新字符串/替换标记
4种替换标记:

· 数字: 表明新字符串将替换第几处匹配的地方
· g: 表明新字符串将会替换所有匹配的地方
· P: 打印与替换命令匹配的行,与-n一起使用
· w文件: 将替换的结果写到文件中

DSC0006.png
DSC0007.png
DSC0008.png DSC0009.png DSC00010.png DSC00011.png DSC00012.png DSC00013.png DSC00014.png DSC00015.png DSC00016.png DSC00017.png DSC00018.png DSC00019.png DSC00020.png DSC00021.png DSC00022.png


2.awk
1.工作原理
逐行读取文本,默认以空格或tab键为分隔符进行分隔,将分隔所得的各个字段保存到内建变量中,并按模式或者条件执行编辑命令。
sed命令常用于一整行的处理,而awk比较倾向于将一行分成多个“字段”然后再进行处理。awk信息的读入也是逐行读取的,执行结果可以通过print的功能将字段数据打印显示。在使用awk命令的过程中,可以使用逻辑操作符“&&”表示“与”、“||”表示“或”、“!”表示“非”;还可以进行简单的数学运算,如+、-、*、/、%、^分别表示加、减、乘、除、取余和乘方。
2.命令格式
awk 选项 ‘模式或条件 {操作} 文件 1 文件 2 …
awk -f 脚本文件 文件 1 文件 2 …

3.awk常见的内建变量(可直接用)
FS:列分割符。指定每行文本的字段分隔符,默认为空格或制表位。与"-F"作用相同
NF:当前处理的行的字段个数。
NR:当前处理的行的行号(序数)。
$0:当前处理的行的整行内容。
$n:当前处理行的第n个字段(第n列)。
FILENAME:被处理的文件名。
RS:行分隔符。awk从文件上读取资料时,将根据RS的定义把资料切割成许多条记录,而awk          一次仅读入一条记录,以进行处理。预设值是’\n’
4.按行输出文本
DSC00023.png

5.按字段输出文本
DSC00024.png

6.通过管道,双引号调用shall命令
DSC00025.png
DSC00026.png
DSC00027.png
DSC00028.png
DSC00029.png
DSC00030.png
DSC00031.png
DSC00032.png
通过管道、双引号调用 Shell 命令:
DSC00033.png DSC00034.png
DSC00035.png
DSC00036.png

date -d "$(awk -F "." '{print $1}' /proc/uptime) second ago" +"%F %H:%M:%S"       #显示上次系统重启时间,等同于uptime;second ago为显示多少秒前的时间,+"%F %H:%M:%S"等同于+"%Y-%m-%d %H:%M:%S"的时间格式
DSC00037.png
awk 'BEGIN {while ("w" | getline) n++ ; {print n-2}"%"}'  #调用w命令,并用来统计在线用户数
DSC00038.png
awk 'BEGIN {"hostname" | getline ; {print $0}}'           #调用 hostname,并输出当前的主机名
DSC00039.png
当getline左右无重定向符“<”或“|”时,getline作用于当前文件,读入当前文件的第一行给其后跟的变量var或$0;应该注意到,由于awk在处理getline之前已经读入了一行,所以getline得到的返回结果是隔行的。
当getline左右有重定向符“<”或“|”时,getline则作用于定向输入文件,由于该文件是刚打开,并没有被awk读入一行,只是getline读入,那么getline返回的是该文件的第一行,而不是隔行。

DSC00040.png


评论

使用道具 举报