Grep
如何grep選定的字元串由-分隔
我是 grep 的新手,我有一個包列表,我只需要顯示某些結果。
以下是軟體包列表:
apache2/oldoldstable,oldoldstable,now 2.4.25-3+deb9u12 amd64 [installed] apache2-bin/oldoldstable,oldoldstable,now 2.4.25-3+deb9u12 amd64 [installed,automatic] apache2-data/oldoldstable,oldoldstable,now 2.4.25-3+deb9u12 all [installed,automatic] apache2-dbg/oldoldstable,oldoldstable 2.4.25-3+deb9u12 amd64 apache2-dev/oldoldstable,oldoldstable 2.4.25-3+deb9u12 amd64 apache2-doc/oldoldstable,oldoldstable 2.4.25-3+deb9u12 all apache2-ssl-dev/oldoldstable,oldoldstable 2.4.25-3+deb9u12 amd64 apache2-suexec-custom/oldoldstable,oldoldstable 2.4.25-3+deb9u12 amd64 apache2-suexec-pristine/oldoldstable,oldoldstable 2.4.25-3+deb9u12 amd64 apache2-utils/oldoldstable,oldoldstable,now 2.4.25-3+deb9u12 amd64 [installed,automatic]
我一直在嘗試使用正則表達式,但我確定有問題:
cat list | grep 'apache2-(bin|data|utils)'
這是我的預期輸出:
apache2/oldoldstable,oldoldstable,now 2.4.25-3+deb9u12 amd64 [installed] apache2-bin/oldoldstable,oldoldstable,now 2.4.25-3+deb9u12 amd64 [installed,automatic] apache2-data/oldoldstable,oldoldstable,now 2.4.25-3+deb9u12 all [installed,automatic] apache2-utils/oldoldstable,oldoldstable,now 2.4.25-3+deb9u12 amd64 [installed,automatic]
我的命令有什麼問題/缺少什麼?
|
使用 BRE(基本正則表達式)模式匹配時需要轉義括號和字元,這是 中的預設值grep
,因此:grep '^apache2-\?\(bin\|data\|utils\|\)/'
-E
或使用開關啟用 ERE(擴展正則表達式)模式匹配:grep -E '^apache2-?(bin|data|utils|)/'
筆記:
- 您不需要 feed
grep
with,cat
因為它像許多其他工具一樣直接從文件中讀取。- 我添加了行首
^
以從行首開始匹配。- 我
-?
在 ERE 和-\?
BRE 中添加了僅與連字元-
零或一次匹配的;另請注意,使用的\?
不是有效的標準 BRE(即使它至少在 GNU 和其他一些工具中工作)。BRE 等價\?
於\{0,1\}
.- 我在其中添加了一個空的最後一個
|
匹配項(...|...|...|)
,它將匹配apache2
僅行之類的情況(但如果您的輸入中有任何內容,它也會匹配apache2-
,如果您不想匹配,請grep -E '^apache2(-(bin|data|utils)|)/'
改用);- 使用
\|
也不是標準的 BRE,也沒有等效的。最好只使用 ERE 給定的替代方案。