《SED 单行脚本快速参考》的 awk 实现
sed和awk命令-黄来君
对于Linux而言要充分处理文本,就要掌握三大基本的文本处理工具:黄来君修改grep:文本过滤器grep 'pattern' input_file ...sed(流编辑器,默认情况下sed只支持使用基本正则表达式)awk(报告文本的生成器,最难)编辑器分类:行编辑器和全屏编辑器(vi);sed:Stream EDitor,流编辑器,用来操作成ACSII码的文本的;它是按照剢行处理文本的,所以叫做行编辑器。
内存空间叫做模式空间。
sed还有保留空间;sed本身也是一种语言;默认不编辑原文件,仅对模式空间中的数据做处理;而后,处理结束后,将模式空间打印至屏幕;每一次处理文件的时候是剢行读取,每一次把每一行读取到内存空间中去,然后在内存中完成编辑,将编辑的结果输出到屏幕上来。
sed [options] 'AddressCommand' file ... []里面可以省略-n: 静默模式,不再默认显示模式空间中的内容[root@aqzcpt ceshi]# sed '/^\//p' fstab/dev/mapper/vg_aqzcpt-lv_root / ext4 defaults 1 1 /dev/mapper/vg_aqzcpt-lv_root / ext4 defaults 1 1 /dev/mapper/vg_aqzcpt-lv_swap swap swap defaults 0 0 /dev/mapper/vg_aqzcpt-lv_swap swap swap defaults 0 0 tmpfs /dev/shm tmpfs defaults 0 0 sysfs /sys sysfs defaults 0 0proc /proc proc defaults 0 0 [root@aqzcpt ceshi]# sed -n '/^\//p' fstab/dev/mapper/vg_aqzcpt-lv_root / ext4 defaults 1 1 /dev/mapper/vg_aqzcpt-lv_swap swap swap defaults 0 0 -i:直接修改原文件,sed默认是不会修改原文件的,-i选项就可以实现修改;(危险)sed -i '1i xyz' test.txt 在第一行之前插入sed -i '1a xyz' test.txt 在第一行之后插入sed -i '1c xyz' test.txt 把第一行数据替换成xyz-e :SCRIPT -e SCRIPT:可以同时执行多个脚本,意思就是同时可以执行多个操作;[root@aqzcpt ceshi]# sed -e 's/\//#/g' -e 's/oot/OOT/g' /root/ceshi/fstab#dev#mapper#vg_aqzcpt-lv_rOOT # ext4 defaults 1 1 #dev#mapper#vg_aqzcpt-lv_swap swap swap defaults 0 0 tmpfs #dev#shm tmpfs defaults 0 0 devpts #dev#pts devpts gid=5,mode=620 0 0sysfs #sys sysfs defaults 0 0proc #proc proc defaults 0 0-f /PATH/TO/SED_SCRIPTsed -f /path/to/scripts(这里都是脚本用来处理后面的文件) file-r: 表示使用扩展正则表达式(默认情况下sed只支持使用基本正则表达式)Address:1、StartLine,EndLine 从起始行到结束行用逗号隔开;比如1,100$:最后一行$-1:倒数第二行[root@aqzcpt ceshi]# sed '$d' fstab 删除最后一行[root@aqzcpt ceshi]# sed '3,$d' fstab2、/RegExp/ 使用正则表达式,来指定模式;/^root/ 以root字符串开始的行3、/pattern1/,/pattern2/ 模式1,到模式2[root@aqzcpt ceshi]# cat fstabtmpfs /dev/shm tmpfs defaults 0 0 devpts /dev/pts devpts gid=5,mode=620 0 0sysfs /sys sysfs defaults 0 0proc /proc proc defaults[root@aqzcpt ceshi]# sed -n '/^t/,/^s/p' fstabtmpfs /dev/shm tmpfs defaults 0 0 devpts /dev/pts devpts gid=5,mode=620 0 0sysfs /sys sysfs defaults[root@aqzcpt ceshi]# sed '/^t/,/^s/p' fstabtmpfs /dev/shm tmpfs defaults 0 0tmpfs /dev/shm tmpfs defaults 0 0 devpts /dev/pts devpts gid=5,mode=620 0 0 devpts /dev/pts devpts gid=5,mode=620 0 0sysfs /sys sysfs defaults 0 0sysfs /sys sysfs defaults 0 0proc /proc proc defaults 0 0 第一次被pattern1匹配到的行开始,至第一次被pattern2匹配到的行结束,这中间的所有行4、LineNumber指定的行,精确到某行[root@aqzcpt ceshi]# sed -n '2p' fstabdevpts /dev/pts devpts gid=5,mode=620 0 05、StartLine, +N从指定的行startLine开始,向后的N行;[root@aqzcpt ceshi]# cat fstabtmpfs /dev/shm tmpfs defaults 0 0 devpts /dev/pts devpts gid=5,mode=620 0 0sysfs /sys sysfs defaults 0 0proc /proc proc defaults 0 0[root@aqzcpt ceshi]# sed -n '2,+1p' fstabdevpts /dev/pts devpts gid=5,mode=620 0 0sysfs /sys sysfs defaults 0 0 Command:d: 删除符合条件的行;列:删除前两行:sed '1,2d' /ceshi/1.sh(如果里面有变量,实现变量替换就得用双引号),可以看出实际上是不对原文件操作的;00:15:57方法一:删除符合条件的行[root@aqzcpt ceshi]# sed '1d' ./1.shddddddwwwwww[root@aqzcpt ceshi]# cat 1.shssssssddddddWwwwww方法二:使用模式来指定过滤特定的行[root@aqzcpt ceshi]# cat fstab/dev/mapper/vg_aqzcpt-lv_root / ext4 defaults 1 1/dev/mapper/vg_aqzcpt-lv_swap swap swap defaults 0 0 tmpfs /dev/shm tmpfs defaults 0 0 devpts /dev/pts devpts gid=5,mode=620 0 0sysfs /sys sysfs defaults 0 0proc /proc proc defaults 0 0[root@aqzcpt ceshi]# sed '/dev/d' fstabsysfs /sys sysfs defaults 0 0proc /proc proc defaults 0 0方法三:使用相对行表示方法:删除第二行和向后两行:[root@aqzcpt ceshi]# sed '2,+2d' fstab/dev/mapper/vg_aqzcpt-lv_root / ext4 defaults 1 1 sysfs /sys sysfs defaults 0 0proc /proc proc defaults 0 0第四种:删除斜线开头的行:[root@aqzcpt ceshi]# cat fstab/dev/mapper/vg_aqzcpt-lv_root / ext4 defaults 1 1/dev/mapper/vg_aqzcpt-lv_swap swap swap defaults 0 0 tmpfs /dev/shm tmpfs defaults 0 0 devpts /dev/pts devpts gid=5,mode=620 0 0sysfs /sys sysfs defaults 0 0proc /proc proc defaults 0 0[root@aqzcpt ceshi]# sed '/^\//d' fstab(内部的斜杠需要用反斜线转移,外面的两个不用,是特殊字符)tmpfs /dev/shm tmpfs defaults 0 0 devpts /dev/pts devpts gid=5,mode=620 0 0sysfs /sys sysfs defaults 0 0proc /proc proc defaults 0 0p: 显示符合条件的行(print打印);[root@aqzcpt ceshi]# cat fstab/dev/mapper/vg_aqzcpt-lv_root / ext4 defaults 1 1/dev/mapper/vg_aqzcpt-lv_swap swap swap defaults 0 0 tmpfs /dev/shm tmpfs defaults 0 0 devpts /dev/pts devpts gid=5,mode=620 0 0sysfs /sys sysfs defaults 0 0proc /proc proc defaults 0 0[root@aqzcpt ceshi]# sed '/^\//p' fstab 发现符合条件的显示两次不符合的就一次,就是自己显示一次,P(print)命令在处理一次;/dev/mapper/vg_aqzcpt-lv_root / ext4 defaults 1 1/dev/mapper/vg_aqzcpt-lv_root / ext4 defaults 1 1/dev/mapper/vg_aqzcpt-lv_swap swap swap defaults 0 0 /dev/mapper/vg_aqzcpt-lv_swap swap swap defaults 0 0 tmpfs /dev/shm tmpfs defaults 0 0 devpts /dev/pts devpts gid=5,mode=620 0 0sysfs /sys sysfs defaults 0 0proc /proc proc defaults 0 0a \string: 在匹配到的行后面新增一行,也就是在指定的行后面追加新行,内容为string;Append text (附加)添加文本[root@aqzcpt ceshi]# cat fstab/dev/mapper/vg_aqzcpt-lv_root / ext4 defaults 1 1/dev/mapper/vg_aqzcpt-lv_swap swap swap defaults 0 0 tmpfs /dev/shm tmpfs defaults 0 0 devpts /dev/pts devpts gid=5,mode=620 0 0sysfs /sys sysfs defaults 0 0proc /proc proc defaults 0 0[root@aqzcpt ceshi]# sed '/^\//a \# liuwei hello' fstab/dev/mapper/vg_aqzcpt-lv_root / ext4 defaults 1 1# liuwei hello/dev/mapper/vg_aqzcpt-lv_swap swap swap defaults 0 0 # liuwei hellotmpfs /dev/shm tmpfs defaults 0 0 devpts /dev/pts devpts gid=5,mode=620 0 0sysfs /sys sysfs defaults 0 0proc /proc proc defaults 0 0\n:可以用于换行[root@aqzcpt ceshi]# sed '/^\//a \# liuwei hello\n# liuwei hello' fstab 显示两行的效果/dev/mapper/vg_aqzcpt-lv_root / ext4 defaults 1 1# liuwei hello# liuwei hello/dev/mapper/vg_aqzcpt-lv_swap swap swap defaults 0 0 # liuwei hello# liuwei hellotmpfs /dev/shm tmpfs defaults 0 0 devpts /dev/pts devpts gid=5,mode=620 0 0sysfs /sys sysfs defaults 0 0proc /proc proc defaults 0 0i \string: 在指定的行前面添加新行,内容为string;Insert text 插入文本,用法同a; [root@aqzcpt ceshi]# cat 1.shefgchenmi[root@aqzcpt ceshi]# sed '/^e/i\#hello' 1.sh#helloefgchenmir FILE: 将指定的文件的内容添加至符合条件的行处;Append text read from filename. [root@aqzcpt ceshi]# sed '2r/root/ceshi/1.sh' /root/ceshi/fstab 把文件1.sh的内容从第二行添加进来;可以用来合并两个文件(sed '$r ............),和cat file1 file2类似;/dev/mapper/vg_aqzcpt-lv_root / ext4 defaults 1 1/dev/mapper/vg_aqzcpt-lv_swap swap swap defaults 0 0 ssssssddddddwwwwwwtmpfs /dev/shm tmpfs defaults 0 0 devpts /dev/pts devpts gid=5,mode=620 0 0sysfs /sys sysfs defaults 0 0proc /proc proc defaults 0 0合并两个文件:[root@aqzcpt ceshi]# sed '$r /root/ceshi/1.sh' /root/ceshi/fstab 插入到后者结尾/dev/mapper/vg_aqzcpt-lv_root / ext4 defaults 1 1/dev/mapper/vg_aqzcpt-lv_swap swap swap defaults 0 0 tmpfs /dev/shm tmpfs defaults 0 0 devpts /dev/pts devpts gid=5,mode=620 0 0sysfs /sys sysfs defaults 0 0proc /proc proc defaults 0 0 ssssssddddddWwwwww[root@aqzcpt ceshi]# sed '1,2r /root/ceshi/1.sh' /root/ceshi/fstab 在第一行和第二行后面都显示一边,只要符合条件每一行都会做处理;[root@aqzcpt ceshi]# sed '1,2r/root/ceshi/fstab' /root/ceshi/1.sh 插入到后者w FILE: 将地址指定的范围内的行另存至指定的文件中;[root@aqzcpt ceshi]# sed '/sys/w /root/ceshi/sys.txt' /root/ceshi/fstab 把符合条件的行保存到sys.txt中;/dev/mapper/vg_aqzcpt-lv_root / ext4 defaults 1 1/dev/mapper/vg_aqzcpt-lv_swap swap swap defaults 0 0 tmpfs /dev/shm tmpfs defaults 0 0 devpts /dev/pts devpts gid=5,mode=620 0 0sysfs /sys sysfs defaults 0 0proc /proc proc defaults 0 0[root@aqzcpt ceshi]# ls1.sh b.txt fstab fstab01 liuwei sys.txt[root@aqzcpt ceshi]# cat sys.txtsysfs /sys sysfs defaults 0 0s/pattern/string/修饰符: 查找并替换,默认只替换每行中第一次被模式匹配到的字符串(最难的一个)[root@aqzcpt ceshi]# sed 's/oot/OOT/' /root/ceshi/fstab/dev/mapper/vg_aqzcpt-lv_rOOT / ext4 defaults 1 1/dev/mapper/vg_aqzcpt-lv_swap swap swap defaults 0 0 tmpfs /dev/shm tmpfs defaults 0 0 devpts /dev/pts devpts gid=5,mode=620 0 0sysfs /sys sysfs defaults 0 0proc /proc proc defaults 0 0[root@aqzcpt ceshi]# sed 's/^\//#/' /root/ceshi/fstab 如果跟分隔符相同了,就需要转意,就是加反斜线“\”#dev/mapper/vg_aqzcpt-lv_root / ext4 defaults 1 1#dev/mapper/vg_aqzcpt-lv_swap swap swap defaults 0 0 tmpfs /dev/shm tmpfs defaults 0 0 devpts /dev/pts devpts gid=5,mode=620 0 0sysfs /sys sysfs defaults 0 0proc /proc proc defaults 0 0[root@aqzcpt ceshi]# sed 's/\//#/' /root/ceshi/fstab 不限定行首,就会替换每一行的第一个(默认替换每一行第一个被匹配的字符串)#dev/mapper/vg_aqzcpt-lv_root / ext4 defaults 1 1#dev/mapper/vg_aqzcpt-lv_swap swap swap defaults 0 0tmpfs #dev/shm tmpfs defaults 0 0 devpts #dev/pts devpts gid=5,mode=620 0 0sysfs #sys sysfs defaults 0 0proc #proc proc defaults 0 0加修饰符:把每一行所有出现的都替换,有两个g: 全局替换:root@aqzcpt ceshi]# sed 's/\//#/g' /root/ceshi/fstab#dev#mapper#vg_aqzcpt-lv_root # ext4 defaults 1 1#dev#mapper#vg_aqzcpt-lv_swap swap swap defaults 0 0 tmpfs #dev#shm tmpfs defaults 0 0 devpts #dev#pts devpts gid=5,mode=620 0 0sysfs #sys sysfs defaults 0 0proc #proc proc defaults 0 0i: 忽略字符大小写:sed命令分隔符(#、@、/):s///:这种情况/做分隔符,需要转意;s###, s@@@ 这两个就不需要转意;如果用到#和@就不要用他们做分隔符;[root@aqzcpt ceshi]# sed 's@/@#@g' /root/ceshi/fstab#dev#mapper#vg_aqzcpt-lv_root # ext4 defaults 1 1#dev#mapper#vg_aqzcpt-lv_swap swap swap defaults 0 0 tmpfs #dev#shm tmpfs defaults 0 0 devpts #dev#pts devpts gid=5,mode=620 0 0sysfs #sys sysfs defaults 0 0proc #proc proc defaults 0 0[root@aqzcpt ceshi]# cat /root/ceshi/fstab/dev/mapper/vg_aqzcpt-lv_root / ext4 defaults 1 1/dev/mapper/vg_aqzcpt-lv_swap swap swap defaults 0 0 tmpfs /dev/shm tmpfs defaults 0 0 devpts /dev/pts devpts gid=5,mode=620 0 0sysfs /sys sysfs defaults 0 0proc /proc proc defaults 0 0[root@aqzcpt ceshi]# sed 's%/%#%g' /root/ceshi/fstab %也可以作为分隔符,&、*都可以#dev#mapper#vg_aqzcpt-lv_root # ext4 defaults 1 1#dev#mapper#vg_aqzcpt-lv_swap swap swap defaults 0 0 tmpfs #dev#shm tmpfs defaults 0 0 devpts #dev#pts devpts gid=5,mode=620 0 0sysfs #sys sysfs defaults 0 0proc #proc proc defaults 0 0后向引用,grep也说到:\(\), \1, \2s/pattern/string/修饰符,“.”在pattern部分,可以表示正则表达式的元字符可以匹配任意单个字符;“.”在string是不能使用模式的,如果用”.”就表示”.”本身,没有任何意义;因为string表示字符串,不是正则表达式。
awk和sed的用法 -回复
awk和sed的用法-回复Awk和sed是一些重要的文本处理工具,可以在Unix和Linux系统中使用。
它们都具有强大的功能,可以用来处理和转换文本。
Awk是一种用于处理和分析文本文件的命令行工具。
它的名字源自三位创始人Aho、Weinberger和Kernighan的姓氏首字母。
Awk是一种高级的编程语言,其特点是处理文件时能够灵活地匹配和操作文本的列和行。
Awk的工作原理是将输入文件分割成字段,然后逐行处理。
它可以对文件进行过滤、格式化、计算和统计等操作。
Awk的语法相对简单易懂,因此受到了广泛的欢迎和使用。
与Awk不同,sed是一种用于编辑和转换文本的流编辑器。
它的名字是从英语“Stream EDitor”中缩写而来。
该工具的主要功能是通过根据指定模式和动作来编辑输入流中的文本行。
诸如查找、替换、删除、插入、追加等操作都可以通过sed命令实现。
Sed的主要工作原理是读取输入文件的一行,然后根据设置的模式进行匹配,并执行相应的操作。
使用Awk和sed的首要任务是了解它们的基本语法和命令。
另外,我们还需要了解它们的工作原理和主要用法。
下面将逐步回答以下主题:1. Awk和sed的基本语法- Awk的语法由模式-动作对组成。
模式用于匹配文件中的行,动作用于对匹配行进行操作。
- Sed的语法由地址-命令对组成。
地址用于选择输入行,命令用于对选定行执行编辑操作。
2. Awk的常见用法- 使用Awk进行数据过滤:通过指定模式匹配和动作操作,可以从文本文件中过滤出所需的数据。
- 使用Awk进行文本格式化:通过修改文本的列和行,可以对文本进行格式化和美化。
- 使用Awk进行数学计算和统计:Awk具有内建的数学计算和统计函数,可以对数据进行处理和分析。
3. Sed的常见用法- 使用sed进行替换操作:可以使用sed命令查找和替换文本中的特定模式。
- 使用sed进行删除和插入操作:sed可以帮助我们删除指定模式的文本行或在指定行之前或之后插入新的文本行。
高级Shell脚本编写技巧使用awk和sed进行文本处理和数据转换
高级Shell脚本编写技巧使用awk和sed进行文本处理和数据转换高级Shell脚本编写技巧:使用awk和sed进行文本处理和数据转换在Shell脚本编写中,awk和sed是两个常用的命令工具,它们可以高效地进行文本处理和数据转换。
本文将介绍一些使用awk和sed的高级技巧,帮助读者更好地利用这两个工具来处理文本和转换数据。
一、awk技巧1.基本语法awk是一种强大的文本处理工具,其基本语法为:awk 'pattern { action }' file其中,pattern是模式,决定是否对文本进行处理,action则是具体的处理动作。
file是需要处理的文件。
例如,要打印文件的第一列,可以使用以下命令:awk '{ print $1 }' file2.模式和动作在awk中,可以根据需求灵活组合模式和动作。
例如,要输出第一列大于100的行,可以使用以下命令:awk '$1 > 100 { print }' file3.内置变量awk提供了许多内置变量,用于方便地处理文本。
例如,$0表示整行文本,$1、$2等表示第n列,NF表示列数,NR 表示行号等。
可以利用这些内置变量来编写更加灵活的命令。
4.awk函数awk还提供了一些内置函数,用于处理文本。
例如,substr函数用于截取子字符串,length函数用于返回字符串长度等。
可以根据需要选择合适的函数来处理文本数据。
二、sed技巧1.基本语法sed是一种流编辑器,其基本语法为:sed 'pattern { action }' file其中,pattern是模式,决定是否对文本进行处理,action则是具体的处理动作。
file是需要处理的文件。
例如,将文件中所有的"apple"替换为"orange",可以使用以下命令:sed 's/apple/orange/g' file2.替换操作sed最常用的功能之一就是替换文本。
awk命令
awk命令awk 行处理方式awk和sed一样,一次处理一行内容,也可以对每行进行切片处理akw 命令格式awk [选项参数] 'script' var=value file(s)或awk [选项参数] -f scriptfile var=value file(s)选项参数:#这儿只列出了常用的部分-F fs or --field-separator fs指定输入文件折分隔符,fs是一个字符串或者是一个正则表达式,如-F:。
-f scripfile or --file scriptfile从脚本文件中读取awk命令。
基本格式:$ awk [options] 'script' filesscript 由两部分组成,分别是1、pattern,可以是正则表达式或者逻辑判断式2、{ awk 命令 } 花括号括起来的是代码段awk 内建变量awk函数测试awk变量和函数使用实例测试数据(base) [root@localhost Tana]# cat data.txtlog1.txt female BeiJing 90 Yeslog2.txt male ShangHai 55打印每一行的行号、字段数、以及每一行的内容(base) [root@localhost Tana]# awk '{print "row:" NR, "fields:" NF, $0}' data.txtrow:1 fields:5 log1.txt female BeiJing 90 Yesrow:2 fields:4 log2.txt male ShangHai 55来源:。
sed和awk的用法
sed和awk都是Linux下常用的文本处理工具,它们都可以用来处理结构化文本文件,具有快速、灵活、高效的特点。
下面是sed和awk的一些常见用法:
sed:
替换:sed 's/old/new/g' file.txt,将文件中的“old”替换为“new”。
删除:sed '1,5d' file.txt,删除文件中的前5行。
追加:sed -i '1i\hello world' file.txt,在文件的第一行前添加“hello world”。
打印:sed '10p' file.txt,打印文件中的第10行。
替换多个文件:sed -i 's/old/new/g' file1.txt file2.txt file3.txt,将文件中的“old”替换为“new”。
awk:
打印:awk '{print $1}' file.txt,打印文件中的第一列。
计算:awk '{sum+=$1} END {print sum}' file.txt,计算文件中的第一列的总和。
分组:awk -F: '{print $1}' file.txt,按照冒号分隔符打印文件中的第一列。
条件判断:awk '$3>10 {print $1}' file.txt,打印文件中第三列大于10的行。
脚本:awk -f script.awk file.txt,执行一个awk脚本文件,对文件进行操作。
实验16 sed-awk
实验16 sed和awk的简单使用一、实验目的1.掌握sed的功能及简单使用。
2.掌握awk的功能及简单使用。
二、实验任务以上操作请同学自己思考不同的任务能反映出结果,并验证结果。
1.基本知识sed:擅长对行操作awk:常用语对行及行中的分列进行操作。
使用格式:sed 'script' filenameawk 'script' filename.匹配除换行符的任一个字符* 匹配除换行符的零到多个字符[ ] 匹配括号中给出的任一个字符,其中^表示不包含的意思^ 匹配一行的开始$ 匹配一行的结尾2.sed的使用test1文件内容如下:user1 password1 username1 1wuser2 password2 username2 10wuser3 password3 username3 100wabc1 password10 username1 1abc2 password100 username100 10wabc3 password123 username123 100ABC1 password1 abc10 1wABC2 password1 abc20 10ABC3 password1 abc30 100w01user1 password1 username1 1002user2 password2 username2 2003user3 password3 username3 30(1)打印数字结尾的行,-n的取消回显sed -n '/[0-9]$/p' test1(2)打印数字开始的行sed -n '/^[0-9]/p' test1(3)打印以大写字母开始的行sed -n '/^[A-Z]/p' test1(4)输出中删除大写字母开始的行,不用带-n参数sed '/^[A-Z]/d' test1(5)替换每行中的首个abc为def,第二次出现的不替换sed 's/abc/def/' test1(6)替换每行中的abc为def。
sed或awk处理文件最后一行的实现方法
分别用sed与awk来实现。 sed:
复制代码 代码如下:
echo 'abcd 1234 fds 2011 550 1023 832er 1231' |sed -r '$s/([^ ]*)( )([^ ]*)( )(..).*$/total1:\1\2total:\3\4\5end/'
周一今天给大家分享shell脚本多实例部署nginx的详细教程文章通过实例代码脚本给大家详细介绍对大家的学习或工作具有一定的参考借鉴价值需要的朋友参考下吧
sed或 awk处理文件最后一行的实现方法
有如下的文本: abcd 1234 fds 2011 550 1023 832er 1231
要求处理后如下所示: abcd 1234 fds 2011 550 total1:1023 total2:832er 12end
abcd 1234 fd:832er 12end
awk:
复制代码 代码如下:
awk 'NR>1{print a}{a=$0}END{$1="total1:"$1;$2="total2:"$2;print gensub(/..$/,"end",$0)}' file awk 'BEGIN{getline a}{print a;a=$0}END{$1="total1:"$1;$2="total2:"$2;$3=gensub(/..$/,"end",1,$3);print}' awk '{if(!getline line){print "total1:"$1" total2:"$2" "gensub(/..$/,"end",1,$3)}else{print line?$0 RS line:$0}}'
linuxsedawk命令详解
linuxsedawk命令详解Sed⽤法sed是⼀个很好地⽂件处理⼯具,本⾝是⼀个管道命令,主要是以⾏为单位进⾏处理,可以将数据进项替换,删除,新增,选取等特定⼯作,下⾯先了解⼀下sed的⽤法。
sed的命令⾏格式为:sed [-nefri] 'command' 输⼊⽂本 常⽤选项:常⽤选项:-n∶使⽤安静(silent)模式。
在⼀般 sed 的⽤法中,所有来⾃ STDIN的资料⼀般都会被列出到萤幕上。
但如果加上 -n 参数后,则只有经过sed 特殊处理的那⼀⾏(或者动作)才会被列出来。
-e∶直接在指令列模式上进⾏ sed 的动作编辑;-f∶直接将 sed 的动作写在⼀个档案内, -f filename 则可以执⾏ filename 内的sed 动作;-r∶sed 的动作⽀援的是延伸型正规表⽰法的语法。
(预设是基础正规表⽰法语法)-i∶直接修改读取的档案内容,⽽不是由萤幕输出。
常⽤命令:a ∶新增, a 的后⾯可以接字串,⽽这些字串会在新的⼀⾏出现(⽬前的下⼀⾏)~c ∶取代, c 的后⾯可以接字串,这些字串可以取代 n1,n2 之间的⾏!d ∶删除,因为是删除啊,所以 d 后⾯通常不接任何咚咚;i ∶插⼊, i 的后⾯可以接字串,⽽这些字串会在新的⼀⾏出现(⽬前的上⼀⾏);p ∶列印,亦即将某个选择的资料印出。
通常 p 会与参数 sed -n ⼀起运作~s ∶取代,可以直接进⾏取代的⼯作哩!通常这个 s 的动作可以搭配正则表⽰法!例如 1,20s/old/new/g 就是啦!awk⽤法awk '{pattern +action}' {filenames} 尽管操作可能会很复杂,但语法总是这样,其中pattern表⽰AWK在数据中查找的内容,⽽action是在找到匹配内容是所执⾏的⼀系列命令。
花括号({})不需要再成勋中始终出现,但他们⽤于根据特定的模式对⼀系列指令进⾏分组。
《SED单行脚本快速参考》的+awk+实现
gsed '0~5G'
# 只对 GNU sed 有效
sed 'n;n;n;n;G;'
# 其他 sed
awk '{print $0;i++;if(i==5){printf("\n");i=0}}'
选择性地显示特定行: ——–
《SED 单行脚本快速参考》的 awk 实现
sed 和各的特色,本文并不是要做什么对比,而是权当好玩, 把《SED 单行脚本快速参考》这文章,用 awk 做了一遍~ 至于孰好孰坏,那真是很难评论了。一般来说,sed 的命令会更短小一些,同时也更难读懂;而 awk 稍 微长点,但是 if、while 这样的,逻辑性比较强,更加像“程序”。到底喜欢用哪个,就让各位看官自己决 定吧! PS: 貌似这个配色,单行的代码多了以后,拖动的时候会有点眼花的感觉,将就下吧,呵呵。
# 以 79 个字符为宽度,将所有文本右对齐 # 78 个字符外加最后的一个空格
sed -e :a -e 's/^.\{1,78\}$/ &/;ta' awk '{printf("%79s\n",$0)}'
# 以 79 个字符为宽度,使所有文本居中。在方法 1 中,为了让文本居中每一行的前 # 头和后头都填充了空格。 在方法 2 中,在居中文本的过程中只在文本的前面填充 # 空格,并且最终这些空格将有一半会被删除。此外每一行的后头并未填充空格。
编号: ——–
# 为文件中的每一行进行编号(简单的左对齐方式)。这里使用了“制表符” # (tab,见本文末尾关于’\t’的用法的描述)而不是空格来对齐边缘。 sed = filename | sed 'N;s/\n/\t/' awk '{i++;printf("%d\t%s\n",i,$0)}'
高级字符串处理技巧使用sed和awk进行字符串替换和处理
高级字符串处理技巧使用sed和awk进行字符串替换和处理在计算机编程中,字符串处理是一项非常重要的技能,而使用sed 和awk工具可以帮助我们更加高效和灵活地处理字符串。
本文将介绍sed和awk的基本用法以及一些高级的字符串处理技巧。
一、sed工具sed(Stream Editor)是一个流编辑器,能够对文本进行一行一行的处理,常用于替换、删除、插入字符串等操作。
1. 替换字符串sed命令的替换字符串功能非常强大,格式为:```sed 's/要替换的字符串/新的字符串/g' 文件名```其中,`s`代表substitute,字符串被替换的标志是`/`,`g`表示进行全局替换。
例如,我们要将文件file.txt中的所有"apple"替换为"orange",可以使用以下sed命令:```sed 's/apple/orange/g' file.txt```2. 删除特定行sed还可以删除文件中的特定行,常用的命令是`d`,例如:```sed '2d' file.txt```上述命令将删除文件file.txt中的第二行。
3. 插入字符串sed可以在文件的某一行前或某一行后插入字符串,分别使用命令`i`和`a`。
例如:```sed '2i\This is a new line' file.txt```上述命令将在文件file.txt的第二行前插入"This is a new line"。
二、awk工具awk是一种强大的文本处理工具,它可以用于查找、提取和处理文件中的数据。
它将文件按行分割成字段,通过指定的条件和操作来处理这些字段。
1. 提取特定字段awk默认将每一行的字段分割成为$1、$2、$3...,我们可以使用这些变量来提取特定字段。
例如,提取文件file.txt中的第一列可以使用以下命令:```awk '{print $1}' file.txt```2. 使用条件进行处理awk可以根据条件来处理数据,其中,使用`pattern { action }`的格式。
Linux命令awk,sed使用
Linux命令awk,sed使⽤写在前⾯perl-oneliner诅咒:即如果你相对熟练perl-oneliner的撰写之后,你就学不会awk和sed. -- CJ以下全⽂转载,点击阅读原⽂,可见Balloon_vine简书awk 命令使⽤记录awk 'BEGIN{Cnt=0}{if($0~/>/){Cnt=Cnt+1;tmp=">TriUnigene"Cnt; $0=tmp; print$0}else{print$0}}' file.fasta# ID修改前>TRINITY_DN8_c0_g1_i1 len=239 path=[0:0-238]>TRINITY_DN78_c0_g1_i1 len=417 path=[0:0-416]>TRINITY_DN53_c0_g1_i1 len=203 path= [0:0-202]# ID修改后, 即使fasta⽂件序列有多⾏也可以使⽤>TriUnigene1>TriUnigene2>TriUnigene3若后续只需要⽤到序列,不需要ID的信息,就可以把ID信息完全修改掉例2:简化fa sta序列名字awk '{if($0~/>/){sub(/\..*/, "", $0); print$0}else{print$0}}' file.fastaID 修改前后对⽐# 修改前>Lycv20126160-mRNA-1.mrna1 gene=Lycv20126160-mRNA-1>Lycv20064330-mRNA-1.mrna1 gene=Lycv20064330-mRNA-1>Lycv20064340-mRNA-1.mrna1 gene=Lycv20064340-mRNA-1# 修改后>Lycv20126160-mRNA-1>Lycv20064330-mRNA-1>Lycv20064340-mRNA-1例3,修改染⾊体名字,并保持染⾊体两位数字修改fasta序列ID,ID加1同时字符部分替换为Chr,并保持两位数值grep ">" Litchi_BMerged2A.genome.fna | awk '{if($0~/>/){split($0,a,"group");b=a[2]+1;if(length(b)<2) {c="0"b}else{c=b};ID=">Chr"c;print ID}else{print$0}}'>Bmerged2A_group0>Chr01>Bmerged2A_group10 >Chr11>Bmerged2A_group11 >Chr12>Bmerged2A_group12>Chr13>Bmerged2A_group13 >Chr14>Bmerged2A_group14 >Chr15>Bmerged2A_group1>Chr02>Bmerged2A_group2 >Chr03>Bmerged2A_group3 >Chr04>Bmerged2A_group4>Chr05>Bmerged2A_group5 >Chr06>Bmerged2A_group6 >Chr07>Bmerged2A_group7>Chr08>Bmerged2A_group8 >Chr09>Bmerged2A_group9 >Chr10其他以下是其他⼀些情况的修改记录(笔者⾃⼰需要⽽写)使⽤a w k内置函数gsub将 >Bradi1g47160.1.v3.1 替换为 >Bradi1g47160.1awk '{if($0~/>/){gsub(/\.v3\.1/,"",$0);print$0}else{print$0}}'Brachypodium_distachyon.genome.modID.promoter⼤⼩写转换,将>Glyma.01G073300.1.Wm82.a2.v1 + Up_Stream_Len 2500转为>Glyma01g073300.1awk '{if($0~/>/){gsub(/\.Wm82\.a2\.v1.*/,"",$0);split($0,a,".");a[2]=tolower(a[2]);$0=a[1]a[2]"."a[3];print$0}else{print$0}}'使⽤awk内置s p lit函数,⽤来分隔字符time="AB:12:ab"out=`echo $time | awk '{split($0,a,":");print a[1],a[2],a[3]}'`echo $outprint打印中,以点号","间隔表⽰以输出分隔符(可以通过OFS指定)打印,以空格符号" "表⽰不以分隔符打印awk 数组模式,⼀、保留某字符特定前⼏⾏,命令表⽰只读取第⼀个字段第⼀次出现的⾏。
Linux命令高级技巧使用sed和awk命令进行复杂文本处理和转换
Linux命令高级技巧使用sed和awk命令进行复杂文本处理和转换在Linux系统中,命令行是进行各种操作和处理的主要工具之一。
而sed和awk命令是两个强大的文本处理工具,它们可以帮助我们高效地进行复杂文本的处理和转换。
本文将介绍如何使用sed和awk命令进行高级技巧的应用。
一、sed命令的高级技巧sed是一种流式编辑器,可以对文本进行按行操作。
它支持正则表达式,可以实现复杂的文本搜索、替换和处理。
下面是几个sed命令的高级技巧示例:1. 替换文本中的字符串sed 's/old/new/' filename上述命令将filename文件中的所有"old"字符串替换为"new"字符串。
如果要替换所有匹配项而不仅仅是第一个,可以使用"g"选项:sed 's/old/new/g' filename2. 只处理匹配的行sed '/pattern/ s/old/new/g' filename上述命令将在匹配"pattern"的行上进行字符串替换操作。
3. 删除指定行sed '3d' filename上述命令将删除filename文件中的第3行。
4. 根据行号范围操作sed '2,4d' filename上述命令将删除filename文件中的第2行至第4行。
二、awk命令的高级技巧awk是一种强大的文本处理工具,它能够以列为单位对文本进行处理。
awk的主要特点是可以定义变量、数组和函数,以及支持分隔符和条件表达式。
下面是几个awk命令的高级技巧示例:1. 按列进行处理awk '{print $1}' filename上述命令将打印filename文件的第一列。
2. 判断特定条件并处理awk '{if($1>10) print $0}' filename上述命令将打印filename文件中第一列大于10的行。
sed_awk
选项
-n 静默模式 -r 支持扩展正则
-e 可以一下处理多个脚本
模式匹配定界
删除 fatab 中 / 开头的行
sed 从外界脚本读入
选项
-f 读入脚本 sed -f sedscript /etc/grub.conf
命令
= 显示行号 可以打印符合行的行号
练习
删除文件每行的第一个字符 删除文件每行的第二个字符 删除文件每行的最后一个字符 删除文件每行的倒数第二个字符 删除文件每行的第二个单词 删除文件每行的倒数第二个单词 删除文件每行的最后一个单词 交换每行的第一个字符和第二个字符 交换每行的第一个字符和第二个单词
交换没行的第一个单词和最后一个单词
awk 也是一行一行读取 选项
-F 指定分隔符 和 cut -d: 一样
awk 内置变量
NF: 记录每一行的字段数 NR: 每处理一行,NR值加1
变量:
FS:输入字段分隔符,默认为空格 awk -v FS=: OFS: 输出的段分隔符,默认为空格 awk -v OFS=:
sed and awk
正则回顾
元字符:字符不表示其字面意义,而用于表示通配或控制功能 分两类:
基本正则表达式:BRE
匹配字符: . []
个数匹配: * \? 锚定符: \< 分组:\(\) \>
[^]
\{m,n\} ^ $ ^$ .*
\1 \2
扩展正则表达式:ERE
awk -F: „$1 ~ /^root/{print $3,$4,$NF}‟ /etc/passwd
awk 模式类型
正则表达式,格式为 /re expression/
Mac命令行数据处理技巧使用AWK和SED进行文本处理
Mac命令行数据处理技巧使用AWK和SED进行文本处理在使用Mac命令行进行数据处理时,AWK和SED是两个非常强大和常用的工具。
它们可以帮助我们快速有效地处理文本数据,提取需要的信息,并对数据进行格式化和转换。
本文将介绍AWK和SED的基本用法和常见技巧,以帮助读者更好地利用这两个工具进行文本处理。
一、AWK的基本用法AWK是一种用于处理和分析文本数据的编程语言。
它提供了强大的文本处理能力,并且非常灵活易用。
下面是AWK的基本用法及常见技巧:1. 提取指定列的数据使用AWK我们可以轻松地提取指定列的数据。
例如,如果我们有一个csv文件,其中包含姓名、年龄和性别信息,我们可以使用以下命令提取出姓名列的数据:```awk -F ',' '{print $1}' file.csv```上述命令中,-F参数指定了字段分隔符为逗号(,),而$1表示第一个列。
通过这个命令,我们可以打印出csv文件中所有行的第一列数据。
2. 利用条件过滤数据AWK还可以根据条件过滤数据。
例如,我们可以使用以下命令过滤出年龄大于等于18岁的人的数据:```awk -F ',' '$2 >= 18 {print $0}' file.csv```上述命令中,$2表示第二列,$0表示整行数据。
通过这个命令,我们可以打印出csv文件中所有年龄大于等于18岁的人的数据。
3. 计算列的和、平均值等统计信息使用AWK,我们可以很方便地计算列的和、平均值等统计信息。
例如,我们可以使用以下命令计算csv文件中年龄列的平均值:```awk -F ',' '{sum += $2; count++} END {print sum/count}' file.csv```上述命令中,sum和count是AWK的变量,分别用于累加和计数。
通过这个命令,我们可以打印出csv文件中年龄列的平均值。
使用awk和sed的组合技巧Linux命令高级文本处理
使用awk和sed的组合技巧Linux命令高级文本处理在Linux系统中,awk和sed是两个非常强大的命令行工具,它们可以用来处理文本文件,提取数据,进行搜索替换等操作。
本文将介绍一些使用awk和sed的组合技巧,帮助你更好地进行高级文本处理。
1. 使用awk进行字段提取和处理awk是一个强大的文本处理工具,可以根据字段来进行数据提取和处理。
下面是一些常用的awk命令和技巧:- 提取指定字段:使用awk '{print $n}'命令可以提取每一行的第n个字段。
例如,要提取第2个字段,可以使用awk '{print $2}' filename命令。
- 计算字段和:使用awk '{sum+=$1} END {print sum}'命令可以计算所有行的第一个字段的和。
例如,要计算文件中第一列的总和,可以使用awk '{sum+=$1} END {print sum}' filename命令。
- 根据指定条件过滤行:使用awk '/pattern/'命令可以根据指定的模式来过滤行。
例如,要显示包含特定关键词的行,可以使用awk'/keyword/' filename命令。
2. 使用sed进行文本替换和编辑sed是一个流式文本编辑器,可以进行全局搜索和替换操作。
下面是一些常用的sed命令和技巧:- 替换文本:使用sed 's/old/new/'命令可以将文本中的某个字符串替换为新的字符串。
例如,要将文件中的"foo"替换为"bar",可以使用sed 's/foo/bar/' filename命令。
- 删除行:使用sed '/pattern/d'命令可以删除匹配指定模式的行。
例如,要删除包含关键词的行,可以使用sed '/keyword/d' filename命令。
Linux命令高级技巧如何使用xargs与awk和sed命令配合使用
Linux命令高级技巧如何使用xargs与awk和sed命令配合使用在Linux系统中,xargs、awk和sed是一些非常有用的命令工具,它们可以帮助我们处理和操作文本数据。
本文将介绍如何使用xargs与awk和sed命令配合使用的高级技巧。
一、xargs命令简介xargs命令用于从标准输入读取数据,并将其作为参数传递给其他命令。
它能够解决一次命令无法处理过多参数的问题。
xargs可以将输入数据划分成合适的块大小,并将每块数据作为命令的参数传递。
二、awk命令简介awk是一种强大的文本分析工具,可以帮助我们处理结构化的文本数据。
它可以根据指定的规则逐行扫描文件,并对每一行执行相应的操作。
awk命令通常用于数据提取、过滤、格式化和转换等操作。
三、sed命令简介sed是一种流编辑器,用于对文本进行编辑和转换。
它可以实现对文件内容的增删改查操作,并支持使用正则表达式进行模式匹配和替换。
sed命令通常与管道命令结合使用,用于对输入文本进行实时编辑。
四、xargs与awk命令的配合使用1. 使用xargs将标准输入传递给awk命令:```$cat data.txt | xargs awk '{print $1}'```上述命令将读取data.txt文件的内容,并将每一行作为参数传递给awk命令。
awk命令将打印每行的第一个字段。
2. 使用xargs将标准输入传递给awk命令,并使用{}占位符表示参数:```$cat data.txt | xargs -I {} awk '{print "Hello", "{}"}'```上述命令将读取data.txt文件的内容,并将每一行作为参数传递给awk命令。
{}占位符表示参数的位置,输出结果为每行加上"Hello"前缀。
五、xargs与sed命令的配合使用1. 使用xargs将标准输入传递给sed命令:```$cat data.txt | xargs -I {} sed -i 's/old/new/g' {}```上述命令将读取data.txt文件的内容,并将每一行作为参数传递给sed命令。
文本三剑客(sed、awk、grep)用法
⽂本三剑客(sed、awk、grep)⽤法简述awk、grep、sed是linux操作⽂本的三⼤利器,合称⽂本三剑客,三者的功能都是处理⽂本,但侧重点各不相同,其中属awk功能最强⼤,但也最复杂。
grep更适合单纯的查找或匹配⽂本,sed更适合编辑匹配到的⽂本,awk更适合格式化⽂本,对⽂本进⾏较复杂格式处理。
grepgrep (Global Regular Expression Print)⽤于搜索/过滤特定字符,可以使⽤正则表达式通过返回⼀个状态值来说明,如果模板搜索成功,返回0,不成功,返回1,⽂件不存在,返回2;可以利⽤返回值进⾏⾃动化的⽂本处理⼯作。
egrep = grep -E:扩展的正则表达式(除了< , > , \b 使⽤其他正则都可以去掉\)#输出file中含有hello字符串的⾏的数量grep -c "hello" file#输出file中含有hello的数量grep -o "hello" file | wc -l#递归查找指定⽂件或⽬录中含有hello的⾏,并输出;grep -r "hello" /etc#查找含有hello或者world的⾏;grep -e "hello" -e "world" file#搜索src⽬录中.c和.cpp⽂件中含有main的⾏;grep -r "main" ./src --include *.{c,cpp}#搜索src⽬录中含有main的⾏,但不搜索abc⽂件;grep -r "main" ./src --exclude "abc"#搜索src⽬录中含有main的⾏,但不搜索.git⽂件夹;grep -r "main" ./src --exclude-dir ".git"#删除含有hello字符串的⽂件grep -r "hello" ./src -lZ | xargs -0 rm -f#将file中含有root的⾏取出grep root fileorcat file | grep root#将没有root的⾏取出grep -v root /home/file#将没有出现root和nologin的⾏取出grep -v root /etc/passwd | grep -v nologin#在当前⽬录查找带有’hello‘⾏的⽂件grep 'hello' *#在当前⽬录及⼦⽬录下搜索’hello‘⾏的⽂件,但不显⽰匹配的⾏,显⽰匹配的⽂件;grep -i -r 'hello' *#过滤注释⾏和空⾏grep -Ev "^$|[#;]" file1#在⽂件'file1'⾥查找"str"grep str /home/file1#在'home'⽬录和⼦⽬录的⽂件中查找"str"grep str -r /home/*awkawk是⼀种编程语⾔,⽤于在linux/unix下对⽂本和数据进⾏处理。
awk单行脚本快速参考实例教程
用法:Unix: awk '/pattern/ {print "$1"}' # 标准Unix shell环境DOS/Win: awk '/pattern/ {print "$1"}' # DJGPP 可编译通过awk "/pattern/ {print "$1"}" # GnuWin32,UnxUtils,Mingw环境需要特别注意的是,DJGPP编译器可以允许awk脚本使用Unix的引号语法'/like/ {"this"}'。
但是,用户必须知道在DOS/Windows环境下,使用CMD.EXE或者程序的话,单引号并不能保护重定向符号(<, >)和管道(|)。
如果使用双引号的话,在DOS/CMD命令解释器下的特殊符号和他们的特殊含义都会被忽略。
如果你的命令提示符是bash、ksh或者其他的Unix终端,单引号和双引号会沿用Unix标准的用法。
同样,DOS/Win用户必须记住用,百分号(%)用来标记DOS/Win环境变量,如果想要在awk使用的话,需要使用双百分号(%%)来表示一个百分号%。
如果我能确定一个脚本不需要被指出是使用在Unix, DOS或者CMD环境下,我通常会省略引号。
如果一个例子是GNU awk所特有的,将会用'gawk'命令来代替。
如果你发现错误或者新的命令想要添加到这个列表里(总长度控制在65个字符一下),请通知我。
首先我经常会尝试去写一个最短字符的脚本。
为了省空间,我通常使用'1'来代替'{print}'去打印每行,两种写法都能正确运行。
文本间隔:# 每行后面增加一行空行awk '1;{print ""}'awk 'BEGIN{ORS="nn"};1'# 每行后面增加一行空行。
高级文件操作技巧使用awk和sed命令进行文本替换和修改
高级文件操作技巧使用awk和sed命令进行文本替换和修改在操作文本文件时,经常需要对文本进行替换和修改。
awk和sed 是两个在Unix和类Unix系统中广泛使用的命令行工具,它们提供了强大的文本处理能力,特别是在批量替换和修改文本方面。
本文将介绍如何使用awk和sed命令进行文本替换和修改的高级技巧。
1. 使用awk命令进行文本替换和修改awk是一种强大的文本分析工具。
它按行读取文本文件,并按照指定的规则进行处理。
我们可以使用awk命令进行文本的替换和修改。
首先,我们需要了解awk命令的一些基本用法。
awk命令的基本语法如下:```shellawk 'pattern { action }' file```其中,pattern是一个正则表达式,用于匹配文本中的某些行。
action是一个用于处理匹配行的操作,可以是打印、替换、修改等。
下面是一些常见的awk命令示例:1.1 替换文本中的字符串假设我们有一个文本文件example.txt,内容如下:Hello, World!This is an example.```我们可以使用awk命令将其中的"example"替换为"sample",并将结果输出到标准输出:```shellawk '{ sub("example", "sample"); print }' example.txt```运行以上命令后,输出结果如下:```Hello, World!This is an sample.```1.2 修改文本中的某些行有时候,我们需要根据某些条件对文本中的特定行进行修改。
可以通过在awk命令中加入判断条件来实现。
假设我们有一个文本文件numbers.txt,内容如下:```2345```我们可以使用awk命令将其中的偶数行乘以2,奇数行保持不变,并将结果输出到标准输出:```shellawk '{ if (NR%2==0) { print $0*2 } else { print } }' numbers.txt```运行以上命令后,输出结果如下:```14385```2. 使用sed命令进行文本替换和修改sed是另一个强大的文本处理工具。
sed与awk用法对比总结
命令格式:sed [选项] ‘定址操作’文件# ’定址操作’合称’命令’(command)awk [选项] ‘pattern {action}’文件简单的多操作格式:sed [选项] ‘定址操作; 操作’# 第2个操作对所有输入行都执行awk [选项] ‘pattern {action; action}’嵌套格式:sed [选项] ‘定址{定址操作}’awk [选项] ‘pattern {if() 执行语句}’# if()的执行语句如果超过一句就要用{}括起来sed 重点:1.正则表达式分隔符,默认是斜杠/,若要改变,如c,则只要在这个字符前加一个反斜杠\ +正则+c,例子:sed -n '\cREcp' filename 等同于sed -n '/RE/p' filename好处:c顶替斜杠成为分隔符,便于在正则表达式中包含斜杠(无需转义)。
3.定址可以是:数字(代表行数,$表示最后一行)、正则表达式或2者的结合4.sed的一层命令里只能有一个定址,如果嵌套了一层命令,则又有了一个定址。
5.sed里有模式空间(pattern space)和暂存缓冲区6.无论sed命令位于bash交互模式还是sed脚本里,对空格都不用转义(也可以转义),如:s/ /X/g 等同于s/\ /X/g 都是将空格转为X7.-n选项的man解释:If auto-print is not disabled, print the pattern spacebel功能很好很强大,主要配合N命令进行操作9.sed里定址和操作都可以用正则10.行处理时,sed工作原理(不考虑暂存缓冲区与N、n等命令):a)从标准输入或文件中读入一行,存入模式空间(pattern space)中,存的时候不存\nb)sed依据命令对其进行处理c)将处理完的打印出来,并在末尾加上\n,shell遇到\n就自动换行使用N的时候情况如下:a)从标准输入或文件中读入一行,存入模式空间(pattern space)中,存的时候不存\nb)sed依据命令对其进行处理,遇到N命令时,在模式空间的末尾加上\n,然后将下一行读入进来,追加在刚添加的\n后面,此时模式空间的末尾依然没有\n(至始至终就不会有)c)将处理完的打印出来,shell遇到\n时候就自动换行,并在末尾加上\n11. 详细笔记(未整理)awk 重点:1.UNIX.Shell 6.1 第3段的第2行(如果只……)很重要!awk '//' names 只给出模式,而未指定动作awk '{print $0}' names 只指定动作,而未定义模式以上2种输出结果一样= cat names2.“模式表达式中暗含着if语句。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
# 以79个字符为宽度,将所有文本右对齐
# 78个字符外加最后的一个空格
sed -e :a -e 's/^.\{1,78\}$/ &/;ta'
awk '{printf("%79s\n",$0)}'
# 以79个字符为宽度,使所有文本居中。在方法1中,为了让文本居中每一行的前
awk '{sub(/^[ \t]+/,"");print $0}'
# 将每一行拖尾的“空白字符”(空格,制表符)删除
sed 's/[ \t]*$//' # 见本文末尾关于'\t'用法的描述
awk '{sub(/[ \t]+$/,"");print $0}'
# 如果当前行以反斜杠“\”结束,则将下一行并到当前行末尾
# 并去掉原来行尾的反斜杠
sed -e :a -e '/\\$/N; s/\\\n//; ta'
awk '{if(/\\$/)printf("%s",substr($0,0,length($0)-1));else printf("%s\n",$0)}'
tr -d \r <infile >outfile # GNU tr 1.22 或更高版本
DOS环境的略过
# 将每一行前导的“空白字符”(空格,制表符)删除
# 使之左对齐
sed 's/^[ \t]*//' # 见本文末尾关于'\t'用法的描述
# sed可以通过其特有的“–text”选项。你可以使用帮助选项(“–help”)看
# 其中有无一个“–text”项以此来判断所使用的是否是UnxUtils版本。其它DOS
# 版本的的sed则无法进行这一转换。但可以用“tr”来实现这一转换。
sed "s/\r//" infile >outfile # UnxUtils sed v4.0.7 或更高版本
# 如果当前行以等号开头,将当前行并到上一行末尾
# 并以单个空格代替原来行头的“=”
sed -e :a -e '$!N;s/\n=/ /;ta' -e 'P;D'
awk '{if(/^=/)printf(" %s",substr($0,2));else printf("%s%s",a,$0);a="\n"}END{printf("\n")}'
awk '{for(i=0;i<39-length($0)/2;i++)printf(" ");printf("%s\n",$0)}' #相当于上面的方法二
# 在每一行中查找字串“foo”,并将找到的“foo”替换为“bar”
sed 's/foo/bar/' # 只替换每一行中的第一个“foo”字串
# 计算行数 (模拟 “wc -l”)
sed -n '$='
awk '{i++}END{print i}'
文本转换和替代:
# Unix环境:转换DOS的新行符(CR/LF)为Unix格式。
sed 's/.$//' # 假设所有行以CR/LF结束
sed 's/foo/bar/4' # 只替换每一行中的第四个“foo”字串
sed 's/foo/bar/g' # 将每一行中的所有“foo”都换成“bar”
sed 's/\(.*\)foo\(.*foo\)/\1bar\2/' # 替换倒数第二个“foo”
《SED 单行脚本快速参考》的 awk 实现
文本间隔:
# 在每一行后面增加一空行
sed G
awk '{printf("%s\n\n",$0)}'
# 将原来的所有空行删除并在每一行后面增加一空行。
# 这样在输出的文本中每一行后面将有且只有一空行。
sed '/^$/d;G'
awk '!/^$/{printf("%s\n\n",$0)}'
awk '{gsub(/scarlet|ruby|puce/,"red");print $0}'
# 倒置所有行,第一行成为最后一行,依次类推(模拟“tac”)。
# 由于某些原因,使用下面命令时HHsed v1.5会将文件中的空行删除
sed '1!G;h;$!d' # 方法1
# 在每一行后面增加两行空行
sed 'G;G'
awk '{printf("%s\n\n\n",$0)}'
# 将第一个脚本所产生的所有空行删除(即删除所有偶数行)
sed 'n;d'
awk '{f=!f;if(f)print $0}'
# 在匹配式样“regex”的行之前插入一空行
# 头和后头都填充了空格。 在方法2中,在居中文本的过程中只在文本的前面填充
# 空格,并且最终这些空格将有一半会被删除。此外每一行的后头并未填充空格。
sed -e :a -e 's/^.\{1,77\}$/ & /;ta' # 方法1
sed -e :a -e 's/^.\{1,77\}$/ &/;ta' -e 's/\( *\)\1/\1/' # 方法2
sed 's/\(.*\)foo/\1bar/' # 替换最后一个“foo”
awk '{gsub(/foo/,"bar");print $0}' # 将每一行中的所有“foo”都换成“bar”
# 只在行中出现字串“baz”的情况下将“foo”替换成“bar”
sed '/baz/s/foo/bar/g'
# 将每一行中的前导和拖尾的空白字符删除
sed 's/^[ \t]*//;s/[ \t]*$//'
awk '{sub(/^[ \t]+/,"");sub(/[ \t]+$/,"");print $0}'
# 在每一行开头处插入5个空格(使全文向右移动5个字符的位置)
sed 's/^/,搞的比较狼狈,呵呵。
awk '{while(match($0,/[0-9][0-9][0-9][0-9]+/)){$0=sprintf("%s,%s",substr($0,0,RSTART+RLENGTH-4),substr($0,RSTART+RLENGTH-3))}print $0}'
# 为数字字串增加逗号分隔符号,将“1234567”改为“1,234,567”
gsed ':a;s/\B[0-9]\{3\}\>/,&/;ta' # GNU sed
sed -e :a -e 's/\(.*[0-9]\)\([0-9]\{3\}\)/\1,\2/;ta' # 其他sed
awk '{if(/baz/)gsub(/foo/,"bar");print $0}'
# 将“foo”替换成“bar”,并且只在行中未出现字串“baz”的情况下替换
sed '/baz/!s/foo/bar/g'
awk '{if(/baz$/)gsub(/foo/,"bar");print $0}'
sed 's/^M$//' # 在bash/tcsh中,将按Ctrl-M改为按Ctrl-V
sed 's/\x0D$//' # ssed、gsed 3.02.80,及更高版本
awk '{sub(/\x0D$/,"");print $0}'
# 不管是“scarlet”“ruby”还是“puce”,一律换成“red”
sed 's/scarlet/red/g;s/ruby/red/g;s/puce/red/g' #对多数的sed都有效
gsed 's/scarlet\|ruby\|puce/red/g' # 只对GNU sed有效
# 为带有小数点和负号的数值增加逗号分隔符(GNU sed)
gsed -r ':a;s/(^|[^0-9.])([0-9]+)([0-9]{3})/\1\2,\3/g;ta'
#和上例差不多
awk '{while(match($0,/[^\.0-9][0-9][0-9][0-9][0-9]+/)){$0=sprintf("%s,%s",substr($0,0,RSTART+RLENGTH-4),substr($0,RSTART+RLENGTH-3))}print $0}'
# (tab,见本文末尾关于’\t’的用法的描述)而不是空格来对齐边缘。
sed = filename | sed 'N;s/\n/\t/'