linux编写定时任务

linux中定时任务用来执行一些周期性的自动化的任务,比如有些人可能用来定期备份,也可能是定期检查一下特殊文件的签名,如果不一致,就报警,检测入侵。 cron是linux下的定时执行工具 这个工具的几个命令是这样的 /sbin/service crond start //启动服务 /sbin/service crond stop //关闭服务 /sbin/service crond restart //重启服务 /sbin/service crond reload //重新载入配置 注意,这几个服务都是要以root权限才能运行的,很多时候,只要我们可能只是一个低权限的用户,那么我们要执行一些定时任务的时候,可以这样做 直接通过这个命令来编辑,无需root用户 crontab 首先添加定时任务 crontab -e 打开之后按如下的格式编写 */1 * * * * ls >> /tmp/ls.txt 从左到右一次表示 分钟 一小时的第几分 0-59 小时 一天的第几小时 0-23 日期 一个月的的第几天 1-31 月份 一年的第几个月 1-12 周几 一周的第几天 0-6 /1表示每一天 /2表示每两天,直接*的话就表示每天/每小时这样 写完之后,wq保存退出 然后 crontab -l //列出当前的所有调度任务 可以看到自己的定时任务了,然后就不要做什么操作了,操作系统定时会读取配置的,编辑完成之后,我们的定时任务过一会就会生效了。 有时候,可能还要把结果信息和一些错误信息也写入 30 5 * * * ls >>/result/test 2>&1 注:2>&1 表示执行结果及错误信息。 这里就是说明天的5点50执行一次ls命令,并把结果追加到文件 如果我想每天5点30和17点30都执行一次呢,使用逗号隔开就行了 30 5,17 * * * ls >>/result/test 2>&1 如果是某个时间段呢 30 5-17 * * * ls >>/result/test 2>&1 这样5-17点钟的每个30分到会执行 如果是一些特殊的时间点,那么有更简单的方法,比如每月0点或者每天0点执行一次 @monthly ls >>/result/test 2>&1 @daily ls >>/result/test 2>&1 使用如上的关键字

2014-03-29 · 1 min · bystander

Unix sed实用教程系列目录

本系列文章已经译完了,译自awk-sed@theunixschool,收获颇丰,作者没有将明白的我做了补充,并且尝试讲的更清楚,整理成系列索引,方便学习,开篇非译文,是我为了方便后面的理解写的一篇,感谢原作者的分享.有任何问题欢迎留言讨论. Unix sed实用教程开篇 [译]Unix sed实用教程第一篇–向文件中增加一行 [译]Unix sed实用教程第二篇–替换文件内容 [译]Unix sed实用教程第三篇–读写文件 [译]Unix sed实用教程第四篇–选择性打印 [译]Unix sed实用教程第五篇–替换文件内容续 [译]Unix sed实用教程第六篇–删除文件内容 [译]Unix sed实用教程第七篇–输出文件内容(10 Demo) [译]Unix sed实用教程第八篇–CSV文件操作

2013-08-11 · 1 min · bystander

[译]Unix sed实用教程第八篇–CSV文件操作

