搜尋 Linux 檔案並過濾掉特定字串並刪除其他所有內容

搜尋 Linux 檔案並過濾掉特定字串並刪除其他所有內容

我試圖找到一種有效的方法來搜尋目錄中的整組文件,並且只查找第一個逗號之前的特定字串。

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變更為空字串("")。

相關內容