AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / unix / 问题 / 700734
Accepted
Sergio Jimenez
Sergio Jimenez
Asked: 2022-04-29 06:17:36 +0800 CST2022-04-29 06:17:36 +0800 CST 2022-04-29 06:17:36 +0800 CST

替换文件中的时间戳 Base64 值

  • 772

我有一个问题,我有一个文件 test.txt,其内容如下:

dn: serv=CSPS,mscId=167e48dc2b7a42d4acce611c8b477262,ou=multiSCs,dc=three
structuralObjectClass: CP1
objectClass: CP1
objectClass: CUDBServiceAuxiliary
objectClass: CP2
objectClass: CP3
objectClass: CP4
objectClass: CP5
objectClass: CP6
UNKNLOCDATECS:: FQsJ
UNKNLOCDATEPS:: FgMe
ISTTIMESTAMP:: FgMIDyI7
CSULTIME:: HgMWCzYo
CSLOCTIME:: AQQWBA0R
PSULTIME:: HgMWDBco
PSLOCTIME:: HgMWDBco
SCHAR:: AgA=
ICS: 1
CAT: 10
DBSG: 1
OFA: 1
SOCB: 1
PWD: 0000
PWDC: 0
SOCFB: 0

每次找到文本 CSULTIME:: 和 CSLOCTIME:: 时,我想用以下函数替换这些文字之后的值,以将该时间戳解码为识别格式(如果我可以在文件的单次扫描中替换这两个值更好作为我们谈论的是 8 GB 文件,两种情况下的功能相同):

base64 -d | hexdump -v -e '1/1 "%02d" ' | awk 'BEGIN {FS = ""} {print "20" $5 $6 "-" $3 $4 "-" $1 $2 " " $7 $8 ":" $9 $10 ":" $11 $12}'

如果我在 unix 中对这两个值进行回显:

For CSULTIME the result would be 2022-03-30 11:54:40: echo -n "HgMWCzYo" | base64 -d | hexdump -v -e '1/1 "%02d" ' | awk 'BEGIN {FS = ""} {print "20" $5 $6 "-" $3 $4 "-" $1 $2 " " $7 $8 ":" $9 $10 ":" $11 $12}'
For CSLOCTIME the result would be 2022-04-01 04:13:17: echo -n "AQQWBA0R" | base64 -d | hexdump -v -e '1/1 "%02d" ' | awk 'BEGIN {FS = ""} {print "20" $5 $6 "-" $3 $4 "-" $1 $2 " " $7 $8 ":" $9 $10 ":" $11 $12}'

因此,最后文件将具有 CSULTIME 和 CSLOCTIME 的这些值:

dn: serv=CSPS,mscId=167e48dc2b7a42d4acce611c8b477262,ou=multiSCs,dc=three
    structuralObjectClass: CP1
    objectClass: CP1
    objectClass: CUDBServiceAuxiliary
    objectClass: CP2
    objectClass: CP3
    objectClass: CP4
    objectClass: CP5
    objectClass: CP6
    UNKNLOCDATECS:: FQsJ
    UNKNLOCDATEPS:: FgMe
    ISTTIMESTAMP:: FgMIDyI7
    CSULTIME:: 2022-03-30 11:54:40
    CSLOCTIME:: 2022-04-01 04:13:17
    PSULTIME:: HgMWDBco
    PSLOCTIME:: HgMWDBco
    SCHAR:: AgA=
    ICS: 1
    CAT: 10
    DBSG: 1
    OFA: 1
    SOCB: 1
    PWD: 0000
    PWDC: 0
    SOCFB: 0

我完全迷失了,因为我尝试 sed 的所有组合都无法使它们起作用。

提前致谢!!!!

sed base64
  • 3 3 个回答
  • 172 Views