本文作为sed使用教程的最后一篇,将比较全面的讲解如何操作csv文件,csv文件通过逗号分隔 示例文件如下: cat file Solaris,25,11 Ubuntu,31,2 Fedora,21,3 LinuxMint,45,4 RedHat,12,5 1.删除第一列 $ sed 's/[^,]*,//' file 25,11 31,2 21,3 45,4 12,5 s开启替换模式,当^符号在中括号里的时候,就是非的意思,也就是说[^,]匹配了所有不是逗号的一个字符,然后后面的星号表示0个或多个,然后是一个逗号,也就是匹配"xxxx,“替换为空 2.删除除过最后一列的其他所有 $ sed 's/.*,//' file 11 2 3 4 5 sed先匹配任意多个字符,然后匹配最后一个“,”这就直接把前面的都匹配完了。替换为空即可。 3.输出第一列 $ sed 's/,.*//' file Solaris Ubuntu Fedora LinuxMint RedHat 好理解把,先匹配第一列之后的逗号,然后是多个字符,然后替换为空 4.删除第二列 $ sed 's/,[^,]*,/,/' file Solaris,11 Ubuntu,2 Fedora,3 LinuxMint,4 RedHat,5 先匹配第一列之后的逗号,然后匹配一个或多个非逗号字符,这样就匹配了第二列的内容,然后再匹配一个逗号,我简化一下,比如该列是1,2,3,4,那么这一个匹配就是”,2,",替换成一个逗号,就是1,3,4了 5.输出第二列 $ sed 's/[^,]*,\([^,]*\).*/\1/' file 25 31 21 45 12 我们可以分析前两个斜线之间的内容 [^,]*,\([^,]*\).* 两个右斜线转移了括号,所以括号不是简单的符号,而是正则里的组的意义,圆括号的作用是对字符进行分组,并保存匹配的文本。这里先匹配非逗号的多个字符,然后一个逗号,然后再匹配第二列,并且第二列的匹配用括号括起来,然后匹配其他列,然后里面用\1来引用这个括号的内容,如果前面有两个括号,就可以使用\1或\2这样,分别表示第一个括号或第二个括号的匹配 6.输出最后一列是一位数字的行 $ sed -n '/.*,[0-9]$/p' file Ubuntu,31,2 Fedora,21,3 LinuxMint,45,4 RedHat,12,5 .*匹配了前面的所有字符,然后,匹配了最后一个逗号,sed的贪婪原则。。然后[0-9]匹配一个数字$表示行尾.ok 7.给每一行自动添加行号 $ sed = file | sed 'N;s/\n/ /' 1 Solaris,25,11 2 Ubuntu,31,2 3 Fedora,21,3 4 LinuxMint,45,4 5 RedHat,12,5 这个和cat -n file的效果是一样的。awk也可以很简单的做,这里使用一个=命令会在每一行之前添加一个行号,也就是是,如果执行 sed = file 文件会是: 1 Solaris,25,11 2 Ubuntu,31,2 3 Fedora,21,3 4 LinuxMint,45,4 5 RedHat,12,5 然后我们通过管道再执行 sed 'N;s/\n/ /' N表示读入并合并下一行,然后将两行之间的换行符替换为空即可了 8.如果第一列是Ubuntu,就把最后一列替换成99 $ sed 's/\(Ubuntu\)\(,.*,\).*/\1\299/' file Solaris,25,11 Ubuntu,31,99 Fedora,21,3 LinuxMint,45,4 RedHat,12,5 中间的 \(Ubuntu\)\(,.*,\).* 匹配“Ubuntu,任意个字符,任意个字符”,也就是将行分成几组,将本行替换成第一组的内容第一组的内容,第二组的内容,但最后的一列被替换成99,就这样。 9.如果第一列是RedHat就删除第二列 ...

2013-08-11 · 1 min · bystander

[译]Unix sed实用教程第七篇–输出文件内容(10 Demo)

