1. 程式人生 > >linux命令之grep的-o選項

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);

嘗試如下:

[[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 尋找不匹配的行

歡迎補充指正!

相關推薦

no