在bash脚本中获取两个字符串之间的数据的困难

时间:2017-12-21 09:36:03

标签: bash awk sed

    signature: 
      0000 - 70 59 90 77 3b da 12 b5-94 7d ca 72 77 ee 5d   pY.w;....}.rw.]
      000f - 1f a6 6b 17 60 58 4b a3-09 83 55 f5 58 36 80   ..k.`XK...U.X6.
      001e - 1d b8 40 6e d9 95 77 27-46 4c 87 14 45 9a 67   ..@n..w'FL..E.g
      002d - 75 9c 55 a9 f7 1f e1 6e-f6 a7 21 9f 0a 87 96   u.U....n..!....
      003c - dd 00 02 90 07 e0 e7 2c-c0 a3 bd 3b 8e 19 4a   .......,...;..J
      004b - a5 2f b3 e4 e6 f0 10 f1-01 0f 39 e5 9e 55 31   ./........9..U1
      005a - d8 d8 88 13 b6 81 7a 53-f1 9a 1a f8 f6 6f ef   ......zS.....o.
      0069 - b5 9b 36 19 9e da 8b 09-97 f2 b4 55 c0 42 7a   ..6........U.Bz
      0078 - 27 11 6e aa fb 4d eb 40-                       '.n..M.@
    unsignedAttrs:

我有一个签名文件,其中我需要找到两个字符串,如上例“签名”和“unsignedAttrs”是我需要两个字之间的数据,具有以下条件

1)找到与“签名”匹配的字符串的最后一次出现意味着“签名”字符串出现在我的文件的最后 2)找到后得到该块的数据 3)最终输出将是

  70 59 90 77 3b da 12 b5-94 7d ca 72 77 ee 5d
  1f a6 6b 17 60 58 4b a3-09 83 55 f5 58 36 80
  1d b8 40 6e d9 95 77 27-46 4c 87 14 45 9a 67
  75 9c 55 a9 f7 1f e1 6e-f6 a7 21 9f 0a 87 96
  dd 00 02 90 07 e0 e7 2c-c0 a3 bd 3b 8e 19 4a
  a5 2f b3 e4 e6 f0 10 f1-01 0f 39 e5 9e 55 31
  d8 d8 88 13 b6 81 7a 53-f1 9a 1a f8 f6 6f ef
  b5 9b 36 19 9e da 8b 09-97 f2 b4 55 c0 42 7a
  27 11 6e aa fb 4d eb 40-

4)数据的大小可能会有所不同意味着可以提供更多的行或

我尝试使用awk命令获得以下输出,但是最后一行有多余字符导致问题

            sed -n "/signature:/,/unsignedAttrs/p" $SIGNED_INFO > signer_signature.txt
            if [ $? -eq 0 ]; then
                            echo OK
            else
                            echo FAIL
            fi

            sed '1d; $d' signer_signature.txt > Signer_Signature_cert.txt
            if [ $? -eq 0 ]; then
                            echo OK
            else
                            echo FAIL
            fi
            rm -rf signer_signature.txt


awk '{$1=$2=$17=""; print $0}'  Signer_Signature_cert.txt 
  70 59 90 77 3b da 12 b5-94 7d ca 72 77 ee 5d 
  1f a6 6b 17 60 58 4b a3-09 83 55 f5 58 36 80 
  1d b8 40 6e d9 95 77 27-46 4c 87 14 45 9a 67 
  75 9c 55 a9 f7 1f e1 6e-f6 a7 21 9f 0a 87 96 
  dd 00 02 90 07 e0 e7 2c-c0 a3 bd 3b 8e 19 4a 
  a5 2f b3 e4 e6 f0 10 f1-01 0f 39 e5 9e 55 31 
  d8 d8 88 13 b6 81 7a 53-f1 9a 1a f8 f6 6f ef 
  b5 9b 36 19 9e da 8b 09-97 f2 b4 55 c0 42 7a 
  27 11 6e aa fb 4d eb 40- '.n..M.@      

如果您有更好的方法来获取数据,请告诉我们 如果你知道任何'sed'或'awk'命令选项,请告诉我

2 个答案:

答案 0 :(得分:2)

直接在“$ SIGNED_INFO”文件上运行:

$ tac file | awk '/signature/{exit} f{$1=$2=$NF=""; print} /unsignedAttrs/{f=1}' | tac
  70 59 90 77 3b da 12 b5-94 7d ca 72 77 ee 5d
  1f a6 6b 17 60 58 4b a3-09 83 55 f5 58 36 80
  1d b8 40 6e d9 95 77 27-46 4c 87 14 45 9a 67
  75 9c 55 a9 f7 1f e1 6e-f6 a7 21 9f 0a 87 96
  dd 00 02 90 07 e0 e7 2c-c0 a3 bd 3b 8e 19 4a
  a5 2f b3 e4 e6 f0 10 f1-01 0f 39 e5 9e 55 31
  d8 d8 88 13 b6 81 7a 53-f1 9a 1a f8 f6 6f ef
  b5 9b 36 19 9e da 8b 09-97 f2 b4 55 c0 42 7a
  27 11 6e aa fb 4d eb 40-

或只是awk:

$ awk '/unsignedAttrs/{f=0} f{$1=$2=$NF=""; rec = rec $0 ORS} /signature/{f=1; rec=""} END{printf "%s", rec}' file
  70 59 90 77 3b da 12 b5-94 7d ca 72 77 ee 5d
  1f a6 6b 17 60 58 4b a3-09 83 55 f5 58 36 80
  1d b8 40 6e d9 95 77 27-46 4c 87 14 45 9a 67
  75 9c 55 a9 f7 1f e1 6e-f6 a7 21 9f 0a 87 96
  dd 00 02 90 07 e0 e7 2c-c0 a3 bd 3b 8e 19 4a
  a5 2f b3 e4 e6 f0 10 f1-01 0f 39 e5 9e 55 31
  d8 d8 88 13 b6 81 7a 53-f1 9a 1a f8 f6 6f ef
  b5 9b 36 19 9e da 8b 09-97 f2 b4 55 c0 42 7a
  27 11 6e aa fb 4d eb 40-

以上是基于我的理解,你在文件中有多个签名块,如果你只有一个,那么你需要的只是:

$ awk '/unsignedAttrs/{f=0} f{$1=$2=$NF=""; print} /signature/{f=1}' file
  70 59 90 77 3b da 12 b5-94 7d ca 72 77 ee 5d
  1f a6 6b 17 60 58 4b a3-09 83 55 f5 58 36 80
  1d b8 40 6e d9 95 77 27-46 4c 87 14 45 9a 67
  75 9c 55 a9 f7 1f e1 6e-f6 a7 21 9f 0a 87 96
  dd 00 02 90 07 e0 e7 2c-c0 a3 bd 3b 8e 19 4a
  a5 2f b3 e4 e6 f0 10 f1-01 0f 39 e5 9e 55 31
  d8 d8 88 13 b6 81 7a 53-f1 9a 1a f8 f6 6f ef
  b5 9b 36 19 9e da 8b 09-97 f2 b4 55 c0 42 7a
  27 11 6e aa fb 4d eb 40-

答案 1 :(得分:0)

那怎么样?

# cat test | sed -n "/signature:/,/unsignedAttrs/p" | sed '1d;$d' | sed -r 's/.... - //g;s/(.*)   .*/\1/g'
      70 59 90 77 3b da 12 b5-94 7d ca 72 77 ee 5d
      1f a6 6b 17 60 58 4b a3-09 83 55 f5 58 36 80
      1d b8 40 6e d9 95 77 27-46 4c 87 14 45 9a 67
      75 9c 55 a9 f7 1f e1 6e-f6 a7 21 9f 0a 87 96
      dd 00 02 90 07 e0 e7 2c-c0 a3 bd 3b 8e 19 4a
      a5 2f b3 e4 e6 f0 10 f1-01 0f 39 e5 9e 55 31
      d8 d8 88 13 b6 81 7a 53-f1 9a 1a f8 f6 6f ef
      b5 9b 36 19 9e da 8b 09-97 f2 b4 55 c0 42 7a
      27 11 6e aa fb 4d eb 40-