正规表示法与文件格式化处理

正规表示法:

处理字符串的方法,以行为单位进行字符串的处理,通过一些特殊符号的帮助可以简单的实现搜寻、删除、取代等处理。可以分为基础正规表示法和延伸正规表示法。

注意,正规表示法和通配符是完全不一样的东西,通配符是bash接口的一个功能,但正规表示法是字符串处理的表示方式

要使用正规表示法必须要求被使用的工具支持正规表示法,常见的有grep,sed,vim等



grep [-nvAB] [--color=auto] '搜寻字符串' filename

-n:显示时添加行号

-v:反向选择,即选择没有所搜寻字符串的行

-A:后接数字,after,除了本行,后续的n行也列出

-B:后接数字,before,除了本行,前面的n行也列出

--color=auto:添加颜色显示(Ubuntu中已用alias默认添加该选项)

[]:无论[]中有几个字符串,都代表1个字符(例如搜寻 't[ae]st'是搜寻'tast'或'test')。在[]中可以用"-"表示范围,如[1-5]

^:在[]中表示反向选择,即不含有"^"后字符的内容;在[]外表示行首字符

$:表示行尾字符

.:代表只有一个任意字符

*:代表重复它之前的那一个字符任意次(常用.*表示任意个任意字符)

{}:限定重复次数,使用时需要用"\"跳脱(例:两个o:'o\{2\}';2-5个o:'o\{2,5\}';2个以上o:'o\{2,\}')

grep在数据中查找字符串时,是以“整行”为单位进行提取的

单引号内的是正规表示法的字符,可能需要跳脱




sed [-nefr] [动作]

-n:使用silent模式。一般sed的用法中,所有来自stdin的数据都会被列到屏幕上,但在silent模式下,只有被sed处理过的内容才会被列出

-e:直接在指令列模式上进行sed的动作编辑

-f:-f filename可以执行filename中的sed动作

-r:支持延伸正规表示法的语法(预设是基础正规表示法的语法)

-i:直接修改读取的档案,而不是由屏幕输出

动作说明:[n1,n2]function

n1,n2:可选参数,代表进行动作的次数。如在10到20之间进行,则【10,20[动作行为]】

function:

a:新增,后接字符串,字符串会出现在当前的下一行

c:取代,后接字符串,取代n1,n2之间的行

i:插入,后接字符串,字符串会出现在当前的上一行

p:打印,将某个选择的数据打出

s:取代

sed后面接的动作一定要用单引号''括起来,如果要接两个或以上的动作时每个动作前要加-e

例:

列出/etc/passwd的内容,删除第2行到最后一行:cat -n /etc/passwd | sed '2,$d'

列出/etc/passwd的内容,在第二行后添加"drink tea":cat -n /etc/passwd | sed '2a drink tea'(若想增加多行,则需要以反斜杠加回车进行跳脱,再输入新的一行)

列出/etc/passwd的内容,以"No these lines"取代2-5行:cat -n /etc/passwd | sed '2,5 c No these lines'

仅列出/etc/passwd的5-7行:cat -n /etc/passwd | sed -n '5,7p'


除了整行的处理模式之外,sed还可以用行为单位,进行部分数据的搜索取代功能:

sed 's/要被取代的字符串/新字符串/g'



延伸正规表示法:

可以通过群组功能"|"进行搜寻,如:egrep -v '^$|^.*#' test



printf '打印格式' 实际内容

格式:

\a:警告声音输出

\b:退格键

\f:清除屏幕

\n:输出新的一行

\r:即Enter

\t:水平[tab]

\v:垂直[tab]

\xNN:NN为两位的数字,可以转数字为字符

%ns:n是数字,s代表string,打印n位字符串

%ni:n是数字,i代表integer,打印n位整数

%N.nf:n与N均为数字,f代表float

例:printf '%s\t %i\t %i\t %i\n' `cat test` | grep -v 'Name'


awk:倾向于将一行分成若干个字段来处理(默认分隔符为空格或tab),适合小型数据处理

awk '条件1{动作1} 条件2{动作2} ...' filename

每个字段都有变量名($1,$2...)。特殊变量:

NF:每一行($0)拥有的字段总数

NR:目前awk所处理的数据是第几行

FS:目前的分隔字符,默认是空格或tab

awk后续的所有动作是以单引号括住的,如果要以print打印时,非变量的文字部分需要用双引号引出

所有的awk动作({}中的动作),如果需要多个指令辅助可利用";"间隔,或直接以Enter隔开每个指令

与bash shell不同,在awk中变量可以直接使用,不需要加$

例:last -n 5 | awk '{print $1 "\t" $3}':打印第一个和第三个字段

例:last -n 5 | awk '{print $1 "\t Lines: " NR "\t Columns: " NF}'

例:cat /etc/passwd | awk '{FS=":"} $3 < 10 {print $1 "\t" $3}'

/etc/passwd以“:”分隔,打印第三个字段小于10的行的第一个字段和第三个字段(第一行无法打出,因为读入第一行时分隔符仍为空格,定义的FS=":"从第二行开始生效)要从第一行开始生效:cat /etc/passwd | awk 'BEGIN {FS=":"} $3<10 {print $1 "\t" $3}'

例:cat test | awk 'NR==1'{print "%10s %10s %10s %10s %10s\n",$1,$2,$3,$4,"Total"} NR>=2{total=$2+$3+$4 print "%10s %10d %10d %10d %10d\n", $1,$2,$3,$4, total}'

第一行单独处理,并进行加法计算


diff:以行为单位对比两个档案间的差异(还可以对比不同目录下相同文件名的内容)

diff [-bBi] from-file to-file

-b:忽略一行中仅有多个空格的差异

-B:忽略空白行的差异

-i:忽略大小写的不同

from-file或to-file可以用"-"取代。对比结果:

4d3:左边第4行被删掉了(d),基准是右边第3行;6c5:左边第6行被取代(c),基准是右边第5行


cmp:以字节为单位对比两个档案

cpm [-s] file1 file2

-s:列出所有的不同点的字节(预设仅会输出第一个不同)


patch:用补丁档更新/还原档案

用diff制作补丁档:

diff -Naur pw pw_new > pw.patch

更新档案:patch -pN < patch_file

还原档案:patch -R -pN < patch_file

-p:后接数字,代表取消几层目录

-R:还原档案

例:更新pw:patch -p0 < pw.patch

例:还原pw:patch -R -p0 < pw.patch


pr:打印纯文本文档(页眉会增加档案时间、档案名和页码)


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值