Grep如何抓取前一行後兩行(for,xargs,sed,awk,{},$) - Linux

By Hamiltion
at 2011-12-05T17:45
at 2011-12-05T17:45
Table of Contents
----------------------------------------------------------------
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 ~]$
:
--
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 ~]$
:
--
Tags:
Linux
All Comments

By Zanna
at 2011-12-10T09:59
at 2011-12-10T09:59

By Donna
at 2011-12-10T22:40
at 2011-12-10T22:40

By Zenobia
at 2011-12-14T23:42
at 2011-12-14T23:42

By Emma
at 2011-12-16T03:31
at 2011-12-16T03:31

By Agnes
at 2011-12-20T04:43
at 2011-12-20T04:43

By Leila
at 2011-12-24T23:51
at 2011-12-24T23:51

By Una
at 2011-12-25T22:12
at 2011-12-25T22:12

By Ophelia
at 2011-12-27T22:22
at 2011-12-27T22:22

By Frederic
at 2011-12-28T21:50
at 2011-12-28T21:50

By John
at 2011-12-29T10:57
at 2011-12-29T10:57

By Daph Bay
at 2012-01-01T23:53
at 2012-01-01T23:53
Related Posts
smp相關書籍

By Carol
at 2011-12-05T00:12
at 2011-12-05T00:12
讓vsftp log到stdout

By James
at 2011-12-04T21:09
at 2011-12-04T21:09
怎樣重新安裝Fedora 16

By Doris
at 2011-12-04T20:22
at 2011-12-04T20:22
安裝 Xen in Fedora 16 步驟

By Tracy
at 2011-12-04T18:58
at 2011-12-04T18:58
如何修復硬碟壞軌 fedora

By Yedda
at 2011-12-04T04:28
at 2011-12-04T04:28