设为首页 收藏本站
查看: 822|回复: 0

[经验分享] rename命令[Debian / Ubuntu] sed和awk的常用实例

[复制链接]

尚未签到

发表于 2018-5-3 13:32:29 | 显示全部楼层 |阅读模式
  一般替换文件名的工作用mv命令搭配通配符就OK了,但是难免遇到一些有逗号,有空格,或者正巧带有命令中参数意义的字符串,所以在批量转换的时候用mv命令就显得有些危险.
  在这里推荐4条rename命令,掌握了这4条命令,日常的文件名转换应该不是问题了,更多的参数和实例,在终端使用"man rename"来获取.
  1) 去掉所有 .bak 文件的扩展名:
  rename 's/\.bak$//' *.bak
  2) 把所有文件的后辍由rm改为rmvb:
  rename 's/\.rm$/\.rmvb/' *.rm
  3) 把所有文件名内含有大小字母的,修改为小写字母:
  rename 'y/A-Z/a-z/' *
  4) 用下划线替代文件名中所有空格,(连续多个空格视为1个空格):
  rename 's/[ ]+/_/g' *
  http://blog.csdn.net/junjieguo/article/details/7525794
  一、文本间隔
  1、在每一行后面增加一空行
  sed G guo.sh
  awk '{printf("%s\n\n",$0 ) }'
  2、将文件中原来的空行删掉,并在在每一行后边增加一空行
  sed '/^$/d;G '
  awk '!/^$/ {printf("%s\n\n",$0 ) }'
  3在匹配式样的行前插入一空行
  sed '/good/i\\'
  sed '/hello/{x;p;x;}'
  awk '{ if(/hello/) printf("\n\%s\n",$0);else print $0}'
  4、在匹配式样的行后插入一空行
  sed '/good/a\\'
  sed '/hello/G'
  awk '{if(/hello/) printf("%s\n\n",$0) ;else print $0}'
  5、在匹配式样的行前、行后各插入一空行
  sed '/hello/{x;p;x;G;}'
  awk '{ if(/hello/) printf("\n\%s\n\n",$0);else print $0}'
  二、文本的替换
  1、在每一行查找到good,然后把good替换为bad
  sed 's/good/bad/'只把每行的第一个good替换为bad
  sed 's/good/bad/2'只把每行的第二个good替换为bad
  sed 's/good/bad/g'把每一行的所有good替换为bad
  sed 's/\(.*\)good/\1bad/'只把每一行的的最后一个good替换位bad
  sed 's/\(.*\)good\(.*good\)/\1bad\2/'只把每一行的的倒数第二个good替换位bad
  awk   '{sub(/good/,"bad"); print $0}'只把每行的第一个good替换为bad
  awk   '{gsub(/good/,"bad"); print $0}'把每一行的所有good替换为bad
  cat  test |tr 'root' 'good'
  cat    test |tr 'root' 'god'
  sed   's/root/good/p' test
  awk   '{gsub(/root/,"good");print $0}' test
  awk   '{gsub(/root/,"god");print $0}' test
  通过对比可知tr的替换两个字串必须等长度,而sed不能把说有的root替换
  2、只在出现字符串fell字符串的前提下,将找到的行中的good替换为bad
  sed  '/fell/ s/good/bad/g'
  awk   '{if(/fell/) gsub(/good/,"bad"); print $0 }'
  3、只在不出现字符串fell字符串的前提下,将找到的行中的good替换为bad
  sed '/fell/ !s/good/bad/g'
  awk '{if(!/fell/) gsub(/good/,"bad"); print $0 }'
  4、不管是good、fell还是sun,一路替换为bad
  sed 's/good/bad/g;s/fell/bad/g;s/sun/bad/g'
  sed 's/good\|fell\|sun/bad/g'
  awk '{gsub(/good|fell|sun/,"bad") ; print $0}'
  5、倒置所有行,第一行变为最后一行(模拟tac)
  sed '1!G;h;$!d'
  sed -n '1!G;h;$p'
  awk '{A[i++]=$0} END{for (j=i-1;j>=0;j--) print A[j]}'
  6、将每两行连接为一行
  sed '$!N;s/\n/ /'
  awk '{f=!f;if(!f) printf("%s",$0);else printf("%s\n",$0)}'
  7、在文件中每隔5行显示一空行
  sed '0~5G'
  sed 'n;n;n;n;G'
  awk '{print $0 ;i++;if(i==5) {printf( "\n") ;i=0}}'
  三、选择性的显示特定行
  1、显示文件的前10行
  sed10q
  awk '{print ;if(NR==10) exit }'
  2、显示文件的第一行
  sed q
  awk '{ print;exit}'
  3、显示文件的倒数第二行
  sed -e '$!{h;d;}' -e x当文件只有一行时,输出空行
  sed -e '1{$q;}' -e '$!{h;d;}' -e x当文件只有一行时,显示该行
  sed -e '1{$d;}' -e '$!{h;d;}' -e x当文件只有一行时,不输出
  awk '{ B=A;A=$0} END{ print B}'当文件只有一行时,输出空行
  4、只显示匹配正则表达式的行
  sed -n '/good/p'
  sed  '/good/!d'
  awk '/good/ {print $0}'
  awk '/good/'
  grep 'good'
  5、只显示不匹配正则表达式的行
  sed -n '/good/!p'
  sed '/good/d'
  awk '!/good/ {print $0}'
  grep -v 'good'
  6、显示匹配行的上一行,而不显示匹配行
  sed -n '/good/{g;1!p;};h'
  awk '/good/ {print A} {A=$1}
  7、显示匹配行的下一行,而不显示匹配行
  sed -n '/good/{n;p;}'
  awk '{if(A) print;A=0}/23/{A=1}'
  8、显示文本的制定行
  sed -n '3,5p'
  sed '3,5!d'
  awk '{if(NR>=3 &&NR<=5) print } '
  目录: 1、不显示文件中的空行 2、删除文件的1到5行3、删除文件注释行4、打印匹配行5、显示从字符1到字符2的中间行6、匹配特别表达式7、替代文本
  1、不显示文件中的空行
