Linux 查找文本中控制字符所在的行

參考資料

  1. ASCIIコード表

目錄

  • 一. 業務背景
  • 二. 遇到的問題
  • 三. 分析
    • 3.1 url編碼的前置知識
    • 3.2 出現控制字符的`transactionid`分析
    • 3.3 16進制分析
  • 四. 從文本中查找控制字符所在的行
  • 五. 控制字符一覽


一. 業務背景

?在項目中,業務請求對應著下URL

http://www.test.com/?transactionid=uuid_jksje%0Eiuyh&item=20250635

① 其中transactionid=uuid_jksje%0Eiuyh代表每次交易所產生的訂單編號,后臺接收到請求之后,會從URL中獲取相應的參數,然后將其打印到日志中,最終會產生類似于下面這種日志

140 2024/07/08 12:35:01.547 c1server2	5485	[INFO]	SPLREQUEST	seqNo=11459,eventController=PMT.payinfoforprc.test.search,transactionid=uuid_jksje%0Eiuyh,code=MPLE2002
110	2024/07/08 12:34:56.457 c1server1	5892	[INFO]	MYCODE2005	測試方法被調用。(method=selectSvc_Test_Id param cpId=16xx2 status=OK)	userid=adminUser
150 2024/07/08 12:35:02.231 c1server3	5634	[INFO]	SPLREQUEST	seqNo=11460,eventController=PMT.payinfoforprc.test.search,transactionid=uuid_8934jsklsdf23,code=MPLE1001
120	2024/07/08 12:34:57.235 c1server1	5675	[INFO]	MYCODE2005	測試方法被調用。(method=selectSvc_Test_Id param cpId=16xx2 status=OK)	userid=adminUser

② 服務器中,有一個batch每天夜里執行,從每天的日志中抽取數據做成csv文件,然后傳送給其他系統用于數據分析。
做成的csv數據的例子如下所示

20250725,1,,,uuid_8934jsklsdf23,MPLE1001,0
20250819,1,,,uuid_klj0345ljhnhl,MPLE1001,0
20250819,1,,,uuid_672342njkjhjs,MPLE1001,0

二. 遇到的問題

最近接到子系統反饋,部分csv文件存在亂碼問題。
使用Linux命令來重現的話,類似于這種情況

?正常情況下的csv文件

apluser@ubuntu24:~$ cat <(echo -e "20250635,1,,,uuid_jksje%0Eiuyh,MPLE2002,0\n20250725,1,,,uuid_8934jsklsdf23,MPLE1001,0") | nkf -w
20250635,1,,,uuid_jksje%0Eiuyh,MPLE2002,0
20250725,1,,,uuid_8934jsklsdf23,MPLE1001,0

😓接到反饋的csv文件

apluser@ubuntu24:~$ cat <(echo -e "20250635,1,,,uuid_jksje\x0Eiuyh,MPLE2002,0\n20250725,1,,,uuid_8934jsklsdf23,MPLE1001,0") | nkf -w
20250635,1,,,uuid_jksjeャヘミフナイーーイャー
イーイオーキイオャアャャャ゜クケウエイウャヘミフナアーーアャー

🤔經過調查發現日志文件中的transactionid部分混入了控制字符\x0E,從而導致csv文件中也混入了控制字符\x0E,進而導致亂碼問題的發生。也就是說日志中的transactionid的值應該是uuid_jksje%0Eiuyh,但實際上transactionid給變成了uuid_jksje\x0Eiuyh
也就是說transactionid中的%0E居然給轉換為\x0E


三. 分析

3.1 url編碼的前置知識

?以下字符可以在 URL 中直接使用,而無需編碼:

  • 英文字母:A-Z、a-z
  • 數字:0-9
  • 部分符號:- _ . ~

?任何 非 ASCII 字符(ASCII 碼 > 127) 都必須編碼,例如:

  • 中國%E4%B8%AD%E5%9B%BD
  • 日本%E6%97%A5%E6%9C%AC
  • 😀 → %F0%9F%98%80

?這些字符在 URL 中有特殊含義,如果用于數據內容,則必須編碼

字符說明URL 編碼
:冒號%3A
/斜杠%2F
?問號%3F
#井號%23
[左方括號%5B
]右方括號%5D
@艾特%40
!感嘆號%21
$美元符號%24
&和號%26
'單引號%27
(左括號%28
)右括號%29
*星號%2A
+加號%2B
,逗號%2C
;分號%3B
=等號%3D

?例如京東的手機搜索頁面的URL
https://search.jd.com/Search?keyword=手機

?我們直接通過復制網頁的URL,得到的是如下內容
https://search.jd.com/Search?keyword=%E6%89%8B%E6%9C%BA
可以看到 手機 被轉換成 %E6%89%8B%E6%9C%BA