之前已经学习过选择性打印输出了,本文将通过10个例子全面讲解文件输出的一些方法,主打p命令 首先看一下将使用的示例文件 $ cat file AIX Solaris Unix Linux HPUX 1.打印文件首行 $ sed -n '1p' file AIX 之前讲过了,-n取消默认的全部打印,p表示print,1就是行号了 2.输出最后一行 $ sed -n '$p' file HPUX 3.输出不匹配X的那些行 $ sed -n '/X/!p' file Solaris Unix Linux 也好理解,!表示非,就是说包含X匹配的不打印输出 4.输出包含u/x的那些行 $ sed -n '/[ux]/p' file Unix Linux 正则是强大的,这样就匹配了u/x 5.输出以x/X结尾的那些行 $ sed -n '/[xX]$/p' file AIX Unix Linux HPUX 这里$符号不再是匹配文件尾部,而是行尾,这是正则的规则 6.输出以A/L开头的行 $ sed -n '/^A\|^L/p' file AIX Linux 前面也说过,^匹配了行首,A表示A匹配,然而|则是或者的意思,为什么要加\转义,是为了避免被解析成pipe管道,后面的就不解释了 7.隔行打印 n命令是输出当前行,然后读入下一行到pattern space的意思,这句命令是这么执行的,首先读入一行,然后通过n命令输出,然后通过n命令再读一行,然后把这行删除,就出现了隔行输出的效果 8.如何两行输出,隔两行再输出 $ sed 'n;n;N;d' file AIX Solaris HPUX n;n; 命令呢输出了前两行,然后读入第三行到pattern space,N命令则对如下一行并与第三行合并,然后d命令删除pattern space中的内容,于是三四行被清空,然后读入56行,继续重复。就这样。作者这里给出的例子不直观,我举个例子,我的文件内容是 $ cat test.txt 1 2 3 4 5 6 7 8 9 执行上面的命令后,会输出 1 2 5 6 9 明白了吧 9.输出某个范围行内以X结果的那些行 $ sed -n '/Unix/,${/X$/p;}' file HPUX 这里首先制定了从/Unix/匹配开始到文件尾部的这些行,然后呢,在这些之间的行,如果以X结果,就输出。 10.输出不包括开始和结尾的那些行 $ sed -n '/Solaris/,/HPUX/{//!p;}' file Unix Linux 这个命令就会只输出/Solaris/和/HPUX/之间的行,不包括他们两个。 这里要说一下//这个,当匹配了Solaris的时候就进入了花括号,因为这个里面没有提供任何匹配,所以就考虑最后一次匹配模式,也就是相当于是考虑Solaris这一行,他不被打印,当到了HPUX这一匹配,//又代表了HPUX匹配,这一行也不打印。 Demo完了,你懂了么。

2013-08-11 · 1 min · bystander

[译]Unix sed实用教程第六篇–删除文件内容

其实,删除和替换是由一些相同的,不过,这里我们单独列出来,通过25个例子穿插讲解sed删除文件的一些方法,使用的示例文件如下: $ cat file Cygwin Unix Linux Solaris AIX 1.删除第一行 $ sed '1d' file Unix Linux Solaris AIX d就是删除,1就是指第1行,记得哦,这不会影响到源文件,一般,做删除的时候一般要加-i参数,前面说过了 sed -i '1d' file 2.删除指定行,这里删除第3行 $ sed '3d' file Cygwin Unix Solaris AIX 3.删除最后一行 $ sed '$d' file Cygwin Unix Linux Solaris 4.删除范围行,这里删除2-4行 $ sed '2,4d' file Cygwin AIX 5.保留指定的行,这里保留2-4行 $ sed '2,4!d' file Unix Linux Solaris !这个是对前面的2,4来操作,是非的意思,也就是不是2-4行的行,这样除去2-4行,其他的都删除了 6.删除第一行和最后一行 $ sed '1d;$d' file Unix Linux Solaris 分号隔开两个命令,你懂的,也可以删除第二行和第三行等等. ‘2d;3d’ 7.删除以指定字符开头的行 $ sed '/^L/d' file Cygwin Unix Solaris AIX 这里就把以L开头的Linux这一行删除了 8.删除以指定字符结尾的行 $ sed '/x$/d' file Cygwin Solaris AIX 这里就删除了,可以看到AIX没有删除,unix区分大小写你懂的 9.忽略大小写,都删除 $ sed '/[xX]$/d' file Cygwin Solaris [xX]匹配x或X,所以就成功了嘛 10.删除文件中的空行 $ sed '/^$/d' file Cygwin Unix Linux Solaris AIX ^匹配开头,$匹配结果,中间啥都没有,这样就匹配了空行,但是注意哦,如果某一行全是空格,这个命令是不会删除这一行的。 11.删除空行或是仅仅包含空格的行 $ sed '/^ *$/d' file Cygwin Unix Linux Solaris AIX 如果你看我前面的文章,这个就不用我说了吧,0个或多个空格就是匹配了所有的空行了 12.删除完全是大写字母的行 $ sed '/^[A-Z]*$/d' file Cygwin Unix Linux Solaris [A-Z]就匹配了26个大写字母的任意一个 13.删除包含Unix匹配的行 ...

