我試圖找到一種有效的方法來搜尋目錄中的整組文件,並且只查找第一個逗號之前的特定字串。
postgres 日誌檔範例:
Apr 27 03:35:18 test postgres[24098]: [5-1] user=postgres,db=postgres,app=psqlclient=127.0.0.1
Apr 27 03:35:18 test postgres[24098]: [5-2] user=postgres,db=postgres,app=psqlclient=127.0.0.1
我只對文件中使用的用戶名感興趣。我可以使用 pgbadger 並透過 HTML 查看它,但這會非常耗時。
舉個例子,我只能看到:
user=postgres
與使用者之前和之後的整套文字相反。
然而我正在尋找任何不是專門為 postgres 的用戶。
我嘗試過在文件上使用 grep,但我只看到 user=postgres 的結果。
無論如何,是否可以在一組文件中搜尋 user= 直到第一個逗號作為範例?
或者甚至搜尋每個文件並刪除每行中 user= 之前的任何內容,然後我可以將其放入 Excel 中以獲得我需要的結果。
任何幫助深表感謝。
答案1
GNU grep
與以下一起使用PCRE
:
grep -Po -- '(?<=user=).+?(?=,)' *.log
如果您也想顯示user=
關鍵字:
grep -o -- 'user=[^,]*' *.log
-H
您甚至可以透過在上面的命令中新增該選項來顯示符合成功的檔案grep
(如果沒有該選項,則僅在指定多個檔案時才顯示檔案名稱)。
所以grep
命令變成:
grep -Ho -- 'user=[^,]*' *.log
和輸出:
pgsql.log:user=postgres
pgsql.log:user=postgres
答案2
使用awk
:
awk '/user=/{gsub(/^.*user=|,.*$/, "");print $0}' file
如果要顯示user=
檔案名,則可以變更命令。
awk '/user=/{gsub(/^.*user=|,.*$/, "");
printf "%s:user=%s\n",FILENAME,$0}' *.log
在此命令中,如果user=
找到,則
gsub()
函數將從記錄開頭到記錄末尾的字元user=
和後面的逗號user
變更為空字串(""
)。