SED与AWK
1.简介 sed是一种行编辑器,它一次处理一行内容。 2.sed调用方式 sed [options] 'command' file(s) sed [options] -f scriptfile file(s) 第一种直接在命令行中执行,第二种把命令写到了脚本中,二者无本质区别。 示例(1):打印hello.txt的内容 sed -n p hello.txt 说明: -n:sed会在处理一行文本前,将待处理的文本打印出来,-n参数关闭了这个功能 p:命令表示打印当前行 hello.txt:待处理的文件 这个指令相当于cat 3.定址 告诉sed你期望处理的行,由逗号分隔的两个数字表示,$符号表示最后一行; 当然也可以使用正则来定位期望处理的行。 示例(2):打印hello.txt的第二行到最后一行 sed -n '2,$'p hello.txt 示例(3):打印hello.txt中正则匹配"100"的行 sed -n '/100/'p hello.txt 4.基本命令 hello.txt的内容为 1 2 3 10 20 30 100 200 300 命令:a\ 在匹配行的后面加入一行文本 示例(4)匹配100的行,后面加入一行"new line" sed '/100/'a\ "new line" hello.txt 输出内容为: 1 2 3 10 20 30 100 200 300 new line 命令:i\ 在匹配行的前面加入一行文本 示例(5)匹配100的行,前面加入一行"new line" sed '/100/'i\ "new line" hello.txt 输出内容为: 1 2 3 10 20 30 new line 100 200 300 命令:c\ 将匹配行替换为目的行 示例(5)匹配100的行,替换为"new line" sed '/100/'c\ "new line" hello.txt 输出内容为: 1 2 3 10 20 30 new line 命令:d 将匹配行删除 示例(5)删除匹配100的行 sed '/100/'d hello.txt 输出内容为: 1 2 3 10 20 30 命令:s 将匹配行替换 详细命令为:s/pattern-to-find/replacement-pattern/g pattern-to-find:被替换的串 replacement-pattern:替换成这个串 g:全部替换,默认只替换匹配到的第一个 示例(5)讲100替换为hello sed 's/100/hello/g' hello.txt 输出内容为: 1 2 3 10 20 30 hello 200 300 5.元字符集 ^:匹配一行的开始 $:匹配一行的结束 .:匹配某个字符 [abc]:匹配指定范围字符 6.实用命令 匹配以10开头的行,并替换为yes,并输出 sed -n 's/^10/yes/p' hello.txt 输出内容为: yes 20 30 yes0 200 300 取出文件中行手的行号与冒号 设hello.txt的内容为 1:#!/bin/sh 2:cat hello.txt 3:exit sed -n -e 's/^[0-9]\{1,\}://g'p hello.txt 输出结果为: #!/bin/sh cat hello.txt exit 1分钟懂awk-技不在深,够用就行 1.什么是AWK (1)Aho、Weinberger、Kernighan三位发明者名字首字母; (2)一个行文本处理工具; 2.AWK基本原理 2.1原理:逐行处理文件中的数据 2.2语法: awk 'pattern + {action}' 说明: (1)单引号''是为了和shell命令区分开; (2)大括号{}表示一个命令分组; (3)pattern是一个过滤器,表示命中pattern的行才进行action处理; (4)action是处理动作; (5)使用#作为注释; 例子:显示hello.txt中的第3行至第5行 cat hello.txt | awk 'NR==3, NR==5{print;}' 2.3pattern说明 pattern参数可以是egrep正则中的一个,正则使用/pattern/ 例子:显示hello.txt中,正则匹配hello的行 cat hello.txt | awk '/hello/' 说明: (1)pattern和action可以只有其一,但不能两者都没有; (2)默认的action是print; 例子:显示hello.txt中,长度大于100的行号 cat hello.txt | awk 'length($0)>80{print NR}' 3.内置变量 FS 分隔符,默认是空格 NR 当前行数,从1开始 NF 当前记录字段个数 $0 当前记录 $1~$n 当前记录第n个字段 例子:显示hello.txt中的第3行至第5行的第一列与最后一列 cat hello.txt | awk 'NR==3, NR==5{print $1,$NF}' 4.内置函数 gsub(r,s):在$0中用s代替r index(s,t):返回s中t的第一个位置 length(s):s的长度 match(s,r):s是否匹配r split(s,a,fs):在fs上将s分成序列a substr(s,p):返回s从p开始的子串 5.操作符 5.1运算符 类似于c,支持+、-、*、/、%、++、–、+=、-=等诸多操作; 5.2判断符 类似于c,支持==、!=、>、=>、~(匹配于)等诸多判断操作; 6.控制流程 6.1.BEGIN和END BEGIN和END本质是一个pattern。 BEGIN用于awk程序开始开始前,做一些初始化的工作; END用于awk程序结束前,做一些收尾的工作。 例子:统计字符个数 awk ' BEGIN { count=0; } { count+=length($0); } END { print count; }' 6.2流程控制语句 (1)if(condition){}else{} (2)while{} (3)do{}while(condition); (4)for(init;condition;step){} (5)break/continue:如果有END,会执行END中的收尾工作 个流程控制语句用法几乎与c相同。 7.awk与shell的交互 (1)awk中使用shell中定义的变量:使用单引号即可; #!/bin/bash STR="hello" echo | awk '{ print "'${STR}'"; }' (2)awk中使用shell命令:使用双引号,或者system命令; #!/bin/bash echo hello | awk '{ print $0 | "cat" }' 或者 #!/bin/bash echo | awk '{ system("date > date.txt") }' (3)awk中的变量传出至shell:没有什么好方法,老老实实用文件吧; (4)getline:awk里,从文件中读取变量到awk中 #!/bin/bash echo | awk '{ while(getline < "date.txt") { print $0; } }' 8.结束语 对不起,楼主欺骗了你,认真看完本文或许不止1分钟。不过,如果你真的认真阅读并超过了1分钟,相信你会有收获。