pretty code

顯示具有 awk 標籤的文章。 顯示所有文章
顯示具有 awk 標籤的文章。 顯示所有文章

2024年8月18日 星期日

每天都有新發現的 Linux

今天無意間看到一個 Youtube 推薦的駭客影片,雖然內容類似在解譯大陸牌子的網路攝影機 HTTPS 封包的內容,但在觀看的過程中,無意間發現作者使用了一個 "find ." 指令來列出現在目錄下的所有檔案,雖然我們可以用 ls -l 來印出檔案,但還需要再用 awk 取出檔名欄位,也無法列出子目錄的檔案,應該吧?

最近在整理別人的 code list 並加到 Synthesis TCL script 中,之前還傻傻的一個目錄一個目錄進去 ls,原來還有更快的方法,只要組合一堆指令,然後在根目錄打出這一串組合指令即可。

find . | sed -Ee 's/\.\/(.*)/\1/g' | awk -v var="$PWD" '{print var "/" $1}'

因為 "find ." 列出所有的檔案前面會包含 ".",雖然不影響結果,但看了就是不順眼XD

接著使用 sed 把 "." 去掉,最後再用之前這篇文章的做法,加上 $PWD 字串。


不得不承認 Linux 跟 vim 一樣,每天都能發現新玩意!

雖然我覺得一定還有其他做法,但等到下次發現新大陸時再說吧XD

2024/08/19 更新

原來用 "ls -1" 可以只列出檔案名稱並且 line by line 顯示。

所以我建了兩條 alias,一個配合 "ls -1",一個用 find 跨目錄搜尋。

因為用 alias 要跳脫,故把 fabs_name 簡化一下,不要把 "find ." 結果的 "/" 濾掉,將 "\/" 改放進括弧內 (\/.*) 也就是我們要取的 \1,這樣後面的 awk print 就可以簡化,不然很難懂XD


2024年7月10日 星期三

2024 week 28 新玩意

01. 工作站 grep

假設我要找 cell,但不要 .db 的檔案。

grep -r pattern --exclude="*.db"

也可以正向表列

grep -r pattern --include="*.lib"

至於為什麼要加上雙引號?那是因為整個指令傳給 grep 時,*.lib 會被 shell 轉譯過一遍,所以會造成問題,因此要加上雙引號或單引號。

不過照連結所述,當前目錄如果沒有 .lib 檔案應該是要沒問題的,我不確定是否是工作站 grep 版本過舊導致。


晚上用 Windows 11 WSL - Ubuntu 22.04.2 LTS 試了一下,確實是不用加上星號,看來是版本問題?


2024/07/12 更新

更精確來說,既然問題是出在被 shell 過了一手,那應該是 shell 版本的問題,工作站使用的是 tcsh,在我改用 bash 後,這個問題就消失了。

為了之後工作效率著想,以後不管是 glob or regex pattern,最好都用雙引號框住,才不會在急著需要做甚麼事的時候又出問題。

晚上在 WSL 裝了 tcsh 6.21.00,不加上雙引號仍然會有問題,開始懷疑是 tcsh 的 feature 了XD



02. Yosy 執行方式

Yosys 總共有好幾種執行方式:

Run directly
直接執行,手動下 command。

-c *.tcl ( refer to tcl command )
將指令寫在 tcl script 中,最前面要加上 yosys -import,才可以執行 yosys command。

使用這個模式的好處是可以用 tcl 語法,靈活性最大。

-s *.ys ( refer to script command )
將指令寫在 script 中,與 -c 差別在不需要 yosys -import 就可以執行 yosys command。

也因為不是走 tcl callbak,故整個檔案的解析都在 run_frontend 這個函數中。

yosys *.ys
同上,會在 run_frontend 中,執行 default auto command 並靠副檔名決定執行 script command。

嚴格來說上面兩個 run_frontend 執行的地方不一樣,這裡是在 while (optind < argc) 的敘述裡。

yosys xxx
因為沒有副檔名可供判斷,故在 run_frontend 中便會報錯。


03. 工作站 Shell

因為 EDA tool 緣故,大部分工作站預設的 Shell 都是跑 csh(tcsh)。但是自己寫的 Shell script,如果第一行沒有指定 Shell,則預設是跑 bash。

我想一般人應該都是比較熟悉 bash 吧?我不確定此行為是我們工作站獨有,還是 Linux 都是這樣?不過經我剛才在 WSL Ubuntu 上 22.04 實測,看起來未指定第一行會以預設 Shell 來執行。


04. alias 進階用法


雖然我後來才知道有 realpath 這個外部 command 可用,但當初想知道如何用 awk 達成此目的,也算在 shell script 中撞了一堆坑,故想要留下個記錄。以後凡事還是要先 Google,畢竟你的需求別人應該也早就碰到過了,很多事應該不用都自己來才合理。

話說回來,想要用 alias 包裝 command,遇到像雙引號或是 $ 這種特殊符號,就是用接續的方式來處理指令。

畫橘色線的是一個一個串接指令的字串,雙引號和 $ 是直接在 Shell 中,故要加上跳脫字元。

我這裡用的 shell 是 bash,tcsh 也是同樣的道理,差別在 alias 語法不是用等號而是空白。

2024/07/19 更新

晚上實測一下,realpath 無法接受 pipeline,故也不是萬能!

想要在當前目錄下找 Cell Library - realpath *.lib
想要用 grep 遞迴搜尋 Cell name - 還是只能用 awk 也就是這邊用的 alias ($9 改 $1 比較通用,有需要再用 awk 切一次)方式。

2024年4月10日 星期三

2024 week 15 新玩意

01. awk sum

假設有一文字檔內容如下:

ABC    1
ABC    2

可以用 cat txt_file | awk 'BEGIN {sum = 0} {sum += $2} END {print sum}' 得到加總後數字。

02. VIM vertical column rule

使用下面指令便可以在 8 的位置增加一條垂直線,方便觀看階層資料。

set colorcolumn=8

03. VIM 摺疊文字

選取文字後

zf 摺疊
zo 打開

04. VIM 選取一大片文字

V + xxgg 

05. Synthesis 小疑問

最近在做合成時,發現有些 instance 在做完合成後會被吃掉,連帶原本的 module RTL code 也會一併被移除,雖然覺得是因為這個實體的 output 未被任何 logic 使用,但還是很不確定,最後看到一個寫得很清楚的文章。


結論不只是 output,input 也會有同樣的狀況。

06. tcsh redirect

一般較常用的 bash
ls > file 2>&1

tcsh
ls >& file

2024年3月23日 星期六

這週新玩意

01. Verilog 奇怪語法

wire [63:0] data;
wire [7:0] array [7:0];

array [0] = data[0+:8] 前面指的是 base,後面指的是寬度,意思是從 base + width 的範圍,也就是等於 data[8:0]。

這個語法是從 Verilog 2001 開始的,請詳 4.2.1 Vector bit-select and part-select addressing。

02. sed

sed -i "s/abc/def/g" file_name

每次都會忘記,-i 表示要修改檔案,要把所有的 abc 取代成 def。

03. search cell name in cell files

grep -EH 'cell\s*\(\s*\"*sky130_fd_sc_hd__a22o_1' *.lib | sed 's/:\s*cell/ /g' | awk -v var="$PWD" '{print var "/" $1}'

為了在眾多檔案裡找到 cell 位在那個 cell libraries?利用上述語法,我可以得到完整的路徑,便可以貼到我的檔案去做後續的處理。


-EH 要看 grep 版本,我的 WSL 需要這兩個,E 表示 extend,H 表示顯示檔案名,記得工作站不需要。

sed 是把找到的檔案,將檔名跟搜尋 pattern 分開隔出空白。

awk 則是把 $PWD 環境變數傳進去,利用 print 組出完整檔案路徑。

2023年12月28日 星期四

Some tips in Makefile - 001

今天開始接觸未來可能的工作流程,雖然只是練習用,但也算是有點感覺了。

主管還很貼心的提供了一個小測驗,由於我對 Tcl 或是 Makefile 都只是略懂,一開始先花點時間整理脈絡,直到看到主管說的關鍵字後,便開始主攻這個測驗。

雖然這個測驗有點像腦筋急轉彎?但在一步一步分解問題後,最後還是能找到解法,但我也花了一個小時多有,還好在吃飯前順利搞定。

簡單快速紀錄一下,今天學到的東西XD

01. Makefile 變數賦值

