2017-06-04 23 views
2

有人知道一個輸入可以輸入到bash中的一個輸入符號,用於匹配和轉換所有出現的十六進制數字並保持所有其他文本不變?bash:oneliner將輸出中的十六進制數字轉換爲小數

  • 也許匹配這可能是一個十六進制 應通過正則表達式以某種方式轉換而任意的輸出,即 /(0x)?[0-9a-fA-F]{5,}/
  • 領先0x不得neccessary,但 也可以正確處理
  • 可以有假陽性,如果不是 指定的最小長度的數字,但不應該是 問題
  • 目標是找到解決方案,可以使用作爲米UCH爲十六進制數可能的輸出在他們

應該像輸出工作:在計算器

ssg sjas # cat /proc/net/stat/arp_cache | column -t 
entries allocs destroys hash_grows lookups hits  res_failed rcv_probes_mcast rcv_probes_ucast periodic_gc_runs forced_gc_runs unresolved_discards table_fulls 
0000000d 00000006 00000004 00000000 0000c3b9 0000c35e 00000000 00000000   00000000   0000965b   00000000  00000000    00000000 
0000000d 0000000d 00000004 00000001 00000000 00000000 00000000 00000000   00000000   000007cd   00000000  00000000    00000000 
0000000d 00000008 00000008 00000001 00000000 00000000 00000000 00000000   00000000   000006e0   00000000  00000000    00000000 
0000000d 0000000a 00000008 00000000 00000000 00000000 00000002 00000000   00000000   00000704   00000000  00000000    00000000 

其他大多數問題只解決如何以單數數字系統之間進行轉換的問題,只做轉換爲指定列或徹底殺死輸入中存在的格式。

所需的輸出應該是這樣的:(column -t反正是有,它真的只需要更換的十六進制值,它可以找到,並添加前導零的printf語句也沒有問題)

ssg sjas # cat /proc/net/stat/arp_cache | perl -pe 's/(?:0x)?[0-9a-f]{5,}/hex($&)/ge' | column -t 
entries allocs destroys hash_grows lookups hits res_failed rcv_probes_mcast rcv_probes_ucast periodic_gc_runs forced_gc_runs unresolved_discards table_fulls 
13  6  4   0   50105 50014 0   0     0     38491    0    0     0 
13  13  4   1   0  0  0   0     0     1997    0    0     0 
13  8  8   1   0  0  0   0     0     1760    0    0     0 
13  10  8   0   0  0  2   0     0     1796    0    0     0 

我在過去的兩個小時內通過sed/awk/perl找不到可行的/可靠的解決方案,所以我來這裏尋求幫助。

+0

請將您希望的輸出樣本輸入添加到您的問題中。 – Cyrus

+0

@Cyrus做到了。 – sjas

+0

期望的輸出與輸入不匹配,爲什麼'0000c1c5'轉換爲'0'? – 123

回答

3

Perl來代換

perl -pe 's/(0x)?[0-9a-f]{5,}/hex $&/ge' file | column -t 
-1

一個領先的0被認爲是八進制的,而一個領先的0x被認爲是十六進制的。如果您的號碼符合該標準,那麼$((<number>))將其轉換爲十進制:

$ echo $((0x1b)) 
27 
$ echo $((014)) 
12 
+0

這顯然不是關於轉換孤獨的數字,而是完整的輸出。 – sjas

0

GNU awk

awk 'BEGIN{IFS=OFS="\t"}NR==1{print $0}{for(i=1;i<=NF;i++) if(i!=NF){printf "%s%c",strtonum("0x"$i),OFS}else{printf "%d\n",strtonum("0x"$i)}}' filename 
+0

這與我已經非常相似,但不能按預期工作。即'0000000d'被轉換爲'0'而不是'13'。 – sjas

+0

是的。我編輯過。 – tso

2

的Perl與自動分割開關:

perl -anE'say join " ", map {/(?:0x)?([0-9a-f]{5,})/i ? hex $1 : $_} @F' file | column -t 

-n選項爲文件的行提供了一個隱式循環。

-E開關提供可選功能,如say命令(用於打印帶自動回車符的東西)。 -E也與執行參數中給出的代碼的-e開關(而不是查找要啓動的文件)相同。

-a開關(autosplit)將每行分割爲空格,並用零件填充@F數組(如awk)。

map { } @F處理@F的每個元素並返回一個新的數組。使用三元運算符condition ? true : false。當模式匹配時,它返回轉換後的捕獲組1,當它不是原始部分時。

請注意,Perl是一種考慮上下文的​​語言。 $_內部的map {}是指@F項目,而/(?:0x)?([0-9a-f]{5,})/i$_ =~ /(?:0x)?([0-9a-f]{5,})/i的簡短版本。 (的map {}$_外面是當前行)使用e標誌

+0

不錯,這個作品!非常非常感謝你。 – sjas

+0

@sjas:沒有我的錯@ @ 123回答是正確的,因爲'print hex「0x10」'*(這次引用)*如預期的那樣返回'16'。你應該接受他的答案,而不是我的更短 –

+0

@CasimiretHippolyte:謝謝你的偉大代碼,請你也可以添加解釋,我是一個Perl初學者。 – RavinderSingh13

1

隨着mawk:每行,但第一行(NR!=1)從第一個到最後一列循環(NF )並將當前列($i)從十六進制轉換爲十進制。

mawk 'NR!=1 {for (i=1; i<=NF; i++) $i=sprintf("%d ","0x"$i)}1' file | column -t 

輸出:

 
entries allocs destroys hash_grows lookups hits res_failed rcv_probes_mcast rcv_probes_ucast periodic_gc_runs forced_gc_runs unresolved_discards table_fulls 
13  6  4   0   49696 49605 0   0     0     38201    0    0     0 
13  13  4   1   0  0  0   0     0     1984    0    0     0 
13  8  8   1   0  0  0   0     0     1752    0    0     0 
13  10  8   0   0  0  2   0     0     1775    0    0     0 
1

很抱歉的混亂。這是一個使用bash的功能的單行程式:

cat /proc/net/stat/arp_cache | sed -e '2,$s/\s*\([0-9a-f][0-9a-f]*\)\s*/ \$\(\(0x\1 \)\) /g' -e 's/^/echo /' | bash | column -t 
entries allocs destroys hash_grows lookups hits res_failed rcv_probes_mcast rcv_probes_ucast periodic_gc_runs forced_gc_runs unresolved_discards table_fulls 
8  2  0   0   0  0  0   0     0     0     0    0     0 
8  0  0   0   211  58 0   0     0     0     0    0     0 
8  2  0   0   6319  1677 0   0     0     3882    0    0     0 
8  4  0   0   4731  1299 0   0     0     0     0    0     0 
+1

Oooooo !!!我喜歡!修復。謝謝! – Jack

+0

您確實添加了另一個答案,並且自己添加了一條評論,表示您喜歡新答案?這只是'meh'。 – sjas

+0

不,我正在迴應另一條評論(顯然已刪除),建議我用'| tmp $$ && source ./tmp$$'替換'> tmp $$ && source ./tmp$$'。 bash'。我猜他決定刪除他的評論,因爲我根據他的建議編輯了我的答案。 – Jack

相關問題