[guo@guo~]$ grep -v '^$' rc.local

[guo@guo~]$ sed -e '/^$/d' rc.local

[guo@guo~]$ awk '!/^$/{print $0 }' rc.local

  2、删除文件的1到5行
[guo@guo~]$ cat test

[guo@guo~]$ sed -e '1,5d' test

[guo@guo~]$ awk '{if(NR>5 ) print $0} ' test

  3、删除文件注释行
[guo@guo~]$ sed -e "/^#/d" rc.local

[guo@guo~]$ awk '!/^#/{print $0}' rc.local

[guo@guo~]$ grep -v '^#' rc.local

  5、显示从字符1到字符2的中间行
[guo@guo~]$ sed -n -e '/hello/,/sorry/p' test1

[guo@guo~]$ awk '/hello/,/sorry/ {print $0 }' test1

  6、匹配特别表达式
[guo@guo~]$ sed -n -e '/main[[:space:]]*(/,/^}/p' for.c

  1、通过awk访问系统环境变量
[guo@guoawk]$ awk 'BEGIN { print ENVIRON["HOME"]; printENVIRON["PATH"]}'

  /home/guo
  /usr/lib/qt-3.3/bin:/usr/local/bin:/usr/bin:/bin:/usr/local/sbin:/usr/sbin
  2、awk中的算术运算符
[guo@guoawk]$ awk 'BEGIN {print "3+2=" 3+2 }'

  3+2=5
[guo@guoawk]$ awk 'BEGIN {print "2^10=" 2^10 }'

  2^10=1024
[guo@guoawk]$ awk 'BEGIN {print "(3+1)*4/2=" (3+1)*4/2}'

  (3+1)*4/2=8
  awk支持的运算符有+ - * / % ^。
  4、awk的循环
  if语句
[guo@guoawk]$ cat num

  12243535
  890232
  232 9809
  890 -8990
[guo@guoawk]$ awk '{if($1>$2) print $0}' num

  890232
  890 -8990
[guo@guoawk]$ awk '{if($1>$2) {print $0 ; print $1 "is larger than"$2}}' num

  890232
  890islarger than232
  890 -8990
  890islarger than-8990
  if/else
[guo@guoawk]$ awk '{if($1>$2) print $1 ;else print $2}' num

  3535
  890
  9809
  890
[guo@guoawk]$ awk '{if($1>$2) {count++ ;print count} else print $2}' num

  3535
  1
  9809
  2
  2012年10月9日 14:50:38
如何用sed打印文件范围从第二行至倒数第二行?   转自:http://bbs.chinaunix.net/thread-3700991-1-1.html
  普通青年版:

  •   sed '1d;$d'
文艺青年版:

  •   sed -n '1!P;N;$q;D'
二逼青年版:

  •   sed -r ':a;N;$!ba;s/^[^\n]+\n(.+)\n[^\n]+$/\1/'


运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-455408-1-1.html 上篇帖子: 放弃windows,奔向Ubuntu 下篇帖子: Ubuntu Server 13.10下安装FTP(Proftpd)
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表