Hom's Blog


Sed-Awk-Grep-Find编辑器

Linux正则表达式

  • . 匹配任意单字符
  • ^ 行头匹配声明
  • $ 行尾匹配(写在单词末)
  • ^$ 空行匹配
  • a* 匹配任意某字符a(0个或以上)
  • .* 匹配任意个任意字符(相当于一般匹配的*)
  • a/{n/} 匹配n个a,另外有/{n,/} 匹配n个以上a, /{n,m/}匹配n到m个的a. n和m为0-255.
  • [a-z] 一般意义匹配的指定范围匹配
  • [a-zA-Z]* 匹配任意单词
  • [^a-z] 匹配任意非a-z, 中括号内的^表示非.(一般匹配中使用!)
  • \ 反义(屏蔽特殊含义)
  • \<\> 这两个符合分别表示非字符(0-9,a-Z) 可以用于精确匹配
  • [[:upper:]],[[:lower:]],[[:digit:]],[[:alnum:]],[[:alpha:]] 代表大写,小写,数字,数字或字母,字母
  • [[:space:]] 代表Tab和空格
  • \w 就是所有0-9a-Z,相当于[[:alnum:]]
  • \W \w的反置,也就是非单词.
  • \b 单词锁定符,如’\bhello\b’

支持单引号和双引号包含字符串/表达式, 对于pattern中使用变量时,必须使用"$a"的表达防止误解.对于字符串建议用'string'括起来

sed 非交互文档编辑,流编辑器

sed全名叫stream editor,流编辑器. sed功能很强大, 在linux命令中有着不可替代的作用.其主要作用包括显示匹配行, 进行替换等. 辅助awk, 有时配合grep和find, 可以进行很多功能. sed也是支持正则表达式的~

###基本语法
- sed [option] sed-command inputfile 命令部分要加引号 - sed [option] -f commandfile inputfile

option:

-n 显示打印定位匹配行, 不加则会非定位的所有行都输出 -f 指定sed脚本 -e 添加脚本命令到运行命令, 用于多个指令一起进行例如实现p和=的功能,要-e ‘/hi/’p -e ‘/hi/’= 这样写命令 -i 直接修改文件内容

command: =定位+编辑

定位:
  • x 某一行; x,y x到y行; 如’1,$p’ 打印所有行,$是最末行的意思
  • x,y! 非x到y的行.注意使用时’1,3!’p 都则!p会被翻译
  • /string/ 包含string的行,里面可含有[0-9]这种表达也支持反斜线, 最好将’/string/’p 这样表达(p在引号外), .*代表0-任意通配, .为任意字符
  • x,/string/ 从x行到包含string的行.要是x行包含string,则跳到下一个含string的行.
  • /string/,x string所有匹配都会打印,从第一个string匹配的行到x行的都打印.
编辑
  • p 输出编辑行
  • = 打印编辑行行号
  • d 删除编辑行
  • w 结果写入到w filename.
  • r 读某个文件,写到编辑行之下.r filename
  • q 首次遇上定位符合后退出

替换:

s/origin/sub/ 将origin的内容替换为sub的内容,现在默认就是全局了.其中的origin/sub支持正则表达式,如^代表所有行开头,$代表所有行结尾.

  • /sub/后可以跟选项,g是全局,w fileA是把替换的行写入到文件fileA里, p 打印编辑行(用于-n) .
  • s/origin/sub/1 替换每一行的第一个origin,s/origin/sub/3g 只替换每一行的第三个以后的origin
  • '1,3s/a/A/g; 3,$s/This/That/g' 替换多个模式, 相当于-e '1,3s/a/A/g' -e '3,$s/This/That/g'
  • sed 's/my/[&]/g' my.txt 表示把每个my变成[my], & 用来当做被匹配的变量

sed脚本 #!/bin/sed -f 开头

例如:

sed -e "s/total_atoms_Hom/$TotalAtoms/" -e "s/ligand_ending_Hom/$LigEnd/" mm_pbsa.in >mm_pbsa_revised.in 进行替代.注意这里要用变量,如果用’…‘则不会翻译变量,因此要用双引号. 没有-n 所以修改完全输出

举例:

使用p(rint)显示行: sed -n '2p' temp.txt   只显示第2行,使用选项n
打印范围:  sed -n '1,3p' temp.txt         打印第1行到第3行
打印模式:  sed -n '/movie/'p temp.txt     打印含movie的行
使 用模式和行号查询:  sed -n '3,/movie/'p temp.txt   只在第3行查找movie并打印
显示整个文件:  sed -n '1,$'p temp.txt      $为最后一行
任意字符:  sed -n '/.*ing/'p temp.txt     注意是.*ing,而不是*ing
打印行号:  sed -e '/music/=' temp.txt
附加文本:(创建sed脚本文件)chmod u+x script.sed,运行时./script.sed temp.txt
#!/bin/sed -f
/name1/ a/             #a/表示此处换行添加文本
        HERE ADD NEW LINE.     #添加的文本内容
