2015-10-27 48 views
0

我想創建一個bash腳本,搜索包含網絡登錄記錄的大文件,我想找到一個特定的用戶使用的無線主機。因此,我可以很容易地找到用戶多少次在登錄時:BASH:文件分隔符之間只搜索,而無需使用「切割」

echo "The user $user exists in the file $target $(cat $target | cut -d ' ' -f 1 | grep "\<$user\>" | wc -l) times" 

其中$用戶更早由read user和$目標定義在執行文件時,通過參數來定義。

作爲參考,有問題的文件的格式如下:

<user> pts/0  2014-02-03 12:13 (<ip>) 
<user> pts/1  2014-02-04 23:56 (<ip>.wireless.xxx.xxx) 
<user> pts/2  2014-02-04 23:39 (<ip>.wireless.xxx.xxx) 
<user> pts/3  2014-02-04 22:09 (<ip>.wireless.xxx.xxx) 
<user> pts/4  2014-02-04 23:59 (<ip>.wireless.xxx.xxx) 

,我已經取代隱私的原因用戶名和完整的IP。用戶之後的間隔差異是爲了說明不同的用戶名長度。

因此基於關閉,我可以得到一個非常接近的答案:

echo "$user has used the following wireless hostnames:" 
echo "$(grep "wireless" $target | grep "\<$user\>" | cut -d '(' -f 2 | cut -d ')' -f 1 | sort | uniq)" 

(這裏我們假設沒有任何用戶名的包括「無線」,現在我只關心的主要錯誤)。如果由於某種原因,我想搜索用戶「2014」,例如,將返回所有的IP地址,即使沒有用戶的「2014」。當然,這只是一種形式,因爲沒有用戶名的將只有數字,不應衝突,但即使只是爲了學習,我寧願沒有這個問題。

所以我需要做的是當我有grep "\<user\>"我需要它以某種方式搜索與用戶名列對應的分隔符''(空格)之前的第一個字段,而不實際切割(因爲我仍然需要ip) 。有沒有一種方法可以通過分隔符來指定grep來搜索?

----樣品的I/O ----

$ ./search.sh bigData 
What username would you like to search for? 
<user> 
Total lines in <file>: 53984 
The user <user> exists in the file <file> 79 times 
<user> has used the following wireless hostnames: 
<ip>.wireless.xxx.xxx 
<ip>.wireless.xxx.xxx 
<ip>.wireless.xxx.xxx 
<ip>.wireless.xxx.xxx 
+0

請爲該示例輸入添加示例輸出到您的問題。 – Cyrus

回答

0

你可以告訴grep的在該行的開頭使用一個^搜索:

echo "$user has used the following wireless hostnames:" 
echo "$(grep "wireless" $target | grep "^\<$user\>" | cut -d '(' -f 2 | cut -d ')' -f 1 | sort | uniq)" 

您可以使用SED刪除使用和IP地址之間的一切,但不會幫助你irele的用戶稱爲無線。僅供學習:

sed 's/ .*(/(/' 
+0

我加了'^'現在完美了 - 謝謝 – Eric

0

您應該使用sed的您輸入格式化爲一個簡單的表格格式,並使用AWK來查詢數據,就像你會做一個數據庫。要列出用戶名字中含有2014您可以使用過濾

sed -e 's/[[:blank:]][[:blank:]]*/|/;s/[()]//g'\ 
    | awk -F '|' '$1 ~ "2014" {print($1)}' 

AWK你可以在字段$1$2結合條件,...或使用複雜的格式,可顯示所選數據printf,如:

sed -e 's/[[:blank:]][[:blank:]]*/|/;s/[()]//g'\ 
    | awk -F '|' '$1 ~ "2014" && $2 ~ 'pts/1' {printf("User: %s, date:%s\n", $1 $3)}' 
相關問題