使用grep重组输出

时间:2013-10-29 04:22:44

标签: bash unix terminal grep

我有一些随机输入的数字,例如:

0x3000 0x80004000        # There are Many Random Strings Here#                        0x7000
0x8600 x1260       x1800 x45003045 # Random Strings #   

因此x后会有一个4位或8位数字。 我只需要获取4位数或8位数

我希望输出像这样,每行一个:

0x3000
0x80004000
0x7000
0x8600
x1260
x1800
x45003045

3 个答案:

答案 0 :(得分:0)

将文件通过sed替换为使用换行替换空格然后查找换行符(^)后跟x然后是数字或(|)换行符(^)后跟0x数字 如果你不想要十六进制(虽然我怀疑你怀疑你这样做)然后摆脱a-fA-F

cat yourfilehere | sed -e "s/[ \t]/\n/g" | grep -E "^x[0-9a-fA-F].*|^0x[0-9a-fA-F]*"

答案 1 :(得分:0)

awk解决方案

awk '{for (i=1;i<=NF;i++) if ($i~/[0-9]*x[0-9]+/) print $i}' file
0x3000
0x80004000
0x7000
0x8600
x1260
x1800
x45003045

要确保x之后只有4位或8位数字,您可以执行以下操作:

awk --re-interval '{for (i=1;i<=NF;i++) if ($i~/[0-9]*x([0-9]{4}|[0-9]{8})$/) print $i}' file

Gnu awk需要--re-interval才能启用区间表达式{4}

答案 2 :(得分:0)

grep方法:

grep -oP '0?x([0-9]{4}){1,2}' test.txt

如果需要,

  1. [0-9]可以更改为[0-9a-f]
  2. 可以添加
  3. -i选项以防止不区分大小写。
  4. e.g。

     $ cat test.txt
     0x3000 0x80004000        # There are Many Random Strings Here#                            0x7000
     0x8600 x1260       x1800 x45003045 # Random Strings #   
     0x123456
    
     $ grep -oP '0?x([0-9]{4}){1,2}' test.txt
     0x3000
     0x80004000
     0x7000
     0x8600
     x1260
     x1800
     x45003045
     0x1234