插入文本: /name1/ a/ 改成 4 i/ 4表示行号,i插入
修改文本: /name1/ a/ 改 成 /name1/ c/ 将修改整行,c修改
删除文本: sed '1d' temp.txt  或者 sed '1,4d' temp.txt, sed -e '5,$d' file 删除5行以后内容并显示
替 换文本: sed 's/source/OKSTR/' temp.txt     将source替换成OKSTR
sed 's//$//g' temp.txt             将文本中所有的$符号全部删除
sed 's/source/OKSTR/w temp2.txt' temp.txt 将替换后的记录写入文件temp2.txt
替换修改字符串: sed 's/source/"ADD BEFORE" &/p' temp.txt
结果将在source字符串前面加上"ADD BEFORE",这里的&表示找到的source字符并保存
sed结果写入到文件: sed '1,2 w temp2.txt' temp.txt
sed '/name/ w temp2.txt' temp.txt
从文件中读文本: sed '/name/r temp2.txt' temp.txt
在每列最后加文本: sed 's/[0-9]*/& Pass/g' temp.txt
从 shell向sed传值: echo $NAME | sed "s/go/$REP/g"   注意需要使用双引号

's//.$//g'         删除以句点结尾行
'-e /abcd/d'       删除包含abcd的行
's/[][][]*/[]/g'   删除一个以上空格,用一个空格代替
's/^[][]*//g'      删除行首空格
's//.[][]*/[]/g'   删除句号后跟两个或更多的空格,用一个空格代替
'/^$/d'            删除空行
's/^.//g'          删除第一个字符,区别  's//.//g'删除所有的句点
's/COL/(.../)//g'  删除紧跟COL的后三个字母
's/^////g'         删除路径中第一个/

awk

awk [-F seperator] 'command' inputfile 文档行处理工具

-F 是指明分隔符
-f 可以用于指定脚本运行,不需command

  • ‘command’ 一般格式为 ‘正则表达式匹配 {动作}’
  • ‘command’ 内可含有BEGIN {..} {…} END{…} 这种结构,用在处理前和后

正则

支持或| 支持\ $^. [] | () * ? +

匹配

正则表达式条件 ~和!~(不匹配), 用()括起来,前面可以加if成判断语句 ‘{if ($4 ~ /Brown/) print $0}’ 匹配后面紧跟正则,用/abc/来表示. 用/abc/只能部分匹配, 精确匹配请用== ‘#3==”48” {print $0}’ 注意条件匹配if (~)语句放在{}内和动作一起, 作为整体动作,否则遵循’正则表达式匹配 {动作}’的格式 if 条件中支持||, &&, ! 与或非

例如:

awk '{print $2}' file.txt 直接抓取第二列,分隔符默认空格.如果需要可用-F '|'之类指定
awk -F :   '{print $1}' file.txt 抓取第一列. 注意用'..'否则变成系统输入变量

grep 文档内容匹配搜索工具

grep pattern files

  • -c 只计数,共多少行
  • -C num 除了返回的匹配行外,其上下num行也返回
  • -v 显示不包含匹配的所有行
  • -n 显示行号
  • -i 不区分大小写
  • -E 开启扩展模式匹配, | 表示或, (egrep)
  • -F (fgrep相当)

-E的扩展集

  • a+ 一个或多个a
  • ? 0个或以上的字符
  • | 或
  • () 分组,如(able|rs)表示able或者rs

举例

grep -C 1 '@<TRIPOS>MOLECULE' filename | grep mol2 #提取出分子名称

find

find * -type d -exec mkdir -p utf/{} \; 复制(新建)当前目录文件夹结构到utf到.

linux find命令格式及find命令详解

Reference

TODO:

  1. GNU-Sed
  2. shell学习之-sed用法解析
  3. 简明教程; 详解
  4. AWK简明教程
  5. Linux Bash AWK知识汇集


◆ 本文地址: http://platinhom.github.io/2015/12/03/sed-usage/, 转载请注明 ◆

前一篇: Jekyll下划线文件夹问题
后一篇: Bash:tar强大常用的归档压缩命令


Contact: Hom / 已阅读()
Source 类别: Coding  标签: Bash