linux命令之grep的-o选项

这个选项说的是, 只输出匹配的部分.
在写shell抓取网页内容时, 开始不知道这个选项,
后来居然用上了perl的HTML::TokeParser,
我只想说, 喜新厌旧是人类最好的品质, 不然怎么来那么多创新…(心里一阵自嘲),
虽然走了很多弯路, 但是也解决了问题.

场景还原如下:
一份html内容(page.html), 里面有几个hidden的input, 内容简化如下(前后的…表示其他内容):

...
<input type="hidden" name="fd" value="Q2m4nLJN4aGSAYmtrsIZAw6vnQRy" />
<input type="hidden" name="execution" value="e1s1" />
<input type="hidden" name="_eventId" value="submit" />
...

这三个东西都比较关键, 想着给一个name(如execution), 取出value(e1s1);

尝试如下:

[root@localhost grep-o]# cat page.html  | grep 'name="execution" value="[a-zA-Z0-9-]\+".*>'
<input type="hidden" name="execution" value="e1s1" />

这样找到的是name=.../>这部分

知道了有-o参数(只输出匹配的部分), 那就简单了

[root@localhost grep-o]# cat page.html  | grep 'name="execution" value="[a-zA-Z0-9-]\+".*>' | grep -o 'e[0-9][0-9a-zA-Z]\+'
e1s1

沿用这个思路, 其他两个也是类似的处理方法.

另附上当时写的perl文件, 以后少走弯路!

#!/usr/bin/perl –w

require HTML::TokeParser;

# 调试用的模块, 类似php的var_dump
use Data::Dumper;

# 获取登录页面的隐藏字段的内容
# usage:
# perl parseContent.pl page.html

$loginHtml = $ARGV[0]; # 登录页面文件
# $fieldName = $ARGV[1]; # 隐藏字段的名字(name值)
# print $loginHtml;

$parser = HTML::TokeParser->new("$loginHtml") ||
     die "Can't open: $!";

# 存储名值, 关联数组
my @arr1 = ();

while (my $token = $parser->get_tag("input")) {
	# if (!$name) {continue;}
	# 没有name的跳过
	next unless my $name = $token->[1]{name};
	my $value = $token->[1]{value};

	$arr1{$name} = $value;	
	
	# push @arr1, $name;
	# push @arr1, $value;	
	# last; # break;	
}

# print Dumper(@arr1);
# print $arr1{$fieldName} || '---';

$fieldFilename = 'tmp/fields.txt';
system("rm -rf $fieldFilename");

foreach my $name (keys %arr1) {
	system("echo $name=$arr1{$name} >> $fieldFilename");
}

另外,附几个实用的选项

  • -A --after-context=NUM print NUM lines of trailing context
    打印匹配行的紧随的后面几行
  • -C (-C num)打印上下几行
  • -l (小写字母l), 只打印包含匹配的文件名
  • -i 忽略大小写
  • -r 递归查找(对于在一个目录下的文件查找非常有用)
  • -v 寻找不匹配的行

欢迎补充指正!

  • 3
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值