linux命令之grep的-o選項
阿新 • • 發佈:2019-02-14
這個選項說的是, 只輸出匹配的部分.
在寫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);
嘗試如下:
[[email protected] grep-o]# cat page.html | grep 'name="execution" value="[a-zA-Z0-9-]\+".*>'
<input type="hidden" name="execution" value="e1s1" />
這樣找到的是name=.../>
這部分
知道了有-o
引數(只輸出匹配的部分), 那就簡單了
[[email protected] 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 尋找不匹配的行
歡迎補充指正!