Shell脚本学习指南之查找与替换介绍

本站所有内容来自互联网收集,仅供学习和交流,请勿用于商业用途。如有侵权、不妥之处,请第一时间联系我们删除!Q群:迪思分享

免费资源网 – https://freexyz.cn/

3.1 查找文本

grep:使用POSIX定义的基本正则表达式(BRE)。

egrep:使用扩展正则表达式(ERE)。

fgrep:快速grep。使用优化的算法,匹配固定字符串而非正则表达式。

1992 POSIX标准将这三个改版整合成一个grep程序。

$ who | grep -F austen

使用-F选项查找固定字符串。事实上,只要匹配的模式里未含有正则表达式的meta字符,

则grep默认行为模式就等同于使用了-F。

3.2.6 在文本文件里进行替换

一般来说,执行文本替换的正确程序应该是sed – 流编辑器。

sed s/:.*// /etc/passwd |     删除第一个冒号之后的所有东西

sort -u   排序列表并删除重复部分

任何可显示的字符都能作为定界符。

复制代码

代码如下:

sed s;/home/tolstoy/;/home/lt/;

sed s/\/&;bsol;/g

用-e和-f选项,不用将多个sed通过管道串起来,就可以一次替换多个。

复制代码

代码如下:

$ sed -e s/foo/bar/g -e s/chicken/cow/g file1.xml > file2.xml

$ cat fixup.sed

s/foo/bar/g

s/chicken/cow/g

$ sed -f fixup.sed file1.xml > file2.xml

3.2.8 sed的运作

命令行上的每个文件名会依次打开与读取。如果没有文件,则使用标准输入。

sed读取每个文件,一次读一行,将读取的行放到内存的一个区域(模式空间)。

所有编辑上的操作都会应用到模式空间的内容,当所有操作完成后,sed会将模式

空间的最后内容打印到标准输出,再回到开始处,读取另一个输入行。

3.3 字段处理

用空格(制表符)或特定的定界符(如冒号)。

#字符起始的行表示注释,软件必须可忽略这样的行才行。

以定界符分隔字段的最好例子就是/etc/passwd了:一行表示一个用户,每个字段以冒号隔开。

该文件含有7个字段:

tolstoy:x:2076:10:Leo Tolstoy:/home/tolstoy:/bin/bash

1.用户名称:2.加密后密码:3.用户ID:4.用户组ID:5.姓名:6.根目录:7.登录的Shell。

3.3.2 使用cut选定字段

复制代码

代码如下:

$ cut -d : -f 1,5 /etc/passwd

root:root

tolstoy:Leo Tolstoy

$ cut -d : -f 6 /etc/passwd

/root

/home/tolstoy

3.3.3 使用join连接字段

以一个共同的键值(主字段)将多个文件结合在一起。

$ cat sales

#业务员 数据量

joe     100

jane    200

herman 150

chris    300

$ cat quotas

#业务员 配额

joe     50

jane    75

herman 80

chris    95

复制代码

代码如下:

#! /bin/sh

# merge-sales.sh

# 删除注释并排序数据文件

sed /^#/d quotas | sort > quotas.sorted

sed /^#/d sales   | sort > sales.sorted

# 以第一个键值作结合

join quotas.sorted sales.sorted

# 删除缓存文件

rm quotas.sorted sales.sorted

3.3.4 使用awk重新编排字段

awk程序基本架构:pattern { action }

pattern通常是由斜杠括起来的ERE,action通常是一个明了的print语句。

省略pattern则会对每一条输入记录执行action,省略action则等同于{ print }。

awk自动将各个记录分为字段,并将每条记录内字段数目存储到内建变量NF。

默认以空白分隔,还可以将FS变量设置为一个不同的值。$加数字表示字段值。

awk { print $1 }               打印第1个字段

awk { print $2, $5 }          打印第2与第5个字段

awk { print $1, $NF }        打印第一个与最后一个字段

awk NF > 0 { print $0 }     打印非空行

awk NF > 0                     同上

awk -F : { print $1, $5 } /etc/passwd     设置字段分隔字符,-F选项自动设置FS变量。

root root

tolstoy Leo Tolstoy

记得在print的参数间用逗号隔开,否则awk将连接相邻的所有值。

awk -F: { print “User” $1 “is really” $5 } /etc/passwd

Userrootis reallyroot

Usertolstoyis reallyLeo Tolstoy
免费资源网 – https://freexyz.cn/


© 版权声明
THE END
★喜欢这篇文章吗?喜欢的话,麻烦动动手指支持一下!★
点赞10 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容