?通過JavaScript進一步驗證

在這里插入圖片描述

3.2 出現控制字符的transactionid分析

?下圖展示了混有控制字符的日志

在這里插入圖片描述
?通過下面的linux命令可以進行再現

  • echo -e 選項的作用是啟用轉義序列,讓 \n(換行)、\t(制表符)等特殊字符生效。
  • 此處的作用是讓\x0E當做轉義字符生效
echo -e "seqNo=11459,eventController=PMT.payinfoforprc.test.search,transactionid=uuid_jksje\x0Eiuyh,code=MPLE2002" > 文件名.txt

如果通過JavaScript的decodeURIComponent()函數來進行轉換的話,也可以得到相同的效果

decodeURIComponent("uuid_jksje%0Eiuyh")  # uuid_jksje\x0Eiuyh

也就說,后臺對下面日志輸出的時候,應當將"uuid_jksje%0Eiuyh視為普通的文本,而不是將其解析為uuid_jksje\x0Eiuyh
就算解析為uuid_jksje\x0Eiuyh,也應當將其視為普通文輸出到日志中,而不應當將\x0E視作轉義字符進行轉義。

3.3 16進制分析

將正常的transactionid和混有控制字符的transactionid的日志部分截取出來,放在文本編輯器中,通過16進制進行查看,

  • 正常的transactionid中的%0E所對應的16進制分別是20,30,45
  • 而混有控制字符的transactionid卻把普通文本的0E給解析為16進制的0e

🧐文本編輯器使用的是notepadd++,需要下載HEX-Editor插件進行查看
在這里插入圖片描述


四. 從文本中查找控制字符所在的行

?創建文件

touch TEMP_T01.dat
echo -e "20250635,1,,,uuid_jksje\x0Eiuyh,MPLE2002,0" > TEMP_T01.dat
echo -e "20250725,1,,,uuid_8934jsklsdf23,MPLE1001,0" >> TEMP_T01.dat
echo -e "20250819,1,,,uuid_klj0345ljhnhl,MPLE1001,0" >> TEMP_T01.dat
echo -e "20250635,1,,,uuid_yumkg\x0Eimbt,MPLE2002,0" >> TEMP_T01.dat
echo -e "20250819,1,,,uuid_672342njkjhjs,MPLE1001,0" >> TEMP_T01.dat

?使用notepad++查看創建的文件

在這里插入圖片描述

  • grep -P "\x0E":精確查找\x0E的控制字符
  • cat -v | grep '\^N':將\x0E的控制字符表示為^N
# 按照指定的控制字符 \x0E 進行查找
$ grep -P "\x0E" TEMP_T01.dat
20250635,1,,,uuid_jksjeiuyh,MPLE2002,0
20250635,1,,,uuid_yumkgimbt,MPLE2002,0#  cat -v 會將控制字符特殊表示,其中 \x0E 會被表示為 ^N
$ cat -v TEMP_T01.dat | grep '\^N'
20250635,1,,,uuid_jksje^Niuyh,MPLE2002,0
20250635,1,,,uuid_yumkg^Nimbt,MPLE2002,0

?按照控制字符的范圍進行查找

  • grep -P '[\x00-\x1F]'
  • grep -E '[[:cntrl:]]'
# 按照控制字符的范圍進行查找
$ grep -P '[\x00-\x1F]' TEMP_T01.dat
20250635,1,,,uuid_jksjeiuyh,MPLE2002,0
20250635,1,,,uuid_yumkgimbt,MPLE2002,0# 按照控制字符的范圍進行查找
$ grep -E '[[:cntrl:]]' TEMP_T01.dat
20250635,1,,,uuid_jksjeiuyh,MPLE2002,0
20250635,1,,,uuid_yumkgimbt,MPLE2002,0

五. 控制字符一覽