2013-08-10 · 2 min · bystander

[译]Unix sed实用教程第五篇–替换文件内容续

前面已经学习过替换文件内容了,本文我们学习一些更频繁使用的搜索替换操作. 示例文件使用: $ cat file RE01:EMP1:25:2500 RE02:EMP2:26:2650 RE03:EMP3:24:3500 RE04:EMP4:27:2900 1.替换每行开始的两个字母,这里用XX来替换 $ sed 's/^../XX/' file XX01:EMP1:25:2500 XX02:EMP2:26:2650 XX03:EMP3:24:3500 XX04:EMP4:27:2900 s代表substitute,前面说过了,^用来匹配行开头,.表示任意一个字符,两个..就是你懂的, 其实,不要^符号也是可以的,因为默认就是从开头开始匹配,如下也可以实现 sed 's/../XX/' file 2.删除每行开头的两个字符 $ sed 's/^..//' file 01:EMP1:25:2500 02:EMP2:26:2650 03:EMP3:24:3500 04:EMP4:27:2900 看到没有,后两个斜线之间没有内容,也就是用空字符来替换开头的两个字符,就实现了删除 3.要是想删除每行最后的两个字符呢 $ sed 's/..$//' file RE01:EMP1:25:25 RE02:EMP2:26:26 RE03:EMP3:24:35 RE04:EMP4:27:29 再次强调,$在不同的情况下表示不同的意思,这里匹配行尾,有时候也匹配文件尾部 4.向每行末尾添加内容 $ sed 's/$/.Rs/' file RE01:EMP1:25:2500.Rs RE02:EMP2:26:2650.Rs RE03:EMP3:24:3500.Rs RE04:EMP4:27:2900.Rs 这里,先匹配行尾,然后把".Rs"添加到行尾 5.在每行开头添加空格 $ sed 's/^/ /' file RE01:EMP1:25:Rs.2500 RE02:EMP2:26:Rs.2650 RE03:EMP3:24:Rs.3500 RE04:EMP4:27:Rs.2900 还记得前面说过的么,sed默认不影响原始文件,要是想更新原始文件,请加-i参数 $ sed -i 's/^/ /' file $ cat file RE01:EMP1:25:Rs.2500 RE02:EMP2:26:Rs.2650 RE03:EMP3:24:Rs.3500 RE04:EMP4:27:Rs.2900 6.移除开始的空格 $ sed 's/^ *//' file RE01:EMP1:25:2500 RE02:EMP2:26:2650 RE03:EMP3:24:3500 RE04:EMP4:27:2900 ^匹配行首,然后是一个空格,然后是*,表示一个或多个空格嘛,然后替换为空字符 7.移除行首和行尾的空格 $ sed 's/^ *//; s/ *$//' file RE01:EMP1:25:2500 RE02:EMP2:26:2650 RE03:EMP3:24:3500 RE04:EMP4:27:2900 不要怕,从分号处分开,就是两条命令啦,一个做行首的,一个做行尾的,前面说过的,可以使用-e参数来分开 sed -e 's/^ *//' -e 's/ *$//' file 8.如何在一个字符串前后添加一些其他字符呢,可以用来字符串转义 $ sed 's/.*/"&"/' file "RE01:EMP1:25:Rs.2500" "RE02:EMP2:26:Rs.2650" "RE03:EMP3:24:Rs.3500" "RE04:EMP4:27:Rs.2900" 前两个斜线匹配了所有字符,也就是本行,然后后面两个斜线是替换的内容,注意里面的&符号,之前也说过的,表示匹配到的字符,也就是本行了。所有就这样啦 9.移除行首和行尾的一个字符(多个你也会的啦) $ sed 's/^.//;s/.$//' file RE01:EMP1:25:2500 RE02:EMP2:26:2650 RE03:EMP3:24:3500 RE04:EMP4:27:2900 分开看看,你可以的 10.删除第一个数字之前的所有字符 ...

