这个选项说的是, 只输出匹配的部分.
在写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 寻找不匹配的行

欢迎补充指正!

GitHub 加速计划 / li / linux-dash
10.39 K
1.2 K
下载
A beautiful web dashboard for Linux
最近提交(Master分支:2 个月前 )
186a802e added ecosystem file for PM2 4 年前
5def40a3 Add host customization support for the NodeJS version 4 年前
Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