Linux

搜尋 Linux 文件並過濾掉特定字元串並刪除其他所有內容

  • June 4, 2021

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

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 中以獲得我需要的結果。

任何幫助深表感謝。

使用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到記錄結束將它們更改為空字元串("")。

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

引用自:https://unix.stackexchange.com/questions/652814