IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 系统运维 -> 9.1 shell文本处理 -> 正文阅读

[系统运维]9.1 shell文本处理

通常shell脚本最大的用途就在于解析和显示文本文件中的数据,比如日志文件和错误文件。

Linux环境包含了两个非常有用的工具:sed和gawk,两者都能够在shell脚本中处理文本数据。

1.sed编辑器

sed编辑器被称为流编辑器(stream editor),和普通的交互式文本编辑器恰好相反。

  • 在交互式文本编辑器中(如vim),可以用键盘命令来交互式地插入、删除或替换数据中的文本。
  • 流编辑器则会在编辑器处理数据之前基于预先提供的一组规则来编辑数据流。

sed编辑器可以根据命令来处理数据流中的数据,这些命令可以从命令行中输入,也可以存储在一个命令文本文件中。

sed编辑器会执行下列操作:

  1. 一次从输入中读取一行数据;
  2. 根据所提供的编辑器命令匹配数据;
  3. 按照命令修改流中的数据;
  4. 将新的数据输出到STDOUT;

在流编辑器将所有命令与一行数据匹配完毕后,它会读取下一行数据并重复这个过程。在流编辑器处理完流中的所有数据行后,它就会终止。

由于命令是按照顺序逐行给出的,sed编辑器只需对数据流进行一遍处理就可以完成编辑操作。这使得sed编辑器要比交互式编辑器快得多,可以快速完成对数据的自动修改。

sed命令格式如下:

sed options script file

options允许修改sed命令的行为,可使用的选项如下:

选项

描述

1

-e script

在处理输入时,将script中指定的命令添加到已有的命令中

2

-f file

在处理输入时,将file中指定的命令添加到已有的命令中

3

-n

不产生命令输出,使用print命令来完成输出

script参数指定了应用于流数据上的单个命令。

如果需要用多个命令,要么使用 -e 选项在命令行中指定,要么使用 -f 选项在单独的文件中指定。

1.1 在命令行定义编辑器命令

默认情况下sed编辑器会将指定的命令应用到STDIN输入流上。这样可以直接将数据通过管道输入sed编辑器处理。如:

echo "This is a test" | sed 's/test/big test/'

这个例子在sed编辑器中使用了s命令,s命令会用斜线间指定的第二个文本字符串来替换第一个文本字符串模式。在此例子中用big test替换了test。运行完命令时,结果便立即显示出来。

处理文件也几乎是相同的速度,如:

cat data1.txt

The quick brown fox jumps over the lazy dog.

The quick brown fox jumps over the lazy dog.

The quick brown fox jumps over the lazy dog.

The quick brown fox jumps over the lazy dog.

对文件使用sed命令替换dog字符串:

sed 's/dog/cat/' data1.txt

The quick brown fox jumps over the lazy cat.

The quick brown fox jumps over the lazy cat.

The quick brown fox jumps over the lazy cat.

The quick brown fox jumps over the lazy cat.

sed命令几乎瞬间就执行完并返回数据。在处理每行数据的同时,结果也显示了出来。

sed编辑器并不会修改文本文件的数据,而只是将修改后的数据发送到STDOUT。同时文本文件还保留着原始数据。

1.2 在命令行使用对个编辑器命令

要在sed命令行上执行多个命令时,只要用‘-e’选项即可:

sed -e 's/brown/green/; s/dog/cat/' data1.txt

两个命令都作用到文件中的每行数据上,命令之间必须用分号隔开,并且命令末尾和分号之间不能有空格。

1.3 从文件中读取编辑器命令

如果有大量要处理的sed命令,则将它们放进一个单独的文件中通常会更方便一些。可以在sed命令中用‘-f’选项来指定文件。

cat script1.sed

/brown/green/

/fox/elephant/

/dog/cat/

sed -f script1.sed sed data1.txt

在这种情况下,不用在每条命令后放一个分号。sed编辑器知道每行都是一条单独的命令。sed编辑器会从指定文件中读取命令,并将它们应用到数据文件中的每一行上。

说明:为了避免把sed编辑器脚本文件与bash shell脚本文件搞混,可以使用.sed作为sed脚本文件的扩展名。

2.gawk程序