2013-08-10 · 1 min · bystander

[译]Unix sed实用教程第四篇–选择性打印

本文,我们将会学习如何选择性的打印(其实,这里的打印是print,也就是输出到标准输出的意思),用到的示例文件是: $ cat file Gmail 10 Yahoo 20 Redif 18 1.打印所有内容 $ sed '' file Gmail 10 Yahoo 20 Redif 18 一对单引号,没有任何参数即可 2.如何打印包含Gmail的那一行.(grep也可以实现这个功能) $ sed '/Gmail/p' file Gmail 10 Gmail 10 Yahoo 20 Redif 18 在斜线里面,我们指定正则匹配模式,p的意思呢,就是print,打印的意思,也就是打印包含Gmail这一行,但是我们看到Gmail打印了两次,为什么,因为sed的默认行为是在解析完一行之后就把他输出出来,也就是对于Gmail这一行,先执行p解析,解析完成后再默认打印一次,就打印了两次,而其他的,没有命令解析,直接读入完成后输出即可。 如果得到期望的结果呢? $ sed -n '/Gmail/p' file Gmail 10 -n参数会取消sed的默认打印行为,所以就ok了 3.删除包含Gmail的那一行。(grep -v也有同样的效果) $ sed '/Gmail/d' file Yahoo 20 Redif 18 d就是delete的意思,不多解释, 同样,要想删除某一指定的行 $ sed '1d' file Yahoo 20 Redif 18 4.打印直到模式匹配,这里我们从头一直打印到Yahoo $ sed '/Yahoo/q' file Gmail 10 Yahoo 20 q就是quit的意思,这条命令就是对于前面的行都没啥可解析的,执行默认的打印即可,一到碰到Yahoo这一行,打印完成,就停止,退出,因此,就是上面的了 打印某一指定范围行 到此,我们一直在学习基于一个条件取一行或多行,现在,我们来学习打印指定范围行 使用的示例文件如下: $ cat file Gmail 10 Yahoo 20 Redif 18 Inbox 15 Live 23 Hotml 09 5.打印前三行 $ sed -n '1,3p' file Gmail 10 Yahoo 20 Redif 18 -n先取消默认打印,然后1,3指定行范围,p表示打印,你想一下我们前面的q命令,就知道下面这个命令效果是一样的 $ sed '3q' file Gmail 10 Yahoo 20 Redif 18 执行默认打印,到第三行的时候退出 6.通过模式指定范围,这里我打印从Yahoo到Live之间的行,包括本身 $ sed -n '/Yahoo/,/Live/p' file Yahoo 20 Redif 18 Inbox 15 Live 23 不用多解释了 7.从指定模式到文件尾部,这里是从Redif到文件尾 ...

2013-08-10 · 1 min · bystander

[译]Unix sed实用教程第三篇–读写文件