10進制16進制code全拼意思
000NULNull空文字
101SOHStart Of Headingヘッダ開始
202STXStart Of Textテキスト開始
303ETXEnd Of Textテキスト終了
404EOTEnd Of Transmission伝送終了
505ENQEnquiry問い合わせ
606ACKAcknowledgement肯定応答
707BELBell警告音を鳴らす
808BSBack Space一文字後退
909HTHorizontal Tabulation水平タブ
100aLF / NLLine Feed / New Line改行
110bVTVertical Tabulation垂直タブ
120cFF / NPForm Feed / New Page改ページ
130dCRCarriage Return行頭復帰
140eSOShift Outシフトアウト(多バイト文字終了)
150fSIShift Inシフトイン(多バイト文字開始)
1610DLEData Link Escapeデータリンク拡張(バイナリ通信開始)
1711DC1Device Control 1裝置制御1
1812DC2Device Control 2裝置制御2
1913DC3Device Control 3裝置制御3
2014DC4Device Control 4裝置制御4
2115NAKNegative Acknowledgement否定応答
2216SYNSynchronous idle同期
2317ETBEnd of Transmission Block伝送ブロック終了
2418CANCancel取り消し
2519EMEnd of Medium記録媒體終端
261aSUB / EOFSubstitute / End Of File文字置換 / ファイル終端
271bESCEscapeエスケープ(特殊文字開始)
281cFSFile Separatorファイル區切り
291dGSGroup Separatorグループ區切り
301eRSRecord Separatorレコード區切り
311fUSUnit Separatorユニット區切り
3220SPCSpace空白文字
1277fDELDelete一文字削除

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/76627.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/76627.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/76627.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

python將pdf文件轉為圖片,如果pdf文件包含多頁,將轉化的多個圖片通過垂直或者水平合并成一張圖片

要將PDF文件轉換為圖片&#xff0c;并將多頁PDF垂直合并成一張圖片&#xff0c;可以使用PyMuPDF&#xff08;也稱為fitz&#xff09;庫來讀取PDF文件&#xff0c;并使用Pillow庫來處理和合并圖片。以下是一個示例代碼&#xff0c;展示了如何實現這個功能&#xff1a; 首先&…

HarmonyOS 基礎組件和基礎布局的介紹

1. HarmonyOS 基礎組件 1.1 Text 文本組件 Text(this.message)//文本內容.width(200).height(50).margin({ top: 20, left: 20 }).fontSize(30)//字體大小.maxLines(1)// 最大行數.textOverflow({ overflow: TextOverflow.Ellipsis })// 超出顯示....fontColor(Color.Black).…

FrameWork基礎案例解析(四)

文章目錄 單獨拉取framework開機與開機動畫橫屏Android.mk語法單獨編譯SDKmake 忽略warning單獨修改和編譯Camera2單獨編譯Launcher3Android Studio 導入、修改、編譯Settings導入 Android Studio 導入、修改、編譯Launcher3android 開機默認進入指定Launcher植入自己的apk到系…

基于vscode(GDB)調試ros2節點

一、環境準備 必備vscode插件 1&#xff09;Docker Docker - Visual Studio Marketplace 2&#xff09;Dev Containers Dev Containers - Visual Studio Marketplace 3&#xff09;GDB GDB Debug - Visual Studio Marketplace 二、進去docker鏡像 1&#xff09;docker安…

基于springboot的考研成績查詢系統(源碼+lw+部署文檔+講解),源碼可白嫖!

摘要 這些年隨著Internet的迅速發展&#xff0c;我們國家和世界都已經進入了互聯網大數據時代&#xff0c;計算機網絡已經成為了整個社會以及經濟發展的巨大動能&#xff0c;考研成績查詢管理事務現在已經成為社會關注的重要內容&#xff0c;因此運用互聯網技術來提高考研成績…

C++:算術運算符

程序員Amin &#x1f648;作者簡介&#xff1a;練習時長兩年半&#xff0c;全棧up主 &#x1f649;個人主頁&#xff1a;程序員Amin &#x1f64a; P? ?S : 點贊是免費的&#xff0c;卻可以讓寫博客的作者開心好久好久&#x1f60e; &#x1f4da;系列專欄&#xff1a;Java全…

PyQt6實例_A股日數據維護工具_使用

目錄 前置&#xff1a; 下載預備更新的數據 使用工具更新 用工具下載未復權、前復權、權息數據 在PostgreSQL添加兩個數據表 工具&視頻 前置&#xff1a; 1 本系列將以 “PyQt6實例_A股日數據維護工具” 開頭放置在“PyQt6實例”專欄 2 日數據可在“數據庫”專欄&…

REST 方法

FUNCTION ZFM_INTERFACE_LOG. *"---------------------------------------------------------------------- *"*"本地接口&#xff1a; *" IMPORTING *" REFERENCE(IV_DSTART) TYPE EDI_UPDDAT *"---------------------------------------…

QT 中的元對象系統(五):QMetaObject::invokeMethod的使用和實現原理

目錄 1.簡介 2.原理概述 3.實現分析 3.1.通過方法名調用方法的實現分析 3.2.通過可調用對象調用方法的實現分析 4.使用場景 5.總結 1.簡介 QMetaObject::invokeMethod 是 Qt 框架中的一個靜態方法&#xff0c;用于在運行時調用對象的成員函數。這個方法提供了一種動態調…

Unity3D開發AI桌面精靈/寵物系列 【三】 語音識別 ASR 技術、語音轉文本多平臺 - 支持科大訊飛、百度等 C# 開發

