Chinaunix

标题: 如何用awk实现取两匹配行之间的行但包括第一匹配不包括第二匹配? [打印本页]

作者: wangmice    时间: 2015-03-13 17:20
标题: 如何用awk实现取两匹配行之间的行但包括第一匹配不包括第二匹配?
本帖最后由 wangmice 于 2015-03-14 15:57 编辑

如何用awk实现取两匹配行之间的行,但包括第一匹配行且不包括第二匹配行?
比如有这样一段文本:
111111111
222222222
333333333
444444444
555555555

匹配22222及55555这两行,输出2-4这三行。
————————————————————————————————————————————————————————
谢谢各位的答疑,说说我的实际问题吧,想用curl自动提交表单登录。表单数据大致是这样的:
  1.                                         <input type="hidden" name="paramStr" id="paramStr" value="9M+7JzF+8VNrE2IAvqV2FUFMyVEsn38h6RiF2+Ue4X9yA+9xDq0lBHiCCI4gVC0cyO9XDXEL6+Wx
  2. 2m0u8T5PpSrUVJ+tcNsqVU7wiqRBCEsUjfVEM9AiH8K02/HAhUeIhPirem6uuy8IT07tav4gmkV3
  3. YaJk2R6lnDwPKifC6mhQ3Pw/rAA2CC9qkK0xSsmvOl2abwaWt9cWgnc8TRSpyspj9Imr8RpsZC7t
  4. jpO2Y0hQ6MPnjEvcWzdRFapyKcqUX4nOcT8BW6tlyLGEgdEvdP0zTDv8T7FHn6wx8pnFgmN6FgLo
  5. FtTIMW+iSbc9lvVapu2eBpBlcnU2PpEt3om/N9uiLyuUOjoZyVNU83OoEoSK9jYYSr0o+Zrr32/Q
  6. MoLHPQd53jNnlO4=" />
  7.                                         <input type="hidden" name="paramStrEnc" id="paramStrEnc" value="CE9O7Wr%2BIJpFd2GiZNkepRRC6cujNLJjXDED1FtB5UAn%2Fn4IGzDg88fzX1I%2BH%2FYDB1sW%2BVQmKvag%0A0qNso4FuRdFstj%2FdpprHwmIYP9emmCTUSxIUSH5gArE6gUvP0bzdUhf%2FxDJRePPAIhFsvdW2nGhV%0ARsjfcjeFLnvfLIee%2F4M8Jjm89iJwTPj8rnfI0j%2F%2Bb9kY4EHLaaOqLEPwatzaKDob8jf0MA%2BZbshC%0AHlAAc%2FhdsLpj75ZhUg52oRijEiB86kj0ctcBCZZEg2trACgFexQLJqO4Z1pz5bInGBlxYkOqiBQu%0AEleCbauY9%2B3Y9%2FolQE3hQ2h64hVM7IIyOR%2BBN4GNQmg49HCSIVZitAiHyU4uGpY6WlbSPttKaDrk%0AyWWfCeYzCvXni%2BalDYmmkdcMf8%2Fgq80qnDn4" />
复制代码
paramStrEnc的值基本上我知道获取了。paramStr的值行数不定,有时是六行,有时4行或5行。就是想截取这个paramStr的值。
  1. 9M+7JzF+8VNrE2IAvqV2FUFMyVEsn38h6RiF2+Ue4X9yA+9xDq0lBHiCCI4gVC0cyO9XDXEL6+Wx
  2. 2m0u8T5PpSrUVJ+tcNsqVU7wiqRBCEsUjfVEM9AiH8K02/HAhUeIhPirem6uuy8IT07tav4gmkV3
  3. YaJk2R6lnDwPKifC6mhQ3Pw/rAA2CC9qkK0xSsmvOl2abwaWt9cWgnc8TRSpyspj9Imr8RpsZC7t
  4. jpO2Y0hQ6MPnjEvcWzdRFapyKcqUX4nOcT8BW6tlyLGEgdEvdP0zTDv8T7FHn6wx8pnFgmN6FgLo
  5. FtTIMW+iSbc9lvVapu2eBpBlcnU2PpEt3om/N9uiLyuUOjoZyVNU83OoEoSK9jYYSr0o+Zrr32/Q
  6. MoLHPQd53jNnlO4=
复制代码
能否将此值合并成一行然后赋值给变量?
作者: zsszss0000    时间: 2015-03-13 17:26
本帖最后由 zsszss0000 于 2015-03-13 18:45 编辑
  1. awk '/22/{p=1}/55/{p=0}p' file
复制代码
  1. 222222222
  2. 333333333
  3. 444444444
复制代码
  1. sed -n '/22/{:a;H;n;/55/bb;ba;:b;x;s/\n//1;p}' file
