169it科技资讯


当前位置:  操作系统/服务器>linux

awk中RS、ORS、FS、OFS的区别和联系小结

    来源: 互联网  发布时间:2014-10-17

学习awk时,一定要记得动手去实践,只有在实践中才能发现问题,以下就我在学习中和实践中的经验,总结一下RS,ORS,FS,OFS的区别和联系。

一,RS与ORS

1,RS是记录分隔符,默认的分隔符是\n,具体用法看下

代码如下:

[root@krlcgcms01 mytest]# cat test1     //测试文件
 111 222
 333 444
 555 666

2,RS默认分割符\n

代码如下:

[root@krlcgcms01 mytest]# awk '{print $0}' test1  //awk 'BEGIN{RS="\n"}{print $0}' test1 这二个是一样的
111 222
333 444
555 666

其实你可以把上面test1文件里的内容理解为,111 222\n333 444\n555 6666,利用\n进行分割。看下一个例子

3,自定义RS分割符

代码如下:

[zhangy@localhost test]$ echo "111 222|333 444|555 666"|awk 'BEGIN{RS="|"}{print $0,RT}'
 111 222 |
 333 444 |
 555 666

结合上面一个例子,就很容易理解RS的用法了。

4,RS也可能是正则表达式

代码如下:

[zhangy@localhost test]$ echo "111 222a333 444b555 666"|awk 'BEGIN{RS="[a-z]+"}{print $1,RS,RT}'
 111 [a-z]+ a
 333 [a-z]+ b
 555 [a-z]+

从例3和例4,我们可以发现一点,当RT是利用RS匹配出来的内容。如果RS是某个固定的值时,RT就是RS的内容。

5,RS为空时

代码如下:

[zhangy@localhost test]$ cat -n test2
 1  111 222
 2
 3  333 444
 4  333 444
 5
 6
 7  555 666
[zhangy@localhost test]$ awk 'BEGIN{RS=""}{print $0}' test2
111 222
333 444
333 444
555 666
[zhangy@localhost test]$ awk 'BEGIN{RS="";}{print "<",$0,">"}' test2  //这个例子看着比较明显
< 111 222 >
< 333 444     //这一行和下面一行,是一行
333 444 >
< 555 666 >

从这个例子,可以看出当RS为空时,awk会自动以多行来做为分割符。

6,ORS记录输出分符符,默认值是\n

把ORS理解成RS反过程,这样更容易记忆和理解,看下面的例子。

代码如下:

[zhangy@localhost test]$ awk 'BEGIN{ORS="\n"}{print $0}' test1  //awk '{print $0}' test1二者是一样的
111 222
333 444
555 666
[zhangy@localhost test]$ awk 'BEGIN{ORS="|"}{print $0}' test1
111 222|333 444|555 666|

二,FS与OFS

1,FS指定列分割符

代码如下:

[zhangy@localhost test]$ echo "111|222|333"|awk '{print $1}'
 111|222|333
[zhangy@localhost test]$ echo "111|222|333"|awk 'BEGIN{FS="|"}{print $1}'
 111

2,FS也可以用正则

代码如下:

[zhangy@localhost test]$ echo "111||222|333"|awk 'BEGIN{FS="[|]+"}{print $1}'
111

3,FS为空的时候

代码如下:

[zhangy@localhost test]$ echo "111|222|333"|awk 'BEGIN{FS=""}{NF++;print $0}'
1 1 1 | 2 2 2 | 3 3 3

当FS为空的时候,awk会把一行中的每个字符,当成一列来处理。

4,RS被设定成非\n时,\n会成FS分割符中的一个

代码如下:

[zhangy@localhost test]$ cat test1
 111 222
 333 444
 555 666
[zhangy@localhost test]$ awk 'BEGIN{RS="444";}{print $2,$3}' test1
 222 333
 666

222和333之间是有一个\n的,当RS设定成444后,222和333被认定成同一行的二列了,其实按常规思想是二行的一列才对。

5,OFS列输出分隔符

代码如下:

[zhangy@localhost test]$ awk 'BEGIN{OFS="|";}{print $1,$2}' test1
 111|222
 333|444
 555|666
[zhangy@localhost test]$ awk 'BEGIN{OFS="|";}{print $1 OFS $2}' test1
 111|222
 333|444
 555|666

test1只有二列,如果100列,都写出来太麻烦了吧。

代码如下:

[zhangy@localhost test]$ awk 'BEGIN{OFS="|";}{print $0}' test1
 111 222
 333 444
 555 666
