2017-04-11 39 views
1

這裏是谷歌驅動器上的測試文件。如何用awk列出所有非ASCII字節?

sample :test file

我想列出所有與測試文件的awk字節非ASCII字節,這超出\ x00- \ 0x7F部分。
\ x00- \ x7f之後有12個字節。

這是我的嘗試。

awk 'BEGIN{FS=""}{for(i=1;i<=NF;++i)if($i~/[^\x00-\x7f]/)print i,$i}' test 
146 「 
148 」 
181 「 
184 」 

awk 'BEGIN{FS=""}{for(i=1;i<=NF;++i)if($i~/[^\x00-\x7f]/)printf("%d %x \n", i,$i)}' test 
146 0 
148 0 
181 0 
184 0 

失敗,如何列出文件中的所有12個字節,如下格式。

146 e2 
147 80 
148 9c 
150 e2 
151 80 
152 9d 
185 e2 
186 80 
187 9c 
190 e2 
191 80 
192 9d 

test file in hex format with xxd test command

export LC_ALL=C 
awk 'BEGIN{FS=""}{for(i=1;i<=NF;++i)if($i~/[^\x00-\x7f]/)printf("%d %c\n",i,$i)}' test 
146 
147 � 
148 � 
150 
151 � 
152 � 
185 
186 � 
187 � 
190 
191 � 
192 � 

如何修復我的代碼?

+0

我想說,你忘記了2「非ascii」在你的照片組之前的2'e2'。 –

+0

2 ** e2 **已添加。 –

回答

1

我在UTF8殼:

$ locale 
LANG=en_US.UTF-8 
... 

所以首先:

$ export LC_ALL=C 

然後:

$ awk -F '' '       # split record in fields 
BEGIN { for(n=0;n<256;n++)   # iterate all values 
      ord[sprintf("%c",n)]=n } # make a hash ord[char]=n 
     { for(i=1;i<=NF;i++)   # iterate all fields 
      if(ord[$i]>127)   # beyond 7f 
       print ord[$i] }  # print n (value) 
' test 

輸出:

226 
128 
156 
226 
128 
157 
226 
128 
156 
226 
128 
157 

它在十六進制將是:

e2 
80 
9c 
... 
+1

也許再詳細解釋一下,基本問題是你需要將字符的數字ASCII碼,而不是字符本身傳遞給打印函數,而且Awk沒有內置的'ord()'函數,所以你通過創建一個數組來解決這個問題。 – tripleee