shell高级脚本 ---sed高级编程

shell —sed高级编程

一、 xargs

find . -type d -link 2 | xargs -i mkdir -p {}/e  =》创建文件夹e

二、sed高级编程
sed: stream editor 流编辑器,一行一行的读取文本内容
1、例子

文件yourfile
aaa
123
123
123
123
eee

Command: sed -i '/aaa/{:a;n;s/123/xyz/g;/eee/!ba}' youfile
explain: 先匹配aaa, 匹配到后执行大括号里的语句
n: 读取下一行
s/123/xyz/g: 将123替换为xyz,全局替换,同一行中出现几次替换几次
:a -> 设定跳转标签a
/eee/!ba -> 若当前行匹配不上eee,则跳转到标签a处继续执行,构成一个循环。若匹配到eee,则退出循环,sed重新对读入的每行匹配aaa
由于sed没有加-n静默选项,所有默认对每行数据处理后都打印

2、 h\H\g\G\x!\n\N\p\P(大写)-e

h: 拷贝pattern space的内容到holding buffer 
H: 追加pattern space 的内容到holding buffer
g: 获取holding buffer 的内容,并替换pattern space
G: 获取holding buffer 的内容,并追加pattern space
!: 表示后面的命令对所有没有被选定的行发生作用
x: 互换pattern space和holding buffer中的文本
n:读取下一行文本到pattern space,并从下一条命令而不是第一条命令开始对其处理,并且p打印只针对新加入的行
N: 读取下一行文本到pattern space并将pattern space空间中的行当做一行处理,p打印针对所有的行
P: 打印pattern space中的第一行(大写)
p: 打印pattern space中的最后一行
-e:  允许多点编辑 如: sed -e '/test/h' -e '$G' file -> 读取file中的所有的行,一次读取一行,当读取的当前行匹配test时,将行替换holding模式空间内容(h),当读取到最后一行($)时,将holding空间中的内容追加到模式空间(G),并默认数据
-n: 使用安静模式,在一般sed的用法中,所有来自stdin的资料一般都会被列出到屏幕上,加-n后,则不会输出,除非用p命令

sed中的n\N参考
参考2
参考3
sed参考4

3、 例子

// file
aaa bbb
432
aaa
1234343
bbb
34534
Demand: 获取aaa和bbb之间的内容,并打印出来
Command2: sed -n '/aaa/{/bbb/ba;:c;N;/bbb/!bc;p;b;:a;p;}' file
explain: 读取文件file,若当前行命中aaa,且当前行命中bbb,则跳转到标签a处执行打印(不跨行);否则,读取下一行,并判断是否命中bbb,如果没有命中,则跳转到标签c处,并继续判断是否命中bbb,如果命中了,则打印,并跳转到结尾

参考

Shell脚本高级编程教程,希望对你有所帮助。 Example 10-23. Using continue N in an actual task: 1 # Albert Reiner gives an example of how to use "continue N": 2 # --------------------------------------------------------- 3 4 # Suppose I have a large number of jobs that need to be run, with 5 #+ any data that is to be treated in files of a given name pattern in a 6 #+ directory. There are several machines that access this directory, and 7 #+ I want to distribute the work over these different boxen. Then I 8 #+ usually nohup something like the following on every box: 9 10 while true 11 do 12 for n in .iso.* 13 do 14 [ "$n" = ".iso.opts" ] && continue 15 beta=${n#.iso.} 16 [ -r .Iso.$beta ] && continue 17 [ -r .lock.$beta ] && sleep 10 && continue 18 lockfile -r0 .lock.$beta || continue 19 echo -n "$beta: " `date` 20 run-isotherm $beta 21 date 22 ls -alF .Iso.$beta 23 [ -r .Iso.$beta ] && rm -f .lock.$beta 24 continue 2 25 done 26 break 27 done 28 29 # The details, in particular the sleep N, are particular to my 30 #+ application, but the general pattern is: 31 32 while true 33 do 34 for job in {pattern} 35 do 36 {job already done or running} && continue 37 {mark job as running, do job, mark job as done} 38 continue 2 39 done 40 break # Or something like `sleep 600' to avoid termination. 41 done 42 43 # This way the script will stop only when there are no more jobs to do 44 #+ (including jobs that were added during runtime). Through the use 45 #+ of appropriate lockfiles it can be run on several machines 46 #+ concurrently without duplication of calculations [which run a couple 47 #+ of hours in my case, so I really want to avoid this]. Also, as search 48 #+ always starts again from the beginning, one can encode priorities in 49 #+ the file names. Of course, one could also do this without `continue 2', 50 #+ but then one would have to actually check whether or not some job 51 #+ was done (so that we should immediately look for the next job) or not 52 #+ (in which case we terminate or sleep for a long time before checking 53 #+ for a new job).
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值