复制代码
  1. sed -n '/22/{:a;h;N;/55/bb;ba;:b;x;p}' file
复制代码

作者: zl624867243    时间: 2015-03-13 17:34
awk '/1/{while(getline)if($0!~/5/)print;else exit}' inputfile
or
awk '/1/,/5/{if(i>1)print x;x=$0;i++}' inputfile
作者: wangmice    时间: 2015-03-13 21:00
可实现,但是还没太看懂
作者: 我是一隻羊    时间: 2015-03-13 22:50
本帖最后由 我是一隻羊 于 2015-03-13 23:01 编辑
  1. sed -n '/2/{:1;/2$/{h;n};H;n;/5/!b1;x;p}' inputfile
复制代码

作者: wangmice    时间: 2015-03-14 07:51
3楼其实匹配的是第一行,真实数据第一行没规律,不好捕捉。
作者: bikong0411    时间: 2015-03-14 09:28
本帖最后由 bikong0411 于 2015-03-14 09:28 编辑
  1. awk '/2222/,/5555/{if($0 !~ /5555/) print $0}' urfile
  2. sed -n '/2222/,/5555/{/5555/d;p;}' urfile
复制代码

作者: Windows19    时间: 2015-03-14 09:58
本帖最后由 Windows19 于 2015-03-14 13:02 编辑

顶题      借楼主贴子问2个问题,如果是需求要全部隔行输出呢

需求1:
222222222
444444444


需求2:
111111111
333333333
555555555

直到结尾
作者: 54nwq    时间: 2015-03-14 10:31
回复 8# Windows19
  1. awk '{if(NR%2==0){print $0>"a"}else{print $0>"b"}}'
复制代码

作者: wangmice    时间: 2015-03-14 10:51
回复 7# bikong0411


   这个好像不错。
作者: Windows19    时间: 2015-03-14 11:16
本帖最后由 Windows19 于 2015-03-14 13:02 编辑

9楼大神代码  什么也没有输出哦
作者: 我是一隻羊    时间: 2015-03-14 11:25
回复 8# Windows19


需求1:
  1. sed -n 'n;p' inputfile
复制代码
需求2:
  1. sed -n 'p;n' inputfile
复制代码

作者: 54nwq    时间: 2015-03-14 11:53
9楼是输出到文件了。
打印偶数行awk 'i++%2'
打印奇数行awk '++i%2'
作者: 54nwq    时间: 2015-03-14 11:56
sed 输出偶数行
  1. sed '1~2d' file
复制代码
sed 输出奇数行
  1. sed '1~2!d' file
复制代码

作者: Windows19    时间: 2015-03-14 12:27
12楼代码精简很多,通过了
作者: songyc_2015    时间: 2015-03-14 14:52
回复 15# Windows19


奇数行:
awk 'FNR%2' urfile

偶数行:
awk '!(FNR%2)' urfile
作者: wangmice    时间: 2015-03-14 15:56
回复 12# 我是一隻羊

我把问题具体话了,能帮忙参考下吗?怎么样paramStr的值单独提出来?
进一步的话将其合并成一行?
   
作者: 我是一隻羊    时间: 2015-03-14 23:06
本帖最后由 我是一隻羊 于 2015-03-15 10:24 编辑
  1. eval $(sed -r '/</{:1;/>/!{N};s/\n//g;/>/!b1;s/.*name="([^"]+).*value="([^"]+).*/\1=\2/}' inputfile)
