《Linux命令行与shell脚本编程大全》 第十八章 学习笔记

本文主要是介绍《Linux命令行与shell脚本编程大全》 第十八章 学习笔记,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

第一部分:Linux命令行
《Linux命令行与shell脚本编程大全》 第一章:初识Linux shell
《Linux命令行与shell脚本编程大全》 第二章:走进shell
《Linux命令行与shell脚本编程大全》 第三章:基本的bash shell命令
《Linux命令行与shell脚本编程大全》 第四章:更多的bash shell命令
《Linux命令行与shell脚本编程大全》 第五章:使用Linux环境变量
《Linux命令行与shell脚本编程大全》 第六章:理解Linux文件权限
《Linux命令行与shell脚本编程大全》 第七章:管理文件系统
《Linux命令行与shell脚本编程大全》 第八章:安装软件程序
《Linux命令行与shell脚本编程大全》 第九章:使用编辑器

第二部分:shell脚本编程基础
《Linux命令行与shell脚本编程大全》 第十章:构建基本脚本
《Linux命令行与shell脚本编程大全》 第十一章:使用结构化命令
《Linux命令行与shell脚本编程大全》 第十二章:更多的结构化命令
《Linux命令行与shell脚本编程大全》 第十三章:处理用户输入
《Linux命令行与shell脚本编程大全》 第十四章:呈现数据
《Linux命令行与shell脚本编程大全》 第十五章:控制脚本

第三部分:高级shell编程
《Linux命令行与shell脚本编程大全》 第十六章:创建函数
《Linux命令行与shell脚本编程大全》 第十七章:图形化桌面上的脚本编程
《Linux命令行与shell脚本编程大全》 第十八章:初识sed和gawk
《Linux命令行与shell脚本编程大全》 第十九章:正则表达式
《Linux命令行与shell脚本编程大全》 第二十章:sed进阶
《Linux命令行与shell脚本编程大全》 第二十一章:gawk进阶
《Linux命令行与shell脚本编程大全》 第二十二章:使用其他shell

第四部分:高级shell脚本编程主题
《Linux命令行与shell脚本编程大全》 第二十三章:使用数据库
《Linux命令行与shell脚本编程大全》 第二十四章:使用Web
《Linux命令行与shell脚本编程大全》 第二十五章:使用E-mail
《Linux命令行与shell脚本编程大全》 第二十六章:编写脚本实用工具
《Linux命令行与shell脚本编程大全》 第二十七章:shell脚本编程进阶


第十八章:初识sed和gawk

 

文本处理

sed编辑器

sed编辑器可以基于输入到命令行的或是存储在命令文本文件中的命令来处理数据流中的数据。

它每次读取一行,用提供的编辑器命令匹配数据、按命令中指定的方式修改流中的数据,然后将生成的数据输出到STDOUT。在流编辑器将所有命令与一行数据进行匹配后,它会读取下一行数据并重复这个过程。在流编辑器处理完流中的所有数据行后,它就会终止。
sed命令格式:

sed options script file

sed命令选项

选项描述
-e script在处理输入时,将script中指定的命令添加到运行的命令中
-f file 在处理输入时,将file中指定的命令添加到运行的命令中
-n不要为每个命令生成输出,等待print命令来输出

在命令行定义编辑器命令

默认情况下,sed会编辑器会将指定的命令应用到STDIN输入流上。

$ echo "This is a test" | sed 's/a/not a/'
This is not a test

在命令行使用多个编辑器命令

使用-e即可。

注意:多个命令都写在同一对引号之间,并用分号隔开。并且在命令末尾和分号之间不能有空格。

$ echo "This is a test" | sed -e 's/a/not a/;s/This/That/'
That is not a test

从文件中读取编辑器命令

$ cat sed_script 
s/brown/white/
s/fox/elephant/

使用-f选项即可。

$ echo "The quick brown fox jumps over the lazy dog." | sed -f sed_script 
The quick white elephant jumps over the lazy dog.

文件中的sed命令可以使用换行或分号隔开

gawk程序

在gawk编程语言中,可以做下面的事:

1.定义变量来保存数据

2.使用算数和字符串操作符来处理数据

3.使用结构化编程概念,比如if-then语句和循环

4.提取数据文件中的数据元素并将他们按另一顺序或格式重新放置。