本文将展示如何将文件内容读入到sed输出,同时包含如何将一个文件的部分内容写入到另一文件 一.文件读取 假定有两个文件,file1和file2,内容分别如下: $ cat file1 1apple 1banana 1mango $ cat file2 2orange 2strawberry sed有两个选项用来读写文件 r filename : 读取filename指定的文件内容 w filename : 将内容写入filename指定的文件 看例子: 1.在file1的每一行读完之后读取file2的内容 $ sed 'r file2' file1 1apple 2orange 2strawberry 1banana 2orange 2strawberry 1mango 2orange 2strawberry r file2读取file2的所有内容,因此r之前没有知道那个行号或匹配,因此有了上面的输出,记住,sed的工作机制,每次读file1的一行,然后执行命令 2.如何在读取了file1的第一行之后将file2读入 $ sed '1r file2' file1 1apple 2orange 2strawberry 1banana 1mango r前面加个1就行了 3.当file1某行匹配了模式之后,读入file2 $ sed '/banana/r file2' file1 1apple 1banana 2orange 2strawberry 1mango sed逐行读入file1,然后判断该行是否匹配banana,如果匹配,就读入file2 4.当file1读取完成后读入file2,其实就是合并两个文件 $ sed '$r file2' file1 1apple 1banana 1mango 2orange 2strawberry 这里只是演示一下,其实cat file1 file2就可以完成合并 二.文件写入 使用一个file1文件,内容如下: $ cat file1 apple banana mango orange strawberry 1.将file1的2-4行写入到file2 $ sed -n '2,4w file2' file1 2,4w就是写2-4行的意思,那-n呢?默认情况下sed会把读入的文件处理的结果输出到标准输出,也就是终端,而为了不使用默认输出,-n就派上用场了,执行该命令终端不会有任何输出 $ cat file2 banana mango orange 查看file2内容,发现已经写入成功了 2.从第三行开始全部写入file2 $ sed -n '3,$w file2' file1 $ cat file2 mango orange strawberry 就不多解释了 3.如果是用正则呢? $ sed -n '/apple/,/mango/w file2' file1 $ cat file2 apple banana mango 该命令将逐行读入file1,然后判断该行是否匹配apple,如果匹配,则作为起始行,然后继续读入,判断是否匹配mango,如果是,则作为终止行,然后将中间的内容写入到file2 ...

2013-08-09 · 1 min · bystander

[译]Unix sed实用教程第二篇–替换文件内容

上一节中-Unix sed实用教程第一篇–向文件中增加一行 学习了添加文件,本节讲解数据内容替换. 本节将使用sample1.txt文件作为示例,文件内容如下,都是些水果..: apple orange banana pappaya 1.向每一行的开头添加内容,这里我们添加“Fruit:” $ sed 's/^/Fruit: /' sample1.txt Fruit: apple Fruit: orange Fruit: banana Fruit: pappaya 解析:s代表substitution,也就是替换,s之后是要替换/匹配的内容,斜线/用来分隔s以及要替换的原始内容还有要替换的最终内容,而’^‘符号是说一个正则,用来匹配每一行的开头,匹配成功后在开头加上’Fruit:’。 2.向每一行的行尾添加内容 $ sed 's/$/ Fruit/' sample1.txt apple Fruit orange Fruit banana Fruit pappaya Fruit 注意,这里的$和上一节的$符号表示的意义不同,这里则是表示行尾. 3.如何替换指定的字符,这里将小写a替换成大写A $ sed 's/a/A/' sample1.txt Apple orAnge bAnana pAppaya 注意,仅仅将每一行的第一个a替换了,不是所有,本例表示替换单个字符,你可以替换一个单词都是可以的. 4.如何替换行内所有的字符,用A替换a $ sed 's/a/A/g' sample1.txt Apple orAnge bAnAnA pAppAyA 注意,只是加了一个g选项,g为global的简写,就是全局,全部的意思。 5.如何替换第二次出现的a? $ sed 's/a/A/2' sample1.txt apple orange banAna pappAya 不使用g,而是使用数字来表示行内第几次出现的a,结果如上 6.如何替换第二次之后的所有a呢? $ sed 's/a/A/2g' sample1.txt apple orange banAnA pappAyA 很好理解对吧。 7.如果只想替换第三行的a呢? $ sed '3s/a/A/g' sample1.txt apple orange bAnAnA pappaya 回想一下第一节,在执行命令之前,会判断当前address是否满足条件,3就是地址 8.想替换一个范围行内的数据呢 $ sed '1,3s/a/A/g' sample1.txt Apple orAnge bAnAnA pappaya 逗号隔开,即可 9.如何替换整行呢?比如用apple is a Fruit替换apple $ sed 's/.*/& is a Fruit/' sample1.txt apple is a Fruit orange is a Fruit banana is a Fruit pappaya is a Fruit 这里‘&’符号标识了模式匹配到的内容,而.*匹配了正行,.表示任意字符,*表示一个或多个,也就是匹配了整行,&因此就是整行内容,用来重命名一组文件的时候非常有用. 10.如何进行多个替换,比如用A替换a,用P替换p $ sed 's/a/A/g; s/p/P/g' sample1.txt APPle orAnge bAnAnA PAPPAyA 也就是用分号分开即可。或者也可以通过-e参数来做 $ sed -e 's/a/A/g' -e 's/p/P/g' sample1.txt APPle orAnge bAnAnA PAPPAyA -e 选项就是当需要替换多个的时候来用的。 ...