复制代码
  1. eval $(awk -vRS=\< -vFS=\" 'NR>1{gsub(/\n/,"");print $4"="$8}' inputfile)
复制代码

作者: wangmice    时间: 2015-03-15 09:57
回复 18# 我是一隻羊


    谢谢,但是我用awk提示-ash: eval: syntax error: unexpected ";;"
用sed提示-ash: eval: syntax error: unexpected redirection
系统是openwrt 14.07 x86的
作者: 我是一隻羊    时间: 2015-03-15 10:18
本帖最后由 我是一隻羊 于 2015-03-15 10:25 编辑

回复 19# wangmice


我编辑了一下,你再跑一下上面的eval,如果还报错的话,就先不赋值.
  1. sed -r '/</{:1;/>/!{N};s/\n//g;/>/!b1;s/.*name="([^"]+).*value="([^"]+).*/\1\t\2/}' inputfile
复制代码
  1. awk -vRS=\< -vFS=\" 'NR>1{gsub(/\n/,"");print $4"\t"$8}' inputfile
复制代码
你这样执行看看
作者: wangmice    时间: 2015-03-15 18:47
本帖最后由 wangmice 于 2015-03-15 18:52 编辑

回复 20# 我是一隻羊

不加eval执行结果是:
  1. paramStr        9M+7JzF+8VNrE2IAvqV2FUFMyVEsn38h6RiF2+Ue4X9yA+9xDq0lBHiCCI4gVC0cyO9XDXEL6+Wx2m0u8T5PpSrUVJ+tcNsqVU7wiqRBCEsUjfVEM9AiH8K02/HAhUeIhPirem6uuy8IT07tav4gmkV3YaJk2R6lnDwPKifC6mhQ3Pw/rAA2CC9qkK0xSsmvOl2abwaWt9cWgnc8TRSpyspj9Imr8RpsZC7tjpO2Y0hQ6MPnjEvcWzdRFapyKcqUX4nOcT8BW6tlyLGEgdEvdP0zTDv8T7FHn6wx8pnFgmN6FgLoFtTIMW+iSbc9lvVapu2eBpBlcnU2PpEt3om/N9uiLyuUOjoZyVNU83OoEoSK9jYYSr0o+Zrr32/QMoLHPQd53jNnlO4=
  2. paramStrEnc     CE9O7Wr%2BIJpFd2GiZNkepRRC6cujNLJjXDED1FtB5UAn%2Fn4IGzDg88fzX1I%2BH%2FYDB1sW%2BVQmKvag%0A0qNso4FuRdFstj%2FdpprHwmIYP9emmCTUSxIUSH5gArE6gUvP0bzdUhf%2FxDJRePPAIhFsvdW2nGhV%0ARsjfcjeFLnvfLIee%2F4M8Jjm89iJwTPj8rnfI0j%2F%2Bb9kY4EHLaaOqLEPwatzaKDob8jf0MA%2BZbshC%0AHlAAc%2FhdsLpj75ZhUg52oRijEiB86kj0ctcBCZZEg2trACgFexQLJqO4Z1pz5bInGBlxYkOqiBQu%0AEleCbauY9%2B3Y9%2FolQE3hQ2h64hVM7IIyOR%2BBN4GNQmg49HCSIVZitAiHyU4uGpY6WlbSPttKaDrk%0AyWWfCeYzCvXni%2BalDYmmkdcMf8%2Fgq80qnDn4
复制代码
加了以后没报错,但看不到输出,我在前面加echo后显示的是:
  1. eval paramStr=9M+7JzF+8VNrE2IAvqV2FUFMyVEsn38h6RiF2+Ue4X9yA+9xDq0lBHiCCI4gVC0cyO9XDXEL6+Wx2m0u8T5PpSrUVJ+tcNsqVU7wiqRBCEsUjfVEM9AiH8K02/HAhUeIhPirem6uuy8IT07tav4gmkV3YaJk2R6lnDwPKifC6mhQ3Pw/rAA2CC9qkK0xSsmvOl2abwaWt9cWgnc8TRSpyspj9Imr8RpsZC7tjpO2Y0hQ6MPnjEvcWzdRFapyKcqUX4nOcT8BW6tlyLGEgdEvdP0zTDv8T7FHn6wx8pnFgmN6FgLoFtTIMW+iSbc9lvVapu2eBpBlcnU2PpEt3om/N9uiLyuUOjoZyVNU83OoEoSK9jYYSr0o+Zrr32/QMoLHPQd53jNnlO4= paramStrEnc=CE9O7Wr%2BIJpFd2GiZNkepRRC6cujNLJjXDED1FtB5UAn%2Fn4IGzDg88fzX1I%2BH%2FYDB1sW%2BVQmKvag%0A0qNso4FuRdFstj%2FdpprHwmIYP9emmCTUSxIUSH5gArE6gUvP0bzdUhf%2FxDJRePPAIhFsvdW2nGhV%0ARsjfcjeFLnvfLIee%2F4M8Jjm89iJwTPj8rnfI0j%2F%2Bb9kY4EHLaaOqLEPwatzaKDob8jf0MA%2BZbshC%0AHlAAc%2FhdsLpj75ZhUg52oRijEiB86kj0ctcBCZZEg2trACgFexQLJqO4Z1pz5bInGBlxYkOqiBQu%0AEleCbauY9%2B3Y9%2FolQE3hQ2h64hVM7IIyOR%2BBN4GNQmg49HCSIVZitAiHyU4uGpY6WlbSPttKaDrk%0AyWWfCeYzCvXni%2BalDYmmkdcMf8%2Fgq80qnDn4
复制代码

作者: 我是一隻羊    时间: 2015-03-15 18:59
本帖最后由 我是一隻羊 于 2015-03-15 19:00 编辑

回复 22# wangmice

有点乱了呢....
  1. eval $(sed -r '/</{:1;/>/!{N};s/\n//g;/>/!b1;s/.*name="([^"]+).*value="([^"]+).*/\1=\2/}' inputfile)
复制代码
  1. eval $(awk -vRS=\< -vFS=\" 'NR>1{gsub(/\n/,"");print $4"="$8}' inputfile)
复制代码
这两个是直接赋值,是没有输出的,以你的文本为例,执行之后直接
  1. echo $paramStr
复制代码
就会打印出后面的字符串.
  1. sed -r '/</{:1;/>/!{N};s/\n//g;/>/!b1;s/.*name="([^"]+).*value="([^"]+).*/\1\t\2/}' inputfile
复制代码
  1. awk -vRS=\< -vFS=\" 'NR>1{gsub(/\n/,"");print $4"\t"$8}' inputfile
复制代码
这两个是只打印,不赋值,输出格式是:<变量名>table<变量值>

作者: wangmice    时间: 2015-03-15 19:09
回复 23# 我是一隻羊


    收到,了解了,问题解决了。谢谢,我再消化消化。
作者: Windows19    时间: 2015-03-15 20:11
回复 17# wangmice


    哦,谢谢刚回来看到你们的回答,
如果要干掉奇数行 和 偶数行呢?
作者: Windows19    时间: 2015-03-15 20:38
回复 16# songyc_2015


    我回错楼层了
作者: jason680    时间: 2015-03-15 21:00
回复 1# wangmice

$ awk -vk="paramStrEnc" '$0~"name=\""k"\""{M=1}M{S=S$0;if(match(S,"value=\"([^\"]+)\" />",a)){print a[1];exit}}' FILE
CE9O7Wr%2BIJpFd2GiZNkepRRC6cujNLJjXDED1FtB5UAn%2Fn4IGzDg88fzX1I%2BH%2FYDB1sW%2BVQmKvag%0A0qNso4FuRdFstj%2FdpprHwmIYP9emmCTUSxIUSH5gArE6gUvP0bzdUhf%2FxDJRePPAIhFsvdW2nGhV%0ARsjfcjeFLnvfLIee%2F4M8Jjm89iJwTPj8rnfI0j%2F%2Bb9kY4EHLaaOqLEPwatzaKDob8jf0MA%2BZbshC%0AHlAAc%2FhdsLpj75ZhUg52oRijEiB86kj0ctcBCZZEg2trACgFexQLJqO4Z1pz5bInGBlxYkOqiBQu%0AEleCbauY9%2B3Y9%2FolQE3hQ2h64hVM7IIyOR%2BBN4GNQmg49HCSIVZitAiHyU4uGpY6WlbSPttKaDrk%0AyWWfCeYzCvXni%2BalDYmmkdcMf8%2Fgq80qnDn4

$ awk -vk="paramStr" '$0~"name=\""k"\""{M=1}M{S=S$0;if(match(S,"value=\"([^\"]+)\" />",a)){print a[1];exit}}' FILE
9M+7JzF+8VNrE2IAvqV2FUFMyVEsn38h6RiF2+Ue4X9yA+9xDq0lBHiCCI4gVC0cyO9XDXEL6+Wx2m0u8T5PpSrUVJ+tcNsqVU7wiqRBCEsUjfVEM9AiH8K02/HAhUeIhPirem6uuy8IT07tav4gmkV3YaJk2R6lnDwPKifC6mhQ3Pw/rAA2CC9qkK0xSsmvOl2abwaWt9cWgnc8TRSpyspj9Imr8RpsZC7tjpO2Y0hQ6MPnjEvcWzdRFapyKcqUX4nOcT8BW6tlyLGEgdEvdP0zTDv8T7FHn6wx8pnFgmN6FgLoFtTIMW+iSbc9lvVapu2eBpBlcnU2PpEt3om/N9uiLyuUOjoZyVNU83OoEoSK9jYYSr0o+Zrr32/QMoLHPQd53jNnlO4=

   
作者: Windows19    时间: 2015-03-15 21:29
怎么干掉奇数行和偶数行
作者: wangmice    时间: 2015-03-15 22:59
本帖最后由 wangmice 于 2015-03-15 23:01 编辑

回复 28# jason680


    这也行,真是一题多解,集思广益啊。
自己捉摸了一个,没有大神们的简洁:
awk '/name="paramStr" id="paramStr" value=".*/{print gensub(/.*value="([^"]+).*/,"\\1",1)}/name="paramStr" id="paramStr" value=".*/,/<input type="hidden" name="paramStrEnc" id="paramStrEnc".*/{if(i>1){print x};x=gensub(/([^"]+)" \/>/,"\\1",1);i++}' file
作者: 我爱你我的菜    时间: 2015-09-09 16:13
awk '/2+/{p=1;}/5+/{p=0}{if(p==1)print}' test.txt
作者: 我爱你我的菜    时间: 2015-09-09 16:15
sed -n '/2222/,/5555/{/555/d;p;}' test.txt




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2