2016-07-22 54 views
0

我是Unix新手,並有以下要求完成我的任務。在unix中的另一個文件中也搜索一個文件中的字符串

我有file1.dat其中有如下所示的數據。

case1.txt 
case2.txt 
case3.txt 
case4.txt 
case5.txt 

file1.dat只有文件名

我有有在上面提到的file1.dat在case1.txt,case2.txt,case3.txt

​​

數據文件的文件夾:

step1 
step2 
step3 
step4 

現在,我必須採取特定的步驟說step2從每個文件,它也存在於file1.dat

注意:step2總是不是行號:2。

回答

0

嘗試這種情況:

while read f; do 
    [ -f "$f" ] && sed -n '/step2/p' "$f" 
done < file1.dat 

它將輸出匹配在file.dat列出的每個文件step2線(S)。

+0

非常感謝你.. – user180946

+0

但輸出也顯示不匹配的文件...錯誤:'sed:無法打開文件case5.txt',case5.txt存在於file1.dat中,但不存在於./all_files文件夾中。請幫助 – user180946

+0

在應用sed命令之前,我已更新以檢查文件是否存在。 – SLePort

0
while read f; do 
    test -f "$f" && grep -F 'step2' "$f" 
done <file1.dat 

file1.dat(含的文件名)的線被逐個讀取到f變量。

while -loop測試的身體,以確保文件$f使用grep,以尋找給定文件中的文本字符串step2之前就存在。

一個稍微詳細的(但當量)循環的版本:

while read f; do 
    if [ -f "$f" ]; then 
     grep -F 'step2' "$f" 
    fi 
done <file1.dat 

根據你運行這個地方,你可能需要稍微修改grep命令。例如,如果您運行此文件夾中的只是所有文件的子文件夾上面:

grep -F 'step2' "all_files/$f" 

這不是在問題完全清楚,但容易調節如果需要的話。

當然,你可能只是繞過file1.dat乾脆說

grep -F 'step2' all_files/case?.txt 

沒有循環可言。

編輯:新的要求:

find ./all_files -type f -name "case?.txt" -print0 | 
xargs -0 grep -l -F 'step2' 

這將通過all_files夾下的所有文件夾中進行遞歸搜索,找到匹配case?.txt的文件,並報告包含期望字符串。

您可能想要更改模式更嚴格,可能是case[1-5].txt

+0

謝謝..可否請您幫忙,如果命令也會遞歸地工作.. ../all_files/中的子文件夾和顯示文件名以及case1.txt:step2',case2.txt:step2' – user180946

+0

這完全改變了解決方案,但好吧,我會將它添加到我的答案中。 – Kusalananda

+0

謝謝..但是當我運行命令我得到錯誤輸出。 '#find ./all_files -type f -name「* .txt」-print0 | xargs -0 grep -l -F'step2'' 'find:bad option -print0' 'find:[-H | -Larpath-list predicate-list' 'xargs:illegal option-0' 'xargs:Usage:xargs:[-t] [-p] [-e [eofstr]] [-E eofstr] [ - 我replstr] [-i [replstr]] [-L#] [-l [#]] [-n#[-x]] [-s大小] [cmd [args ...]]' – user180946

0

如果您想從./all_files目錄中的每個文件中獲取step 2,則不需要您的files.dat,除非您需要將其用作練習。如果你的外殼支持括號擴展

grep "step2" all_files/case{1,5}.txt 

或使用files.dat你可以改變成all_files目錄和重定向內容輸入到grep

cd all_files 
grep "step2" $(<../files.dat) 
相關問題