2013-08-09 · 1 min · bystander

[译]Unix sed实用教程第一篇--向文件中增加一行

Unix sed实用教程第一讲,本系列第一篇,有任何问题欢迎留言讨论。 sed 是unix中最重要的编辑器之一,注意,有之一..支持多种编辑任务,本文将实现题目的功能实例 假定我们有一额文本文件,叫做empFile,包含了员工名字和员工id,如下: Hilesh, 1001 Bharti, 1002 Aparna, 1003 Harshal, 1004 Keyur, 1005 1.如何通过sed给文件添加标题行-“Employee, EmpId” $ sed '1i Employee, EmpId' empFile Employee, EmpId Hilesh, 1001 Bharti, 1002 Aparna, 1003 Harshal, 1004 Keyur, 1005 解释:数字1,是说只对第一行执行操作,i代表在insert(熟悉vim的同学应该知道,i会在当前字符的前面插入,a是在后面插入),因此,1i就表示在将Employee, EmpId插入到第一行之前, 然后,有了标题行的文件仅仅会输出到标准输出,源文件内容并不会改变,如果需要更新源文件,可以使用重定向输出到一个临时文件,然后移动到原始文件。如果Unix系统的sed是GUN版本的,sed会有一个-i选项,可以直接实现更新源文件,(如何查看版本,终端下输入sed –version即可看到)下面先执行,再查看文件,发现已经多了标题行了 $ sed -i '1i Employee, EmpId' empFile $ cat empFile Employee, EmpId Hilesh, 1001 Bharti, 1002 Aparna, 1003 Harshal, 1004 Keyur, 1005 2.如何在标题行之后,也就是原始第一行之前添加一行横线–“—–” $ sed -i '1a ---------------' empFile $ cat empFile Employee, EmpId --------------- Hilesh, 1001 Bharti, 1002 Aparna, 1003 Harshal, 1004 Keyur, 1005 同1,中,1表示第一行,a表示append(附加),也就是说当读入第一行的时候在其之后添加一行,如果你使用2i作为命令也是正确的,就是指当读入第二行的时候,在其之前插入一行。 3.如何在文件尾部添加一行 $ sed -i '$a ---------------' empFile $ cat empFile Employee, EmpId --------------- Hilesh, 1001 Bharti, 1002 Aparna, 1003 Harshal, 1004 Keyur, 1005 --------------- 为了在文件尾部插入一行,如果使用之前的方法就需要知道总共有多少行,而$符号则直接指明了最后一行,因此$a表示在读入最后一行的时候,在后面插入一行 4.如何在指定的记录之后插入一条新纪录 假定我们的例子文件的内容现在是: Employee, EmpId --------------- Hilesh, 1001 Harshal, 1004 Keyur, 1005 --------------- 如果我想在Hilesh这个员工之后插入Bharti员工的信息,我这样做: $ sed -i '/Hilesh/a Bharti, 1002' empFile $ cat empFile Employee, EmpId --------------- Hilesh, 1001 Bharti, 1002 Harshal, 1004 Keyur, 1005 --------------- 注意看,我们这里已经不再使用数字或者其他表示行号的标识了,我们使用了一个模式(了解过正则表达式的朋友会比较熟悉,可以理解为某种规则- /Hilesh/a 这个命令表示对于每一行读入的内容,如果发现 /Hilesh/这个匹配,在该行之后插入一行,也就是说如果文件里有两行都是Hilesh员工,那么执行完上面的命令,将会附加两行内容,这里可以想想sed的工作模式,对每一行执行命令条件检测,发现匹配,就执行。 ...

2013-08-09 · 1 min · bystander