3 个回答

  • Voted
  1. Best Answer
    Stéphane Chazelas
    2022-04-30T04:19:02+08:002022-04-30T04:19:02+08:00

    我会做类似的事情:

    perl -MMIME::Base64 -pe 's{^[^:]*TIME:\K: (\S+)}{
      my ($d, $m, $y, @t) = unpack "C*", decode_base64 $1;
      sprintf "20%02d-%02d-%02d %02d:%02d:%02d", $y, $m, $d, @t}e'
    
    • 1
  2. Sergio Jimenez
    2022-04-30T00:24:24+08:002022-04-30T00:24:24+08:00

    我明白了,我做对了(使用 sed,不知道如何在 perl 中使用 hexdump)问题是我需要在 sed 中转义的字符。

    现在它可以完美地工作,尽管我必须做两个 seds:

    sed  's/\(CSULTIME::\)\(.*\)/echo -n \1" ";echo \2\| base64 -d \| hexdump -v -e '\''1\/1 "%02d" '\'' \| awk '\''BEGIN {FS = ""} {print "20" $5 $6 "-" $3 $4 "-" $1 $2 " " $7 $8 ":" $9 $10 ":" $11 $12}'\'' /ge ' 
    sed  's/\(CSLOCTIME::\)\(.*\)/echo -n \1" ";echo \2\| base64 -d \| hexdump -v -e '\''1\/1 "%02d" '\'' \| awk '\''BEGIN {FS = ""} {print "20" $5 $6 "-" $3 $4 "-" $1 $2 " " $7 $8 ":" $9 $10 ":" $11 $12}'\'' /ge '
    

    #------------

    您可以将代码分解为 bash 函数,将其导出,然后在 GNU sed ss///e 中调用它

    fx() {
      printf '%s' "$2" | base64 -d |
      hexdump -v -e '1/1 "%02d" ' |
      awk -v temp="$1" 'BEGIN {FS = ""} {print temp "20" $5 $6 "-" $3 $4 "-" $1 $2 " " $7 $8 ":" $9 $10 ":" $11 $12}'
    }
    
    export -f fx
    
    sed -E "s/((CSULTIME|CSLOCTIME)::\s*)(\S.*)/fx '\1' '\3'/e" file
    
    • 0
  3. guest_7
    2022-05-02T18:17:34+08:002022-05-02T18:17:34+08:00

    您可以使用以下方法,我们首先设置用于 base64 解码的工具,然后使用 GNU sed 处理编码数据。

    #------------------
    #  base64 in sed
    #------------------
    set -u
    
    #> present century
    century=$(date '+%C')
    
    #> format string printf
    fmt='%s%s\n'
    
    #> bit, sextet, & octet regex
    bit='[01]'
    sextet="${bit}{6}"
     octet="${bit}{8}"; byte=$octet
    
    #> base64 charset
    b64='/[:alnum:]+'
    declare -a b64_chars=({A..Z} {a..z} {0..9} + /)
    
    #> user-defined helper function(s)
    oneLine() {
      # collapse stdin into one line
      paste -sd'\0' -
    }
    
    esc_rhs() {
      # make stdin pkuggable
      # on the rhs of a s///
      sed -e '
        s:[\/&]:\\&:g
        $!s:$:\\:
      ' -
    }
    
    dec2bin() {
      # create an array of size 2^$1
      # Usage: dec2bin 6
      # creates array d2b as:
      # underscore for clarity only
      # $d2b[0] => "000_000"
      # $d2b[1] => "000_001"
      #        ...
      # $d2b[63] => "111_111"
    
      eval "d2b=($(yes '{0,1}' | sed "$1q" | oneLine))"
    }
    
    #> build the encoding lookup table
    encode_tbl=$(printf '%s\n' "$(
    dec2bin 6
    i=0
    for c in "${b64_chars[@]}"
    do
      printf "$fmt" "$c" "${d2b[$i]}"
      (( i++ ))
    done
    )" | esc_rhs)
    
    #> build the decoding lookup table
    decode_tbl=$(printf '%s\n' "$(
    dec2bin 8
    for dec in {0..255}
    do
      hex=$(printf '%02x' "$dec")
      bin=${d2b[$dec]}
      printf "$fmt" "$bin" "$hex"
    done
    )" | esc_rhs)
    
    #> hex to bin
    h2d=$(for i in {0..255};do
      printf 'x%02x:%02d\n' "$i" "$i"
    done | oneLine | esc_rhs)
    
    #######> main()
    sed -E "
      s/^\s*(CSULTIME|CSLOCTIME)::\s*/&\n/;T
      h;s/\n.*//
      x;s/.*\n//
      s/[^${b64}]//g
      /^\$/d;s/^|\$/\n/g
    
      # unencode
      s/\$/$encode_tbl/
      :encode
      /\n\n/!{
        s/((\n)[${b64}])(.*\1(${sextet}))/\4\2\3/
        b encode
      }
    
      s/\n.*//;:pad
      /^(${octet})+\$/!{
        s/\$/0/;b pad
      }
      # chunk it in 8-bit portions
      s/(${octet})/& /g
      G;s/\$/${decode_tbl}/;t decode
      :decode
        s/(${octet}) (.*\n\1([[:xdigit:]]{2}))/\3\2/
      t decode
      s/\n.*//
    
      #> hex to decimal
      s/^|\$/\n/g
      s/\$/$h2d/;t hex2int
      :hex2int
      s/\n([[:xdigit:]]{2})(.*\n.*x\1:([[:digit:]]+))/\3\n\2/
      t hex2int
      s/\n.*//
    
      #> rearrange decoded value into
      #> yyy-mm-dd hh:mm:ss format
      s/(..)(..)(..)/\3\2\1/
      s/../&-/g
      s/(.*)./$century\1/
      s/-/:/3g
      s/:/ /
    
      #> stitch back the prefixes
      #> CSULTIME, CSLOCTIME
      H;z;x;s/\n//
    " file
    

    输出:-

    -1e-0===
    dn: serv=CSPS,mscId=167e48dc2b7a42d4acce611c8b477262,ou=multiSCs,dc=three
    structuralObjectClass: CP1
    objectClass: CP1
    objectClass: CUDBServiceAuxiliary
    objectClass: CP2
    objectClass: CP3
    objectClass: CP4
    objectClass: CP5
    objectClass: CP6
    UNKNLOCDATECS:: FQsJ
    UNKNLOCDATEPS:: FgMe
    ISTTIMESTAMP:: FgMIDyI7
    CSULTIME:: 2022-03-30 11:54:40
    CSLOCTIME:: 2022-04-01 04:13:17
    PSULTIME:: HgMWDBco
    PSLOCTIME:: HgMWDBco
    SCHAR:: AgA=
    ICS: 1
    CAT: 10
    DBSG: 1
    OFA: 1
    SOCB: 1
    PWD: 0000
    PWDC: 0
    SOCFB: 0
    

    • 0

