Chinaunix

标题: 获取文件中满足条件的指定行 [打印本页]

作者: Pugna_zfr    时间: 2014-02-12 17:04
标题: 获取文件中满足条件的指定行
请教各位,
通过sar命令获取了一堆信息,但只需要从这些信息中过滤得到 标题行、倒数第二行、最后一行,如果通过shell实现?




作者: laliheyi    时间: 2014-02-12 17:13
回复 1# Pugna_zfr

获取第一行 最后两行?
  1. head -1 file && tail -2 file
复制代码

作者: 关阴月飞    时间: 2014-02-12 17:16
本帖最后由 关阴月飞 于 2014-02-12 17:59 编辑

目测标题是第3行:
  1. awk '{a[NR]=$0}END{print a[3]"\n"a[NR-1]"\n"a[NR]}'
复制代码

作者: laliheyi    时间: 2014-02-12 17:24
本帖最后由 laliheyi 于 2014-02-12 17:25 编辑

第三行标题的话
  1. sed -n '3p;$!h;${H;g;p}'
  2. or
  3. sed -n '3p;x;${G;p}'
复制代码

作者: polyahu    时间: 2014-02-12 17:26
本帖最后由 polyahu 于 2014-02-12 17:40 编辑
  1. sar 1 5 | awk '{ if( NR==1 ) print; b = a; a = $0;} END { print b; print a;}'
复制代码
  1. sar 1 5 | awk '/^L/{print}{b = a; a = $0} END { print b; print a}'
复制代码

作者: guofeng2068    时间: 2014-02-12 17:40
回复 5# polyahu
n=1->n=3


   
作者: guofeng2068    时间: 2014-02-12 17:41
回复 6# guofeng2068
n==1->n==3


   
作者: polyahu    时间: 2014-02-12 17:49
回复 7# guofeng2068


    NR == 3 是吗?看楼主的需要了,哈哈。
作者: yestreenstars    时间: 2014-02-12 17:50
回复 4# laliheyi

写得不错,怒赞一个,第一个可以稍微精简一下~
  1. sed -n '3p;${H;g;p};h'
复制代码
  1. sed '${H;g;b};h;3!d'
复制代码

作者: guofeng2068    时间: 2014-02-12 17:53
回复 9# yestreenstars
感觉很高深,很牛逼!磕文档去。。。


   
作者: Pugna_zfr    时间: 2014-02-12 17:58
回复 3# 关阴月飞


[root@test-t1 ~]# cat abc.txt
Linux 2.6.18-238.el5 (test-t1)         02/12/2014

12:00:01 AM       CPU     %user     %nice   %system   %iowait    %steal     %idle
12:10:01 AM       all      0.01      0.00      0.02      0.01      0.00     99.96
12:20:01 AM       all      0.01      0.00      0.02      0.01      0.00     99.96
12:30:01 AM       all      0.01      0.00      0.02      0.01      0.00     99.96
12:40:01 AM       all      0.01      0.00      0.02      0.01      0.00     99.96
12:50:01 AM       all      0.01      0.00      0.02      0.01      0.00     99.96
01:00:01 AM       all      0.01      0.00      0.02      0.01      0.00     99.96
Average:          all      0.01      0.00      0.03      0.01      0.00     99.94
[root@test ~]# cat abc.txt | awk '{a[NR]=$0}END{print a[3]"\n"a[NF-1]"\n"a[NF]}'
12:00:01 AM       CPU     %user     %nice   %system   %iowait    %steal     %idle
12:40:01 AM       all      0.01      0.00      0.02      0.01      0.00     99.96
12:50:01 AM       all      0.01      0.00      0.02      0.01      0.00     99.96

少了Average这一行
谢谢回复
作者: ppjer    时间: 2014-02-12 17:59
关阴月飞 发表于 2014-02-12 17:16
目测标题是第3行:


awk '{a[NR]=$0}END{print a[3]"\n"a[NF-1]"\n"a[NF]}'

a[3]输出第3行;
a[NF-1], 当前filed-1
a[NF],这个输出什么
作者: 关阴月飞    时间: 2014-02-12 18:00
@Pugna_zfr@ppjer

失误失误,应该是  a[NR-1]  a[NR]
作者: Herowinter    时间: 2014-02-12 18:05
回复 9# yestreenstars
改得不错,怒赞,虽然两个都能看懂,
但还是感觉上面的那个更直观点。


   
作者: Pugna_zfr    时间: 2014-02-12 18:08
回复 14# 关阴月飞


    cat abc.txt | awk '{a[NR]=$0}END{print a[3]"\n"a[NR-1]"\n"a[NR]}'
可以了,3Q
作者: Pugna_zfr    时间: 2014-02-12 18:14
回复 9# yestreenstars


    这两个也可以。论坛里大神真多啊!  对于sed我还只会简单的正则匹配、打印删除替换,大神们推荐下都是怎么学的,有没有好的学习资料推荐下
作者: ppjer    时间: 2014-02-12 19:10
guofeng2068 发表于 2014-02-12 17:53
回复 9# yestreenstars
感觉很高深,很牛逼!磕文档去。。。



星辰大牛,能解释下这2个命令吗,平时用sed做一般的文本替换,没有研究到这么深入,有点不好意问啊~

sed -n '3p;${H;g;p};h'

sed '${H;g;b};h;3!d'
作者: yestreenstars    时间: 2014-02-12 22:30
回复 19# Pugna_zfr

多上论坛,多学习别人优秀的代码,自己多尝试写代码…
   
作者: elu_ligao    时间: 2014-02-12 23:25
  1. sed -n '3p;$!h;${H;g;p}'
复制代码

作者: yestreenstars    时间: 2014-02-13 00:00
回复 20# ppjer
  1. sed -n '3p;${H;g;p};h'
复制代码
-n表示启用静默模式。
3p表示打印第三行。
${H;g;p}表示在处理最后一行时,将模式空间的内容添加到保留空间的下面,然后再将保留空间的内容复制到模式空间,最后打印。
h表示复制模式空间的内容到保留空间。
将h放到最后面,是为了保证处理最后一行时,保留空间里的内容是上一行的内容。
  1. sed '${H;g;b};h;3!d'
复制代码
3!d表示除了第三行不删除,其余的都删除。
这个命令与上个命令相似,不同的是这个没有启用静默模式,之所以将3!d放到最后面,是因为如果把它放到前面会影响${H;g;b}和h的执行。
   
作者: ppjer    时间: 2014-02-13 12:57
yestreenstars 发表于 2014-02-13 00:00
回复 20# ppjer -n表示启用静默模式。
3p表示打印第三行。
${H;g;p}表示在处理最后一行时,将模式空间的内 ...


多谢星辰大牛详细讲解,功力深厚啊,出自哪个门派.你这么牛X,你家里人知道吗?
作者: yestreenstars    时间: 2014-02-13 13:31
回复 24# ppjer

我来自CU派,目测家里人还不造~
   




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