gawk命令格式:

gawk option program file

gawk选项

选项描述
-F fs指定行中分隔数据字段的字段分隔符
-f file指定读取程序的文件名
-v var=value定义gawk程序中的一个变量以及默认值
-mf N指定要处理的数据文件中的最大字段数
-mr N指定数据文件中的最大数据行数
-W keyword指定gawk的兼容模式或警告等级

从命令行读取程序脚本

gawk程序用一对花括号来定义。

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

$ gawk '{print "Hello"}'

键入回车之后,并不会马上执行,等待你输入文本。gawk会对这行文本运行一遍所有的程序脚本

和sed一样,gawk程序会针对数据流中的每行文本执行一遍程序脚本。

使用数据字段变量

gawk会将如下变量分配给它在文本行中发现的每个数据字段:

$0表示整个文本行;$1表示文本行中第一个数据字段,依此类推

gawk中默认的字段分隔符是任意空白字符

$ echo "A B C
> D E F" | gawk '{print $1}'
A
D

使用-F选项指定分隔符

$ gawk -F : '{print $1}' /etc/passwd
root
daemon
bin
sys
……

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

同sed,多个命令使用分号隔开即可。

$ echo "I'm a person." | gawk '{$3="man.";print $0}'
I'm a man.

这里先将$3赋值,然后打印这句话。打印得结果是已经替换了$3之后的结果了。

从文件中读取程序

$ cat gawk_test
{
text="'s home directory is "
print $1 text $6
}

同样可以使用多个命令,可以用换行或分号分割命令

$ gawk -F: -f gawk_test /etc/passwd
root's home directory is /root
daemon's home directory is /usr/sbin
……

gawk在引用变量得时候,并不像shell那样,需要使用美元符

在处理数据前运行脚本

BEGIN关键字会在处理数据前,执行指定的脚本

$ gawk 'BEGIN { print "hello world"}'
hello world

在处理数据后运行脚本

当然是使用END关键字了

$ cat gawk_test
BEGIN {
print "Before read the file"
FS=":"
}{
print $1
}END {
print "The End"
}

注意:使用FS设置分割符

$ gawk -f gawk_test /etc/passwd
Before read the file
root
daemon
……
sshd
Debian-exim
The End


sed编辑器基础

更多的替换选项

替换标记

默认情况下,对匹配到的内容只会替换一次

$ echo "That is a test." | sed 's/ //'
Thatis a test.

如果想改变这种方式,需要使用替换标记

s/pattern/replacement/flags

有4种替换标记:

数字,表明将替换第几处模式匹配的地方

$ echo "That is a test." | sed 's/ //2'
That isa test.
$ echo "That is a test." | sed 's/ //6'
That is a test.

g,替换所有匹配到的文本

$ echo "That is a test." | sed 's/ //g'
Thatisatest.

p,表明原来行的地方要打印出来。通常与-n选项一起使用

上面已经说过,-n选项表示不输出,等待print命令来输出。

$ echo "That is a test." | sed -n 's/ //p'
Thatis a test.

w file,将替换的结果写到文件中

$ echo "That is a test." | sed -n 's/ //w out'
$ cat out
Thatis a test.

替换字符

如果我们想要替换文本中出现的文件路径,那么就需要转义符

$ pwd | sed 's/\/home/\/myhome/'
/myhome/su1216/android/source/linux_learned

或者,我们也可以把命令中的字符串分割符“/”给替换掉

$ pwd | sed 's@home@myhome@'
/myhome/suzhaoqiang/android/source/linux_learned

使用地址

默认情况下,sed会对所有行使用命令,如果只想将命令作用于特定某些行,需要使用行寻址(line addressing)

sed中有两种形式的行寻址:

1.行的数字范围

2.用文本模式来过滤出某行

两种形式都使用相同的格式来指定地址:

[address] command

也可以为特定地址将多个命令放在一起:

address {

    command1

    command2

    command3

}

数字方式的行寻址

$ cat test.txt
This is a test.
This is a test.
This is a test.
This is a test.
This is a test.
This is a test.
This is a test.$ sed '3,$s/This/That/' test.txt 
This is a test.
This is a test.
That is a test.
That is a test.
That is a test.
That is a test.
That is a test.