相关问题

  • Linux grep文件1中的内容在文件2中[重复]

  • 如何在第三个逗号后用条件grep行

  • 根据第一个逗号之前的匹配删除重复行数

  • 如何改进这个字符转换脚本?

  • 如何删除两行之间的单行

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    模块 i915 可能缺少固件 /lib/firmware/i915/*

    • 3 个回答
  • Marko Smith

    无法获取 jessie backports 存储库

    • 4 个回答
  • Marko Smith

    如何将 GPG 私钥和公钥导出到文件

    • 4 个回答
  • Marko Smith

    我们如何运行存储在变量中的命令?

    • 5 个回答
  • Marko Smith

    如何配置 systemd-resolved 和 systemd-networkd 以使用本地 DNS 服务器来解析本地域和远程 DNS 服务器来解析远程域?

    • 3 个回答
  • Marko Smith

    dist-upgrade 后 Kali Linux 中的 apt-get update 错误 [重复]

    • 2 个回答
  • Marko Smith

    如何从 systemctl 服务日志中查看最新的 x 行

    • 5 个回答
  • Marko Smith

    Nano - 跳转到文件末尾

    • 8 个回答
  • Marko Smith

    grub 错误:你需要先加载内核

    • 4 个回答
  • Marko Smith

    如何下载软件包而不是使用 apt-get 命令安装它?

    • 7 个回答
  • Martin Hope
    user12345 无法获取 jessie backports 存储库 2019-03-27 04:39:28 +0800 CST
  • Martin Hope
    Carl 为什么大多数 systemd 示例都包含 WantedBy=multi-user.target? 2019-03-15 11:49:25 +0800 CST
  • Martin Hope
    rocky 如何将 GPG 私钥和公钥导出到文件 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Evan Carroll systemctl 状态显示:“状态:降级” 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim 我们如何运行存储在变量中的命令? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S 为什么 /dev/null 是一个文件?为什么它的功能不作为一个简单的程序来实现? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 如何从 systemctl 服务日志中查看最新的 x 行 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - 跳转到文件末尾 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla 为什么真假这么大? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis 在一个巨大的(70GB)、一行、文本文件中替换字符串 2017-12-30 06:58:33 +0800 CST

热门标签

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve