[問題] 有辦法找出內容符合多條件的檔案嗎?

看板Linux作者 (神奇峰)時間8年前 (2017/03/28 18:35), 8年前編輯推噓14(14017)
留言31則, 7人參與, 最新討論串1/1
在LINUX中,用egrep "123|abc"可以找出檔案內有“123”或“abc"的檔案, 但若我想要找出一個目錄下,檔案內容同時有“123”和“abc"(不一定會在同一行)的 話, 有沒有什麼好的處理方式呢? -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 223.136.248.55 ※ 文章網址: https://www.ptt.cc/bbs/Linux/M.1490697354.A.F1F.html

03/28 18:52, , 1F
grep -q 'abc' $filename && grep -q '123' $filename
03/28 18:52, 1F
這個我怎麼試都不行。

03/28 19:21, , 2F
grep -Rl --null "123" /path/ 2>/dev/null | \
03/28 19:21, 2F

03/28 19:22, , 3F
xargs -0 grep -l "root"
03/28 19:22, 3F

03/29 08:54, , 4F
egrep -oH '123|ab' *|sed -e 's/:.*//'|sort|uniq -d
03/29 08:54, 4F

03/29 08:55, , 5F
更正...
03/29 08:55, 5F

03/29 08:56, , 6F
egrep -oH '123|abc' *|sort|uniq|sed -e 's/:.*//'|\
03/29 08:56, 6F

03/29 08:56, , 7F
uniq -d
03/29 08:56, 7F
若條件式只有1個或超過2個時,這樣的寫法一樣會找不出來。 ※ 編輯: eric680826 (223.137.143.215), 03/29/2017 12:20:15

03/29 13:33, , 8F
只有一個就直接 grep 呀,超過兩個不能用 uniq -d
03/29 13:33, 8F

03/29 13:54, , 9F
是 if grep 'abc' $filename && grep '123' $filename
03/29 13:54, 9F

03/29 13:54, , 10F
then echo $filename
03/29 13:54, 10F

03/29 13:54, , 11F
fi
03/29 13:54, 11F

03/29 15:37, , 12F
egrep "123\|abc"
03/29 15:37, 12F

03/29 15:45, , 13F
pcregrep -M '123.*(\n|.)*abc' file.log
03/29 15:45, 13F

03/29 16:01, , 14F
grep -e "123.*(\n|.)*abc" file.log <-- 這沒試過
03/29 16:01, 14F

03/29 16:25, , 15F
pcregrep -M '123.*\n.*abc' file.log
03/29 16:25, 15F

03/29 16:28, , 16F
grep -Pzo "(?s)^(\s*)\N*main.*?{.*?^\1}" *.c
03/29 16:28, 16F

03/29 18:38, , 17F

03/29 18:45, , 18F
上面的方法好像都只能找到 先出現123 , 再出現abc
03/29 18:45, 18F

03/29 18:55, , 19F
https://goo.gl/hMD68d 這篇有說怎麼做 (但我看不懂)
03/29 18:55, 19F

03/29 19:54, , 20F
grep -P '^(abc.*123|123.*abc)'
03/29 19:54, 20F

03/29 19:55, , 21F
這個應該可以去regexp板問看看
03/29 19:55, 21F

03/30 13:10, , 22F
devide & conquer 如何?先找出有 A 式樣的檔案再從中找
03/30 13:10, 22F

03/30 13:10, , 23F
有 B 式樣的檔案
03/30 13:10, 23F

03/30 13:10, , 24F
*divide
03/30 13:10, 24F

03/31 05:23, , 25F
grep -Pzl '(?s)(?=.23)(?=.1)(?=.*ab)' *
03/31 05:23, 25F

03/31 05:24, , 26F
更正 grep -Pzl '(?s)(?=.*23)(?=.*1)(?=.*ab)' *
03/31 05:24, 26F

03/31 05:26, , 27F
但以目前的例子應該寫成:
03/31 05:26, 27F

03/31 05:27, , 28F
grep -Pzl '(?s)(?=.*abc)(?=.*123)' *
03/31 05:27, 28F

03/31 05:29, , 29F
03/31 05:29, 29F

03/31 05:31, , 30F
03/31 05:31, 30F

03/31 05:32, , 31F
03/31 05:32, 31F
文章代碼(AID): #1OsZoAyV (Linux)
文章代碼(AID): #1OsZoAyV (Linux)