从第三行开始,到最后一行(最后一行用美元符号表示)进行替换

使用文本模式过滤器

格式如下:

/pattern/command

该命令只会作用到匹配文本模式的行上。sed在文本模式中采用正则表达式。

sed '/su1216/s!home!myhome!' /etc/passwd
root:x:0:0:root:/root:/bin/bash
……
su1216:x:1000:1000:su1216,,,:/myhome/su1216:/bin/bash
……

组合命令

需要对单行执行多条命令的话,可以使用花括号将多条命令组合在一起

$ sed '2{
s/This/That/
s/test/good test/
}' test.txt
This is a test.
That is a good test.
This is a test.
This is a test.

删除行(delete)

删除行的命令为d,如果不指定行号,那么就全部删除。

$ sed '2,4d' test.txt 
line 1
line 5
line 6

sed编辑器的模式匹配也适用于删除命令:

$ sed '/line 3/d' test.txt 
line 1
line 2
line 4
line 5
line 6

注意:sed不会修改原始文件。

可以用两个文本模式来删除某个范围内得行。

指定的第一个文本模式会打开行删除功能,第二个会关闭行删除功能。如果没有匹配到第二个,那么后面的文本将全部删除。

如果匹配到了第二个,那么sed还会继续尝试匹配第一个,继续尝试再次打开删除功能!

$ sed '/line 2/,/line 4/d' test.txt 
line 1
line 5
line 6

插入和附加文本

插入(insert)命令i会在指定行前加一个新行

追加(append)命令a会在指定行后加一个新行

格式如下:

sed '[address]command\

new line'

$ echo "Line" | sed 'i\Line 1'
Line 1
Line
$ echo "Line" | sed 'a\Line 1'
Line
Line 1

在数据流的最后添加新行

$ sed '$a\new line' test.txt 
line 1
line 2
line 3
line 4
line 5
line 6
new line

修改行(change)

和之前的使用完全一样

使用地址区间的时候需要注意,sed会把区间中的所有内容作为一个整体用新行替换

$ sed '2,4c\new line' test.txt 
line 1
new line
line 5
line 6

转换命令

转换(transform,y)命令是唯一可用处理单个字符的sed编辑器命令

格式如下:

[addressly/inchars/outchars/

转换命令会对inchars和outchars按顺序做一个一一映射。

如果inchars和outchars长度不同,sed则会产生错误信息

$ sed 'y/123/abc/' test.txt 
A:aabbaacc
B:44aa55bb

转换命令是全局的,他们将所有指定的字符都替换成目标字符。

回顾打印

用来打印数据流中的信息的命令:

1.p,用来打印文本行

2.等号(=)命令,用来打印行号

3.l(小写L)命令,用来列出行

打印行

和替换命令中的p标记类似,p命令可以打印sed编辑器输出中的一行

$ echo "hello" | sed 'p'
hello
hello
$ echo "hello" | sed -n 'p'
hello

也可以使用文本模式

$ cat test.txt 
A:11221133
B:44115522
line 3
line 4
line 5
$ sed -n '/line/p' test.txt 
line 3
line 4
line 5

可以与替换命令一起使用,下面是修改一行,并且打印出修改前的这一行

$ sed -n '/3/{p;s/line/Line/p}' test.txt 
A:11221133
line 3
Line 3

含有3的有两行,其中后面一行满足条件,然后被替换。

打印行号

$ sed '=' test.txt 
1
A:11221133
2
B:44115522
3
line 3
4
line 4
5
line 5

行号由换行符决定。

$ sed -n '/line/{=;p}' test.txt 
3
line 3
4
line 4
5
line 5

列出行

此命令允许打印数据流中的文本和不可打印的ASCII字符。

任何不可打印字符都用他们的八进制值前加一个反斜线或标准C风格的命名法。

$ sed -n 'l' test.txt 
A:11221133$
B:44115522$
line 3$
line 4$
line 5$

比如制表符用\t表示,行结束用$表示。

用sed和文件一起工作

向文件写入

格式如下:

[address]w filename

$ sed '1,2w sed_w_test' test.txt 
A:11221133
B:44115522
line 3
line 4
line 5
$ cat sed_w_test 
A:11221133
B:44115522

当然,我们可以改成下面的形式

$ sed -n '1,2w sed_w_test' test.txt 
$ cat sed_w_test 
A:11221133
B:44115522

从文件读取数据

格式如下:

[address]r filename

读取命令允许将一个独立文件中的数据插入到数据流中。

$ cat sed_w_test 
A:11221133
B:44115522
$ sed '4r sed_w_test' test.txt
A:11221133
B:44115522
line 3
line 4
A:11221133
B:44115522
line 5

如果想插到文件末尾,可以使用$


 

转贴请保留以下链接

本人blog地址

http://su1216.iteye.com/

http://blog.csdn.net/su1216/

这篇关于《Linux命令行与shell脚本编程大全》 第十八章 学习笔记的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/694475

相关文章

Java学习手册之Filter和Listener使用方法

《Java学习手册之Filter和Listener使用方法》:本文主要介绍Java学习手册之Filter和Listener使用方法的相关资料,Filter是一种拦截器,可以在请求到达Servl... 目录一、Filter(过滤器)1. Filter 的工作原理2. Filter 的配置与使用二、Listen

Python使用getopt处理命令行参数示例解析(最佳实践)

《Python使用getopt处理命令行参数示例解析(最佳实践)》getopt模块是Python标准库中一个简单但强大的命令行参数处理工具,它特别适合那些需要快速实现基本命令行参数解析的场景,或者需要... 目录为什么需要处理命令行参数?getopt模块基础实际应用示例与其他参数处理方式的比较常见问http

Linux命令之firewalld的用法

《Linux命令之firewalld的用法》:本文主要介绍Linux命令之firewalld的用法,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录linux命令之firewalld1、程序包2、启动firewalld3、配置文件4、firewalld规则定义的九大

Linux之计划任务和调度命令at/cron详解

《Linux之计划任务和调度命令at/cron详解》:本文主要介绍Linux之计划任务和调度命令at/cron的使用,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录linux计划任务和调度命令at/cron一、计划任务二、命令{at}介绍三、命令语法及功能 :at

Linux下如何使用C++获取硬件信息

《Linux下如何使用C++获取硬件信息》这篇文章主要为大家详细介绍了如何使用C++实现获取CPU,主板,磁盘,BIOS信息等硬件信息,文中的示例代码讲解详细,感兴趣的小伙伴可以了解下... 目录方法获取CPU信息:读取"/proc/cpuinfo"文件获取磁盘信息:读取"/proc/diskstats"文

Java使用ANTLR4对Lua脚本语法校验详解

《Java使用ANTLR4对Lua脚本语法校验详解》ANTLR是一个强大的解析器生成器,用于读取、处理、执行或翻译结构化文本或二进制文件,下面就跟随小编一起看看Java如何使用ANTLR4对Lua脚本... 目录什么是ANTLR?第一个例子ANTLR4 的工作流程Lua脚本语法校验准备一个Lua Gramm

Linux内核参数配置与验证详细指南

《Linux内核参数配置与验证详细指南》在Linux系统运维和性能优化中,内核参数(sysctl)的配置至关重要,本文主要来聊聊如何配置与验证这些Linux内核参数,希望对大家有一定的帮助... 目录1. 引言2. 内核参数的作用3. 如何设置内核参数3.1 临时设置(重启失效)3.2 永久设置(重启仍生效

kali linux 无法登录root的问题及解决方法

《kalilinux无法登录root的问题及解决方法》:本文主要介绍kalilinux无法登录root的问题及解决方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,... 目录kali linux 无法登录root1、问题描述1.1、本地登录root1.2、ssh远程登录root2、

shell编程之函数与数组的使用详解

《shell编程之函数与数组的使用详解》:本文主要介绍shell编程之函数与数组的使用,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录shell函数函数的用法俩个数求和系统资源监控并报警函数函数变量的作用范围函数的参数递归函数shell数组获取数组的长度读取某下的

SpringShell命令行之交互式Shell应用开发方式

《SpringShell命令行之交互式Shell应用开发方式》本文将深入探讨SpringShell的核心特性、实现方式及应用场景,帮助开发者掌握这一强大工具,具有很好的参考价值,希望对大家有所帮助,如... 目录引言一、Spring Shell概述二、创建命令类三、命令参数处理四、命令分组与帮助系统五、自定