= 在使用到變數時展開。
:= 宣告變數時就展開。
?= 變數為空時才給值。
+= 將值附加到原本變數。

02. .DEFAULT_GOAL

如題,此變數為 GNU make 的一個特殊變數,有設定這個,假設 make 後面沒帶 target 就會以這個變數為主,而不是檔案中找到的第一個 target。

03. $$0 in awk command of Makefile

原本 awk 取原始字串是 $0,但在 Makefile 中 $ 有特殊用途,故在 awk 指令中,需要多加一個 $。

另外,如果想印出 $@,則應該要這樣寫 @echo \$$@。

04. env variable in Tcl

puts $::env(OS),此指令的意思是印出 OS 這個環境變數,env 本身是 array,array in Tcl 是關聯陣列。

05. call proc in some Tcl files.

source $::env(SCRIPTS_DIR)/report_metrics.tcl
report_metrics 6 "finish"

report_metrics.tcl 檔案中都是函數,這樣就可以呼叫該檔案裡面的 report_metrics 函數。

06. /usr/bin/time -f '%E %MKb' sleep 5

time 是用來記錄執行指令的時間,不同的 format 可以顯示不同的資訊,上面表示記錄 sleep 5 執行的時間及最大記憶體使用。

07. export QT_QPA_PLATFORM = offscreen,console 執行時就不會報錯。

08. $(shell command -v ls)

執行 command 查詢 ls 指令。

09. awk, mawk, gawk 三個是不同的程式

awk 'match($$0, pattern, array) 是錯的,因為這是 gawk 才有的語法,awk 有 match 但不能將 pattern 裡面抓到的 group 資訊存到 array。

2019年7月4日 星期四

awk 小技巧

這是第 2 次在相關專案中看到一樣的 awk 技巧,感覺還蠻好用的,記錄一下,以備不時之需。

假設我們使用 ls -al 列出所有檔案。

total 100
drwxrwxr-x 15 sw3 sw3  4096  六  17 16:59 .
drwxrwxr-x  3 sw3 sw3  4096  六  17 16:58 ..
-rw-rw-r--  1 sw3 sw3  1472  六  17 16:59 benchmark_readme_template.md
drwxrwxr-x  2 sw3 sw3  4096  六  17 16:59 community
drwxrwxr-x  6 sw3 sw3  4096  六  17 16:59 compliance
-rw-rw-r--  1 sw3 sw3  2359  六  17 16:59 CONTRIBUTING.md
drwxrwxr-x  3 sw3 sw3  4096  六  17 16:59 data_generation
drwxrwxr-x  8 sw3 sw3  4096  六  17 16:59 .git
-rw-rw-r--  1 sw3 sw3    74  六  17 16:59 .gitignore
-rw-rw-r--  1 sw3 sw3   298  六  17 16:59 .gitmodules
drwxrwxr-x  3 sw3 sw3  4096  六  17 16:59 image_classification
-rwxrwxr-x  1 sw3 sw3  1133  六  17 16:59 install_cuda_docker.sh
-rw-rw-r--  1 sw3 sw3 11348  六  17 16:59 LICENSE.md
drwxrwxr-x  3 sw3 sw3  4096  六  17 16:59 object_detection
-rw-rw-r--  1 sw3 sw3  3193  六  17 16:59 README.md
drwxrwxr-x  4 sw3 sw3  4096  六  17 17:36 recommendation
-rw-rw-r--  1 sw3 sw3   771  六  17 16:59 reference_results.md
drwxrwxr-x  3 sw3 sw3  4096  六  17 16:59 reinforcement
drwxrwxr-x  3 sw3 sw3  4096  六  17 16:59 rnn_translator
drwxrwxr-x  3 sw3 sw3  4096  六  17 16:59 sentiment_analysis
drwxrwxr-x  3 sw3 sw3  4096  六  17 16:59 single_stage_detector
drwxrwxr-x  4 sw3 sw3  4096  六  17 16:59 speech_recognition
drwxrwxr-x  3 sw3 sw3  4096  六  17 16:59 translation
這時我們可以用 awk '{print $9}' 取出檔案名,$0 是原始字串,其他就照順序從 1 開始。

如果想一氣呵成將它產生到另外一個檔案,我們可以把指令一起下完。

ls -al | awk '{print $9}' > tmp.log