Awk
模式的 GREP 並刪除模式之前或之後的所有垃圾字元
我在一個目錄中有一組文件。每個文件都會有一行叫做
---PUBG-xxxxx--
or---PUBG-xxxxx, PUBG-yyyyy ----
。下面是 grep 命令的輸出。grep "^--" FILE*.sql | grep "PUBG" FILE1.sql:---PUBG-10901-- FILE2.sql:---PUBG-11617-- FILE3.sql:---PUBG-11625-- FILE4.sql:--PUBG-11724-- FILE5.sql:---PUBG-11720, PUBG-11406--- FILE6.sql:---PUBG-11403--- FILE7.sql:---PUBG-12021-- FILE8.sql:---PUBG-12207-- FILE9.sql:---PUBG-12270-- FILE10.sql:---PUBG-12552-- FILE11.sql:--- PUBG-14284-- FILE12.sql:--- PUBG-10908-- FILE13.sql:--- PUBG-15136--- FILE14.sql:--- PUBG-15163--- FILE15.sql:--- PUBG-15166--- FILE16.sql:-- PUBG-15059 -- FILE17.sql:-- PUBG-15252 --
PUBG 及其編號是隨機的。我需要的只是文件名及其關聯的 PUBG 值,而不需要任何
--
之前或之後的 PUBG 及其值。也可以有多個 PUBG,就像FILE5.sql:---PUBG-11720, PUBG-11406---
. 我已經編寫了下面的 for 循環集。for (i in `grep "^--" FILE*.sql | grep "PUBG"`) do FILE_NAME=`echo ${i} | awk -F ":" {'print $1'}` PUBG_NO=`echo ${i} | awk -F "PUBG-" {'print "PUBG-" $2'}` echo ${FILE_NAME} echo ${PUBG_NO} done
但範例輸出 for
PUBG_NO
是PUBG-15166---
forFILE15.sql
並且是PUBG-11720,
forFILE5.sql
。我需要特定 FILE_NAME 的文件中的所有 PUBG 值,而沒有任何
--
. FIlE5.sql 的 PUBG 值可以是PUBG-11720, PUBG-11406
如何改進此循環以獲取準確的結果。
您不需要編寫循環。您可以將輸出通過管道傳輸到 sed。我的嘗試如下:
grep "^--" FILE*.sql | grep "PUBG" | sed -E 's/--+\ ?//g'
哪個會給
FILE1.sql:PUBG-10901 FILE2.sql:PUBG-11617 FILE3.sql:PUBG-11625 FILE4.sql:PUBG-11724 FILE5.sql:PUBG-11720, PUBG-11406 FILE6.sql:PUBG-11403 FILE7.sql:PUBG-12021 FILE8.sql:PUBG-12207 FILE9.sql:PUBG-12270 FILE10.sql:PUBG-12552 FILE11.sql:PUBG-14284 FILE12.sql:PUBG-10908 FILE13.sql:PUBG-15136 FILE14.sql:PUBG-15163 FILE15.sql:PUBG-15166 FILE16.sql:PUBG-15059 FILE17.sql:PUBG-15252 FILE14.sql:PUBG-15163 FILE15.sql:PUBG-15166 FILE16.sql:PUBG-15059 FILE17.sql:PUBG-15252
在這裡,我使用了一個 sed 替代命令,其形式為
's/regular expression/substition/flag'
進一步分解命令:
- 正則表達式“–+\ ?” 是您要查找和選擇的模式。這可以讀作“查找具有“-”後跟一個或多個連續“-”且後跟零或一個“”的模式。這將匹配“–”、“—”和“- –" 在您的輸出中。請注意,您將需要 sed 的 -E 標誌才能重新辨識這些量詞。這裡有一個快速參考,可以快速了解 ? 和 + 等正則表達式量詞
- 這裡,替換空間是空的。這將用任何內容替換找到的模式,並且是剝離輸出的有效方法。
- 標誌“g”表示搜尋將是全域的。如果沒有這個,替換只會發生在每行的第一個匹配項上。添加 g 將確保每行上該模式的每個實例都被替換為空。
您還可以將這些概念應用於您的初始 grep 命令以僅執行一次搜尋。
grep -E "^--+\ ?PUBG" FILE*.sql | sed -E 's/--+\ ?//g'