Unity3D 交互式AI桌面寵物開發系列【三】ASR 語音識別 該系列主要介紹怎么制作AI桌面寵物的流程&#xff0c;我會從項目開始創建初期到最終可以和AI寵物進行交互為止&#xff0c;項目已經開發完成&#xff0c;我會仔細梳理一下流程&#xff0c;分步講解。 這篇文章主要講有關于…

Java 狀態模式 詳解

狀態模式詳解 一、狀態模式概述 狀態模式(State Pattern)是一種行為型設計模式&#xff0c;它允許一個對象在其內部狀態改變時改變它的行為&#xff0c;使對象看起來似乎修改了它的類。 核心特點 狀態封裝&#xff1a;將每個狀態的行為封裝到獨立的類中狀態轉換&#xff1a…

Nginx 配置 HTTPS 與 WSS 完整指南

Nginx 配置 HTTPS 與 WSS 完整指南 本教程將手把手教你如何為網站配置 HTTPS 加密訪問&#xff0c;并通過反向代理實現安全的 WebSocket&#xff08;WSS&#xff09;通信。以 https://www.zhegepai.cn 域名為例&#xff0c;完整流程約需 30 分鐘完成。 一、前置準備 1.1 域名…

雙向鏈表的理解

背景 代碼中經常會出現雙向鏈表&#xff0c;對于雙向鏈表的插入和刪除有對應的API函數接口&#xff0c;但直觀的圖表更容易理解&#xff0c;所以本文會對rt-thread內核代碼中提供的雙向鏈表的一些API函數操作進行繪圖&#xff0c;方便后續隨時查看。 代碼塊 rt-thread中提供…

大文件上傳源碼,支持單個大文件與多個大文件

大文件上傳源碼&#xff0c;支持單個大文件與多個大文件 Ⅰ 思路Ⅱ 具體代碼前端--單個大文件前端--多個大文件前端接口后端 Ⅰ 思路 具體思路請參考我之前的文章&#xff0c;這里分享的是上傳流程與源碼 https://blog.csdn.net/sugerfle/article/details/130829022 Ⅱ 具體代碼…

Unity中的靜態合批使用整理

靜態批處理是一種繪制調用批處理方法&#xff0c;它組合不移動的網格以減少繪制調用。它將組合的網格轉換為世界空間&#xff0c;并為它們構建一個共享頂點和索引緩沖區。然后&#xff0c;對于可見網格&#xff0c;Unity 會執行一系列簡單的繪制調用&#xff0c;每個調用之間幾…

【機器學習中的基本術語:特征、樣本、訓練集、測試集、監督/無監督學習】

機器學習基本術語詳解 1. 特征&#xff08;Feature&#xff09; 定義&#xff1a;數據的屬性或變量&#xff0c;用于描述樣本的某個方面。作用&#xff1a;模型通過學習特征與目標之間的關系進行預測。示例&#xff1a; 預測房價時&#xff0c;特征可以是 面積、地段、房齡。…

C++學習之路:指針基礎

目錄 指針介紹與基本用法雙重指針函數指針空指針與野指針函數參數的指針傳遞最后 指針一般在C/C語言學習的后期接觸&#xff0c;這樣就導致指針給新手一種高深莫測、難以掌握的刻板印象。但實際上指針的使用很簡單&#xff0c;并且還能夠極大的提高程序的靈活性&#xff0c;幫助…

【服務日志鏈路追蹤】

MDCInheritableThreadLocal和spring cloud sleuth 在微服務架構中&#xff0c;日志鏈路追蹤&#xff08;Logback Distributed Tracing&#xff09; 是一個關鍵需求&#xff0c;主要用于跟蹤請求在不同服務間的調用鏈路&#xff0c;便于排查問題。常見的實現方案有兩種&#x…

Kafka+Zookeeper從docker部署到spring boot使用完整教程

文章目錄 一、Kafka1.Kafka核心介紹&#xff1a;?核心架構?核心特性?典型應用 2.Kafka對 ZooKeeper 的依賴&#xff1a;3.去 ZooKeeper 的演進之路&#xff1a;注&#xff1a;&#xff08;本文采用ZooKeeper3.8 Kafka2.8.1&#xff09; 二、Zookeeper1.核心架構與特性2.典型…

JUC系列JMM學習之隨筆

JUC: JUC 是 Java 并發編程的核心工具包,全稱為 Java Util Concurrent,是 java.util.concurrent 包及其子包的簡稱。它提供了一套強大且高效的并發編程工具,用于簡化多線程開發并提高性能。 CPU核心數和線程數的關系:1核處理1線程(同一時間單次) CPU內核結構: 工作內…