[zhangy@localhost test]$ awk 'BEGIN{OFS="|";}{NF=NF;print $0}' test1
 111|222
 333|444
 555|666

为什么第二种方法中的OFS生效呢?个人觉得,awk觉查到列有所变化时,就会让OFS生效,没变化直接输出了。


    
相关技术文章:
    ▪shell中的循环语句、判断语句实例

     shell的循环主要有3种,for,while,until shell的分支判断主要有2种,if,case 一,for循环 代码如下: #!/bin/bash for file in $(ls /tmp/test/mytest |grep sh)   //for in格式是shell for的基本格式,根js的for in类似 do               //循环开始你就把它当成{  echo $file done             //循环结束你就把它当成} for ((i=0;i<10;i++))        //注意是双小括号,由于受其他语言的影响,很容易搞错 do  echo -n $i done echo \     //输出换行 for i in 0 1 2 3 4 ......


    ▪awk实现Left、join查询、去除重复值以及局部变量讲解例子

     最近看到论坛里面有几个不错的小例子,对于学习awk还是有帮助,在这儿详细的说一下 一、类似数据库中的left join查询 代码如下: [root@krlcgcms01 mytest]# cat a.txt    //a.txt 111   aaa 222   bbb 333   cccc 444   ddd [root@krlcgcms01 mytest]# cat b.txt    //b.txt 111  123  456 2    abc  cbd 444  rts  786 要求输出结果是 111,aaa,123,456 444,ddd,rts,786 实现方法: 代码如下: ......


    ▪shell自定义函数的6个特点总结

     最近系统的学习了一下shell的函数,总体感觉根其他语言的函数差不多,不过它也有自身的特点 一,调用函数必须在定义函数的后,不然会报错的 代码如下: fun fun (){  echo "aaaaaa" } fun 返回结果如下: 代码如下: [root@krlcgcms01 mytest]# sh fun.sh  fun.sh: line 1: fun: command not found       //第一次调用fun是报错的,fun没有定义  aaaaaa                                       //......


 
最新技术文章:
    ▪linux系统中的列出敏感用户的脚本代码

     此处的敏感用户是指这个用户属于多个组,或者这个用户属于的组名跟这个用户名不一样 #! /bin/bash #list user who belong to more than one group #and list user who belong to the group which isn't the same as the username #w is whitelist,we will not think user in this whitelist is special or dangerous w=("root" "adm" "games" "operator" "halt" "shutdown" "sync" "daemon" "bin" "operator") function WhiteList() { for i in ${w[@]} do if [ "$i" == "$1" ];then return 1 fi done return 0 } IFS=" " for LINE in `cat /etc/passwd|awk -F: '{print $1}'` do WhiteList $LINE; #if $? equal 1,means i......


    ▪a10 config backup for aXAPI

     #!/bin/bash ################################################# # # script by Vincent yu # created at 20140306 # a10 config backup for aXAPI version: 2.1 # # ################################################# A10IP="1.1.1.1 1.1.1.2" USER=admin PASSWORD=a10 TODAY=`date "+%Y%m%d"` BACKUPDIR=/path/$TODAY TIMENOW=`date "+%Y%m%d%H%m"` LOG="/tmp/mail" MAILLIST="ng@ng.com.tw" for COUNT in $A10IP do METHOD1="method=authenticate&username=$USER&password=$PASSWORD" SESSION=`curl -k --data $METHOD1 https://$COUNT/services/rest/V2.1/ | sed -n -e 's/.*\(.*\)<\/session_id>.*/\1/p'` if [ ! -d $BACKUPDIR ];then mkdir -p $BACKUPDIR fi GETHOST_......


    ▪一键备份gitolite服务器的Shell脚本

     运行一次就能够把gitolite服务器上的仓库备份到本地. 第一次运行会创建远程仓库的本地镜像, 以后每次运行会把本地镜像更新. 本程序只支持 ssh方式 其他的git server貌似不会在 ssh git@xxx 的时候返回repo列表, 所以只能手动备份. #!/bin/sh server=serv_addr root_dir=`pwd` echo "whill back in dir: ${root_dir}" ssh "git@${server}" | awk '{print $1$2,$3}' | grep "^RW" | awk '{print $2}' | while read line do echo " " echo "-------------------------------------" if [ ! -d "${root_dir}/${line}.git" ]; then echo "repo not init on local, init it ..." mkdir -p "${root_dir}/${line}.git" ......


 


站内导航:


特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

©2012-2017,169IT.COM,E-mail:www_169it_com#163.com(请将#改为@)

浙ICP备11055608号