gawk程序是Unix中的原始awk程序的GNU版本。gawk程序让流编辑迈上了一个新的台阶,它提供了一种编程语言而不只是编辑器命令。在gawk编辑语言中,可以做到下面的事情:

  • 定义变量来保存数据;
  • 使用算术和字符串操作符来处理数据;
  • 使用结构化编程概念来为数据处理增加处理逻辑;
  • 通过提取数据文件中的数据元素,将其重新排列或格式化,生成格式化报告;

注:在所有发行版中都没有默认安装gawk程序,需要自行手动安装。

gawk程序的报告生成能力通常用来从大文本文件中提取数据元素,并将它们格式化成可读的报告。

其中最完美的例子是格式化日志文件。在日志文件中找出错误行会很难,gawk程序可以从日志文件中过滤出需要的数据元素,然后再将其格式化,使得重要的数据更易于阅读。

2.1 gawk命令格式

gawk格式如下:

gawk options program file

gawk选项:

选项

描述

1

-F fs

指定行中划分数据字段的字段分隔符

2

-f file

从指定的文件中读取程序

3

-v var=value

定义gawk程序中的一个变量及其默认值

4

-mf N

指定要处理的数据文件中的最大字段数

5

-mr N

指定数据文件中的最大数据行数

6

-W keyword

指定gawk的兼容模式或警告等级

2.2 从命令行读取程序脚本

gawk程序脚本用一对花括号来定义,故必须将脚本命令放到两个花括号({ })中。

由于gawk命令行假定脚本是单个文本字符串,还必须将脚本放到单引号中。

如一个简单的gawk程序脚本:

gawk '{print "Hello World!"}'

这个程序脚本定义了一个命令:print命令。

2.3 使用数据字段变量

gawk会自动给一行中的每个数据元素分配一个变量,默认情况下它会将如下变量分配给它在文本行中发现的数据字段:

  • $0代表整个文本行;
  • $1代表文本行中的第1个数据字段;
  • $2代表文本行中的第2个数据字段;
  • $n代表文本行中的第n个数据字段;

在文本行中,每个数据字段都是通过字段分隔符划分的,gawk在读取一行文本时,会用预定义的字段分隔符划分每个数据字段。gawk中默认的字段分隔符是任意的空白字符(例如空格或制表符)。

例如用gawk程序读取文本文件,只显示第1个数据字段的值。

cat data2.txt

One line of test text.

Two lines of test text.

Three lines of test text.

gawk '{print $1}' data2.txt

One

Two

Three

2.4 在程序脚本中使用多个命令

要在命令行上的程序脚本中使用多条命令,只要在命令之间放个分号即可:

echo "My name is Rich" | gawk '{$4="Christine"; print $0}'

My name is Christine

第一条命令会给字段变量$4赋值,第二条命令打印整个数据字段。

2.5 从文件中读取命令

跟sed编辑器一样,gawk编辑器允许将程序存储到文件中,然后再在命令行中引用。

cat script2.gawk

{print $1 " 's home directory is " $6}

gawk -F:? -f script2.gawk /etc/passwd

可以在程序文件中指定多条命令,且只需要一条命令放一行即可,不需要用分号。

2.6 在处理数据前运行脚本

默认情况下gawk会从输入中读取一行文本,然后针对该行的数据执行程序脚本。有时可能需要在处理数据前运行脚本,比如为报告创建标题。BEGIN关键字会强制gawk在读取数据前指定BEGIN关键字后指定的程序脚本。

如:

gawk 'BEGIN {print "Hello World!"}'

2.7 在处理数据后运行脚本

与BEGIN关键字类似,END关键字允许你指定一个程序脚本,gawk会在读完数据后执行它。

当gawk程序执行完各种命令后,它会执行END脚本中的命令。这是在处理完所有正常数据后给报告添加页脚的最佳方法。

  系统运维 最新文章
配置小型公司网络WLAN基本业务(AC通过三层
如何在交付运维过程中建立风险底线意识,提
快速传输大文件,怎么通过网络传大文件给对
从游戏服务端角度分析移动同步(状态同步)
MySQL使用MyCat实现分库分表
如何用DWDM射频光纤技术实现200公里外的站点
国内顺畅下载k8s.gcr.io的镜像
自动化测试appium
ctfshow ssrf
Linux操作系统学习之实用指令(Centos7/8均
上一篇文章      下一篇文章      查看所有文章
加:2021-10-07 14:11:49  更:2021-10-07 14:12:28 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/15 18:26:48-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码