Chinaunix

标题: 询问一个关于awk的问题 [打印本页]

作者: contestjia    时间: 2014-10-14 00:19
标题: 询问一个关于awk的问题
我在linux的命令行中,使用awk的命令:awk '/(int){1,3}/ {print $1}' filename
我想找出文本filename文本行中,int至少出现一次,最多三次的行,可是没有显示结果。

filename中的文本如下:

size_t main(void){
       int   (*f)(int, int);
       int   int_var;
       char  char_var;
       return sizeof(int);
}
作者: yestreenstars    时间: 2014-10-14 08:58
awk --re-interval '/(int){1,3}/ {print $1}'
作者: 刺客阿地    时间: 2014-10-14 09:47
我是来学习的,每天学一点,进步一点。
作者: yestreenstars    时间: 2014-10-14 09:51
回复 3# 刺客阿地

你学了好久了,还不动手做做?
   
作者: 刺客阿地    时间: 2014-10-14 10:00
回复 3# 刺客阿地


    awk和sed做不出来呀,我还是在看的阶段,实际动手,还是写不出来咋办呢。
作者: jcdiy0601    时间: 2014-10-14 10:12
  1. awk --posix '/(int){1,3}/' test
复制代码

作者: Herowinter    时间: 2014-10-14 10:13
回复 1# contestjia

你这么写是达不到你的需求的:
int至少出现一次,最多三次的行...
  1. echo "int (*f)(int,int,int,int)"|awk --re-interval '/(int){1,3}/'
  2. int (*f)(int,int,int,int)
复制代码

作者: 这个冬天不冷    时间: 2014-10-14 10:13
回复 5# 刺客阿地
  1. [root@localhost ~]# awk '{n=split($0,a,"int");if(n>1&&n<=4)print $1}' file1
  2. int
  3. int
  4. return
  5. [root@localhost ~]# cat file1
  6. size_t main(void){
  7.         int   (*f)(int, int);
  8.         int   int_var;
  9.         char  char_var;
  10.         return sizeof(int);
  11. }
  12. [root@localhost ~]#
复制代码
去想,去认真的想,解决一个问题有好多思路
作者: 聆雨淋夜    时间: 2014-10-14 10:17
回复 1# contestjia
sed -nr '/(int){1,3}/p' 1.txt


   
作者: 聆雨淋夜    时间: 2014-10-14 10:22
回复 6# jcdiy0601
你的是对的,4楼的有问题


   
作者: amandaysu    时间: 2014-10-14 10:40
sed -n '/int\{1,3\}/p' file
作者: wiliiwin    时间: 2014-10-14 11:00
回复 10# 聆雨淋夜
他也不对的,连续4个int他这个照样输出
  1. awk --posix '/(int){1,3}/'  19.txt
  2.        int   (*f)(int, int);
  3.        int   int_var;
  4.        int  int  int  int;
  5.        return sizeof(int);
复制代码

作者: stupid_lee    时间: 2014-10-14 11:47
  1. awk -F"int" 'NF>=2&&NF<=4{print}' filename
复制代码

作者: jcdiy0601    时间: 2014-10-14 15:24
回复 12# wiliiwin


    嗯,的确不对
作者: louis0o0    时间: 2014-10-14 15:37
提供一种方法,用函数,不简洁,但可用~
  1. awk '{split($0,a,"int");if(length(a)==4)print $0}' test.txt
复制代码

作者: chengchow    时间: 2014-10-14 15:48
貌似我执行没问题啊
  1. gentoo ~ # awk '/(int){1,3}/{print}' 1
  2.     int   (*f)(int, int);
  3.     int   int_var;
  4.     return sizeof(int);
  5. gentoo ~ # cat 1
  6. size_t main(void){
  7.     int   (*f)(int, int);
  8.     int   int_var;
  9.     char  char_var;
  10.     return sizeof(int);
  11. }
复制代码

作者: contestjia    时间: 2014-10-14 17:16
回复 15# louis0o0


    谢谢,只是想试试正则表达式,你的方法也很好,毕竟解决问题的方法很多。
作者: contestjia    时间: 2014-10-14 17:18
回复 2# yestreenstars


    谢谢,这个标志有什么用啊~!
作者: contestjia    时间: 2014-10-14 17:22
回复 6# jcdiy0601


    谢谢,这个选项是有什么用了?加了posix是改变它的标准吗?
作者: yestreenstars    时间: 2014-10-14 18:01
回复 19# contestjia

       --re-interval
              Allow interval expressions in regular expressions, even if --traditional has been provided.

   
作者: aingwen    时间: 2014-10-14 18:02
回复 16# chengchow
如果有一行有4个或4以上个int ,这句也会被打印出来;楼主说的出现最多3次,你试下


   
作者: chengchow    时间: 2014-10-15 08:47
回复 22# aingwen
了解,理解错误
这个可以参考楼上的设置int为FS,打印NF<=3的行


   
作者: 李满满    时间: 2014-10-15 08:55
学生党:无聊~python试试

  1. $ cat yhsafe.py
  2. #!/usr/bin/env python
  3. # -*- coding:gbk -*-

  4. import sys,re
  5. for x in re.findall(r'.*int{1,3}.*',open(sys.argv[1]).read()):
  6.         print x
复制代码
测试:
$ ./yhsafe.py yhsafe.txt
        int   (*f)(int, int);
        int   int_var;
        return sizeof(int);




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2