| |
|
开发:
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),和普通的交互式文本编辑器恰好相反。
sed编辑器可以根据命令来处理数据流中的数据,这些命令可以从命令行中输入,也可以存储在一个命令文本文件中。 sed编辑器会执行下列操作:
在流编辑器将所有命令与一行数据匹配完毕后,它会读取下一行数据并重复这个过程。在流编辑器处理完流中的所有数据行后,它就会终止。 由于命令是按照顺序逐行给出的,sed编辑器只需对数据流进行一遍处理就可以完成编辑操作。这使得sed编辑器要比交互式编辑器快得多,可以快速完成对数据的自动修改。 sed命令格式如下: sed options script file options允许修改sed命令的行为,可使用的选项如下:
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选项:
2.2 从命令行读取程序脚本gawk程序脚本用一对花括号来定义,故必须将脚本命令放到两个花括号({ })中。 由于gawk命令行假定脚本是单个文本字符串,还必须将脚本放到单引号中。 如一个简单的gawk程序脚本: gawk '{print "Hello World!"}' 这个程序脚本定义了一个命令:print命令。 2.3 使用数据字段变量gawk会自动给一行中的每个数据元素分配一个变量,默认情况下它会将如下变量分配给它在文本行中发现的数据字段:
在文本行中,每个数据字段都是通过字段分隔符划分的,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脚本中的命令。这是在处理完所有正常数据后给报告添加页脚的最佳方法。 |
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
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- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |