Re: [問題] Grep如何抓取前一行後兩行(for,xargs,sed,awk,{},$)

看板Linux作者 ([{}])時間14年前 (2011/12/05 17:45), 編輯推噓0(0012)
留言12則, 2人參與, 最新討論串1/1
---------------------------------------------------------------- data.txt內容是 111 AAAAA 333 444 555 111 AAAAA 333 444 555 希望產出結果是 111 AAAAA 333 444 111 AAAAA 333 444 ---------------------------------------------------------------- [問題一] 使用Shell Script來寫(for搭配sed) 正確 greplinenumbers=`grep -E "*AAA*" -n data.txt | cut -d : -f 1` for getline in $greplinenumbers do sed -ne "$(($getline-1)) p" \ -ne "$getline p" \ -ne "$(($getline+1)) p" \ -ne "$(($getline+2)) p" data.txt done 使用Shell Script來寫(for搭配awk) 錯誤 greplinenumbers=`grep -E "*AAA*" -n data.txt | cut -d : -f 1` for getline in $greplinenumbers do awk "NR==$(($getline-1)) {printf $0"\n"} NR==$getline {printf $0"\n"} NR==$(($getline+1)) {printf $0"\n"} NR==$(($getline+2)) {printf $0"\n"}" data.txt done ---------------------------------------------------------------- [問題二] 一行指令(xargs搭配awk) 正確 grep -E "*AAA*" -n data.txt | cut -d : -f 1 | xargs -i \ awk 'NR=={}-1 {printf $0"\n"} NR=={} {printf $0"\n"} NR=={}+1 {printf $0"\n"} NR=={}+2 {printf $0"\n"}' data.txt 一行指令(xargs搭配sed) 錯誤 grep -E "*AAA*" -n data.txt | cut -d : -f 1 | xargs -i \ sed -ne '{}-1 p' -ne '{} p' -ne '{}+1 p' -ne '{}+2 p' data.txt ---------------------------------------------------------------- 請問大家以上兩個錯誤(紅字部分)應該怎麼修正呢? : : : 不好意思...我使用的是UNIX系統 : : : 我想請問一下... : : : 我記得抓關鍵字"AAA"..單行的指令應該是 : : : grep "AAA" data.txt > result.txt : : : 會搜尋data.txt內的"AAA"的那行關鍵字...並且存在result.txt : : : 但是我希望能夠取這關鍵字的前一行...和後兩行...(包含AAA的關鍵字那行) : : : 總共需要四行...請問要如何用... : : : 有網友提供過...加入-B1 -A2參數...可以達成... : : : 但是我測試過 grep -B1 -A2 "*AAA*" data.txt > result.txt : : : 但是系統卻顯示無法辨識...-B1 -A2... : : : 而且我測試 man grep 也找不到..(但可能我英文不好..)_ : : : 想請各位網友...在提供一下...是否有其他方法... : : : 還是有其他指令可以達成呢 ...謝謝 : : 不好意思...重新提我一年前問過的問題 : : 因為我目前還沒找到答案 : : 我是用SunOS5.10 : : 指令好像沒有支援grep -B1 -A2 : : 有其他方式嗎 : : awk或是sed有辦法達到這功能嗎 : : grep -B1 -A2 "*AAA*" data.txt > result.txt : : 參考看看 grepab.sh : ----------------------沿虛線剪下----------------------------- : greplinenumbers=`grep -E "*AAA*" -n data.txt | cut -d : -f 1` : rm displaylines.txt > null 2>&1 : for getline in $greplinenumbers : do : expr $getline - 1 >> displaylines.txt : expr $getline >> displaylines.txt : expr $getline + 1 >> displaylines.txt : expr $getline + 2 >> displaylines.txt : done : : displaylinenumbers=`cat displaylines.txt` : rm result.txt > null 2>&1 : for getline in $displaylinenumbers : do : sed -n "$getline p" data.txt >> result.txt : done : ----------------------沿虛線剪下----------------------------- : : : [mary@localhost ~]$ cat data.txt : 111 : AAAAA : 333 : 444 : 555 : 111 : AAAAA : 333 : 444 : 555 : [mary@localhost ~]$ sh grepab.sh : [mary@localhost ~]$ cat result.txt : 111 : AAAAA : 333 : 444 : 111 : AAAAA : 333 : 444 : [mary@localhost ~]$ : -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 122.121.208.91

12/05 21:15, , 1F
問題二 你的引號沒有否配....
12/05 21:15, 1F

12/05 21:22, , 2F
抱歉打錯了. 不過雙引號改單引號, {}也是無法做 加減
12/05 21:22, 2F

12/05 21:29, , 3F
xargs -t -i ... 看一下xargs是以怎樣的情況去執行的...
12/05 21:29, 3F

12/05 21:54, , 4F
sed -ne 2-1 p 未知的指令 - , 那該怎麼讓它 {} 做加減呢?
12/05 21:54, 4F

12/05 21:55, , 5F
awk 的 NR=={}-1 , 可以讓它 {} 直接做加減 .
12/05 21:55, 5F
※ 編輯: xyz2012 來自: 122.121.208.91 (12/05 22:13)

12/05 23:34, , 6F
你試著用xargs 跑bash 讓bash 執行 sed
12/05 23:34, 6F

12/05 23:40, , 7F
bash -c 'sed -ne "$(({}-1)),$(({}+2)) p" data.txt'
12/05 23:40, 7F

12/06 00:09, , 8F
f大, 多謝, 可以了. PS:上面那個e也可以拿掉.
12/06 00:09, 8F

12/06 00:35, , 9F
問題一已解, 自問自答
12/06 00:35, 9F

12/06 00:37, , 10F
awk 'NR=='"$(($getline-1))"' {printf $0"\n"}
12/06 00:37, 10F

12/06 00:37, , 11F
...
12/06 00:37, 11F

12/06 00:38, , 12F
NR=='"$(($getline+2))"' {printf $0"\n"}' data.txt
12/06 00:38, 12F
文章代碼(AID): #1Et9AcXO (Linux)