Linux
/etc/passwd 內容的正則表達式
我在儲存目錄 (/store/) 中有一個來自企業中許多系統的集合文件,我想找到所有 passwd 文件並將它們分類到一個文件中。直覺地說,我想出並使用的命令是:
find /store/ -name passwd -type f -exec cat {} + > all_passwds.txt
但這也收集了作為二進製文件的 /etc/passwd 文件(我假設某些系統符號連結到 busybox 或其他東西)。我真的只想要基於文本的 passwd 文件。
我的下一個想法是,也許我可以找到所有 /etc/passwd 文件並提取正則表達式匹配項。我已經嘗試了幾個小時來創建一個匹配 passwd 格式的正則表達式。
對於創建匹配 /etc/passwd 文件的正則表達式或如何確保上面的命令僅獲取文本 passwd 文件的任何幫助將不勝感激。
如果您想使用正則表達式,則
^([^:]*:){6}[^:]*$
可能足以匹配:
每行分隔的七個欄位,因此您可以這樣做:find /store -name passwd -type f -exec grep -hIE '^([^:]*:){6}[^:]*$' {} + > all_passwds.txt
-h
省略輸出中的文件名-I
跳過二進製文件-E
啟用擴展正則表達式 (ERE)
第一:二進製文件很可能
bin/passwd
- 即密碼更改工具……如果您想要的所有
passwd
文件都位於名為的子目錄中,那麼簡單的解決方案可能會起作用etc
: find /store/ -wholename '*/etc/passwd'
這只會找到格式正確的
etc/passwd
文件。如果這不起作用,請使用該
file
實用程序建構一個循環並僅在它是文本文件時連接:file /etc/passwd /etc/passwd: ASCII text
最後,我從一段舊的 PHP 程式碼中選擇了以下正則表達式。根據需要進行調整:
\w+:\w+:\d+:\d+:[\w\d\s,@()]*:[\w\d\s\/]*:[\d\s\w\/]*