【问题标题】:how to input and output in hexadecimal format in awk? [duplicate]如何在awk中以十六进制格式输入和输出? [复制]
【发布时间】:2020-01-01 08:28:42
【问题描述】:

我有一个这样的文件:

0000000 4130b00f adfbad7e ad96adbc ada0ad6e ad91adf4 ae2eae9e 3b64b1bc ab89a4b0  A0.....~.......n........;d......
0000020 a3c0a865 a18ba57e a721a531 a608a64e a807aaf9 ae6ba418 ac2938c2 ad23abb6  ...e...~.!.1...N.....k...)8..#..
0000040 2cd6a1d9 3f583428 a4e1a659 a2eca7e1 4116aa10 2d5433ff 29483114 30153ac8  ,...?X4(...Y....A...-T3.)H1.0.:.
0000060 37ab3cfd a9fca910 adb13542 9dec8b99 3d752fde 340230c3 2eeb33bd 33d83a5a  7.<.......5B....=u/.4.0...3.3.:Z
0000080 38aab0b1 349ca9cf b0603e00 3b2839ea a6082f4d 2c7c9df9 3d4630aa a90f3936  8...4....`>.;(9.../M,|..=F0...96
00000a0 a6081fb0 b0a13c1c a2cc39d2 b17caa7c a5f62ada 3321a9bd a1a9aefe 36099f1c  ......<...9..|.|..*.3!......6...
00000c0 3b10a326 3806ae88 acde9fdc a3a630a0 3d562e82 a4a12e85 390e35aa a5902078  ;..&8.........0.=V......9.5... x
00000e0 ac6329d6 36263802 33983c16 303ea8f8 a5302eb3 34ee35e8 a4adaaec 34d19bb3  .c).6&8.3.<.0>...0..4.5.....4...
0000100 2c793183 325c3990 a4e9a678 303a35e4 2ebb3067 3590346e 31613724 31b6a817  ,y1.2\9....x0:5...0g5.4n1a7$1...
0000120 39b68800 a83b31d0 30e4353d 350d3892 33e32d22 2b8ea5e9 b7f1334e 353834e4  9....;1.0.5=5.8.3.-"+.....3N584.
0000140 351a37f3 38a63930 38d23884 38c43c3c 41bc36fa 3dd838fb 3932397e 3b283bde  5.7.8.908.8.8.<<A.6.=.8.929~;(;.
0000160 3ae03b94 3c113c28 3c47aedb 3b1c3d17 39283c51 414039ad 3ae13930 39013b5a  :.;.<.<(<G..;.=.9(<QA@9.:.909.;Z
0000180 39db3a33 43dca99b ac919fd9 3fb5a204 311899c6 a7e332ac 3882a703 9d569c63  9.:3C.......?...1.....2.8....V.c

第一列0000000、0000020、0000040是后面数据的地址。我想在这个地址上添加某个数字,例如 0x258d5580 并显示它,使它看起来像这样:

258d5580 4130b00f adfbad7e ad96adbc ada0ad6e ad91adf4 ae2eae9e 3b64b1bc ab89a4b0  A0.....~.......n........;d......
258d55a0 a3c0a865 a18ba57e a721a531 a608a64e a807aaf9 ae6ba418 ac2938c2 ad23abb6  ...e...~.!.1...N.....k...)8..#..
258d55c0 2cd6a1d9 3f583428 a4e1a659 a2eca7e1 4116aa10 2d5433ff 29483114 30153ac8  ,...?X4(...Y....A...-T3.)H1.0.:.
258d55e0 37ab3cfd a9fca910 adb13542 9dec8b99 3d752fde 340230c3 2eeb33bd 33d83a5a  7.<.......5B....=u/.4.0...3.3.:Z
258d5600 38aab0b1 349ca9cf b0603e00 3b2839ea a6082f4d 2c7c9df9 3d4630aa a90f3936  8...4....`>.;(9.../M,|..=F0...96
258d5620 a6081fb0 b0a13c1c a2cc39d2 b17caa7c a5f62ada 3321a9bd a1a9aefe 36099f1c  ......<...9..|.|..*.3!......6...
258d5640 3b10a326 3806ae88 acde9fdc a3a630a0 3d562e82 a4a12e85 390e35aa a5902078  ;..&8.........0.=V......9.5... x
258d5660 ac6329d6 36263802 33983c16 303ea8f8 a5302eb3 34ee35e8 a4adaaec 34d19bb3  .c).6&8.3.<.0>...0..4.5.....4...
258d5680 2c793183 325c3990 a4e9a678 303a35e4 2ebb3067 3590346e 31613724 31b6a817  ,y1.2\9....x0:5...0g5.4n1a7$1...
258d56a0 39b68800 a83b31d0 30e4353d 350d3892 33e32d22 2b8ea5e9 b7f1334e 353834e4  9....;1.0.5=5.8.3.-"+.....3N584.
258d56c0 351a37f3 38a63930 38d23884 38c43c3c 41bc36fa 3dd838fb 3932397e 3b283bde  5.7.8.908.8.8.<<A.6.=.8.929~;(;.
258d56e0 3ae03b94 3c113c28 3c47aedb 3b1c3d17 39283c51 414039ad 3ae13930 39013b5a  :.;.<.<(<G..;.=.9(<QA@9.:.909.;Z
258d5700 39db3a33 43dca99b ac919fd9 3fb5a204 311899c6 a7e332ac 3882a703 9d569c63  9.:3C.......?...1.....2.8....V.c
258d5720 aa2bb218 a4cd34b9 ad02a5ad 38d64336 34d4b025 390a3939 3628ad3e b03a3f9f  .+....4.....8.C64..%9.996(.>.:?.
258d5740 3ad73724 2f0336a6 b244ad12 a9f6af7c aa70ace3 ab8eabf8 ae693be2 af41af41  :.7$/.6..D.....|.p.......i;..A.A

如何使用 awk 做到这一点? 我的 awk 版本:

ckim@stph45:/home/ckim] awk --version
GNU Awk 3.1.7
Copyright (C) 1989, 1991-2009 Free Software Foundation.

添加(为我解决):这有效(在下面的三人组的帮助下) tt.awk:

{ $1 = sprintf("%08x", $1 + 0x258d5580) } 1  

然后做

awk -f tt.awk --non-decimal-data file

它有效。

258d5580 4130b00f adfbad7e ad96adbc ada0ad6e ad91adf4 ae2eae9e 3b64b1bc ab89a4b0 A0.....~.......n........;d......
258d55a0 a3c0a865 a18ba57e a721a531 a608a64e a807aaf9 ae6ba418 ac2938c2 ad23abb6 ...e...~.!.1...N.....k...)8..#..
258d55c0 2cd6a1d9 3f583428 a4e1a659 a2eca7e1 4116aa10 2d5433ff 29483114 30153ac8 ,...?X4(...Y....A...-T3.)H1.0.:.
258d55e0 37ab3cfd a9fca910 adb13542 9dec8b99 3d752fde 340230c3 2eeb33bd 33d83a5a 7.<.......5B....=u/.4.0...3.3.:Z
258d5600 38aab0b1 349ca9cf b0603e00 3b2839ea a6082f4d 2c7c9df9 3d4630aa a90f3936 8...4....`>.;(9.../M,|..=F0...96
258d5620 a6081fb0 b0a13c1c a2cc39d2 b17caa7c a5f62ada 3321a9bd a1a9aefe 36099f1c ......<...9..|.|..*.3!......6...
258d5640 3b10a326 3806ae88 acde9fdc a3a630a0 3d562e82 a4a12e85 390e35aa a5902078 ;..&8.........0.=V......9.5... x
258d5660 ac6329d6 36263802 33983c16 303ea8f8 a5302eb3 34ee35e8 a4adaaec 34d19bb3 .c).6&8.3.<.0>...0..4.5.....4...
258d5680 2c793183 325c3990 a4e9a678 303a35e4 2ebb3067 3590346e 31613724 31b6a817 ,y1.2\9....x0:5...0g5.4n1a7$1...
258d56a0 39b68800 a83b31d0 30e4353d 350d3892 33e32d22 2b8ea5e9 b7f1334e 353834e4 9....;1.0.5=5.8.3.-"+.....3N584.
258d56c0 351a37f3 38a63930 38d23884 38c43c3c 41bc36fa 3dd838fb 3932397e 3b283bde 5.7.8.908.8.8.<<A.6.=.8.929~;(;.
258d56e0 3ae03b94 3c113c28 3c47aedb 3b1c3d17 39283c51 414039ad 3ae13930 39013b5a :.;.<.<(<G..;.=.9(<QA@9.:.909.;Z
258d5700 39db3a33 43dca99b ac919fd9 3fb5a204 311899c6 a7e332ac 3882a703 9d569c63 9.:3C.......?...1.....2.8....V.c
258d5720 aa2bb218 a4cd34b9 ad02a5ad 38d64336 34d4b025 390a3939 3628ad3e b03a3f9f .+....4.....8.C64..%9.996(.>.:?.

【问题讨论】:

  • od 和 awk 结合起来可能是一种更简单的方法,我稍后会在我可以在笔记本电脑上打字时解释
  • 这个问题是重复的,但不是直接的:OP可以通过以下方式使用重复来解决他的问题:awk '{v=("0x"$1); v=strtonum(v)+0x258d5580; $1=sprintf("%0.8x",v)}1' file

标签: awk


【解决方案1】:

试试这个。

awk '{ $1 = sprintf("%08x", ("0x" $1) + "0x258d5580") } 1' file

您的 Awk 可能需要在脚本文本之前添加一个选项 --non-decimal-data

另外,我在 MacOS Mojave 上发现我必须在十六进制数字周围使用“0x...”才能使其成为字符串; OP报告相反。如果可移植性很重要,不妨考虑使用跨平台更统一的语言,比如 Python 或 Perl。

perl -pe 's/^([0-9a-f]+)/ sprintf("%08x", oct("0x$&")+0x258d5580) /e' file

【讨论】:

  • 你好,结果是:第一列全是00000000。你的建议是不是有错误?
  • 当我执行 awk '{ $1 = sprintf("%08x", ("0x" $1) + 0x258d5580) } 1' 文件时,第一列全是 258d5580,不增加 0x20。
  • 基于stackoverflow.com/questions/4614775/… 尝试添加选项--non-decimal-data。演示:ideone.com/WIf4Ex
  • 来自Posixawk 的历史实现不解析十六进制整数或浮动常量,如“0xa”和“0xap0”。由于疏忽,该标准的 2001 至 2004 版本需要支持十六进制浮点常量。这是由于对 atof() 的引用。此版本的标准允许但不要求实现使用 atof(),并包含如何将浮点数识别为匹配历史行为的替代方法的描述。
  • 修改$1 并打印整行比iMHO 的长长的参数列表要好得多。你太不耐烦了;我已经更新了。
【解决方案2】:

你最好使用能理解十六进制二进制转储的工具,比如 xxd(vim 包的工具部分)。

以下命令会将十六进制转储文件重新格式化为二进制并返回文本:

xxd -c 32 -r -s 0x258d5580 hexdumpfile | xxd -c 36 -g 4 -s 0x258d5580

选项说明:

-c 每列的字节数
-r 反向操作(采用十六进制转储并将其转换为二进制)
-g 组合在一起的字节数
-s 字节数跳过(搜索功能)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-03-02
    • 1970-01-01
    • 1970-01-01
    • 2012-03-13
    • 2011-05-25
    • 1970-01-01
    • 2016-08-22
    相关资源
    最近更新 更多