二、Linux系統安裝和基本使用

zhywyt發表於2024-08-12

Linux系統安裝和基本使用

這裡我想記錄自己在學習中遇到的有趣的、讓自己覺得學到了的點。

Vim的使用

文章中舉出的兩個git power的例子非常有意思,我們來分析一下:

宏錄製

The first example is to generate the following file:

1
2
3
.....
98
99
100

This file contains 100 lines, and each line contains a number. What will you do? In vim, this is a piece of cake. First change vim into normal state (when vim is just opened, it is in normal state), then press the following keys sequentially:
i1<ESC>q1yyp<C-a>q98@1
where means the ESC key, and means "Ctrl + a" here. You only press no more than 15 keys to generate this file. Is it amazing? What about a file with 1000 lines? What you do is just to press one more key:

這個例子用到了我自己並不清楚的一些操作,但是我希望透過查閱資料理解他們。i1<ESC>q1,我都能看懂。首先透過插入模式輸入一個1,然後退出插入模式,使用q1開始錄製宏1
image
此時可以看到下方的狀態列中出現了recording @1,也就是正在錄製。然後yyp,這裡分為兩段,yy可以複製當前行,p可以貼上當前行。得到的結果就是:
image
下一個指令是<C-a>,在我的STFW下,發現這個操作的作用是使整數資料+1,執行之後,第二行應該變成2,事實如此:
image
到這裡之後的操作就很清晰了,q停止錄製,98@1執行宏98次。最後得到:
image
第一個例子就給出了非常有意思的操作,這裡給出一些宏操作的簡單例項:

命令 功能
qa 錄製宏 a
q 停止錄製
@a 執行宏 a
@@ 重新執行上一次的宏

列交換

第二個例子是批次列交換的例子

The second example is to modify a file. Suppose you have such a file:

aaaaaaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbbbbbb
cccccccccccccccccccccccccddddddddddddddddddddddddd
eeeeeeeeeeeeeeeeeeeeeeeeefffffffffffffffffffffffff
ggggggggggggggggggggggggghhhhhhhhhhhhhhhhhhhhhhhhh
iiiiiiiiiiiiiiiiiiiiiiiiijjjjjjjjjjjjjjjjjjjjjjjjj

You want to modify it into:

bbbbbbbbbbbbbbbbbbbbbbbbbaaaaaaaaaaaaaaaaaaaaaaaaa
dddddddddddddddddddddddddccccccccccccccccccccccccc
fffffffffffffffffffffffffeeeeeeeeeeeeeeeeeeeeeeeee
hhhhhhhhhhhhhhhhhhhhhhhhhggggggggggggggggggggggggg
jjjjjjjjjjjjjjjjjjjjjjjjjiiiiiiiiiiiiiiiiiiiiiiiii

What will you do? In vim, this is a piece of cake, too. First locate the cursor to first "a" in the first line. And change vim into normal state, then press the following keys sequentially:

<C-v>24l4jd$p

where means "Ctrl + v" here. What about a file with 100 such lines? What you do is just to press one more key:

l右移游標
24l向右移動24格
4j向下移動4格
d剪下
$來到行末尾
p貼上

如果你不理解這些操作而是直接執行的話,很可能發現無法達到預期效果,那是因為你的游標起始位置並不在文字起始位置。
我們可以使用(移動游標直到達文字起點。這裡給出vim速查表:
Vim速查表

vim配置檔案

在ubuntu中,vim的配置檔案預設在/etc/vimrc中,我們可以修改其中的內容以讓vim看起來不一樣。其中有意思的有:

	syntax on
	set showmatch           " Show matching brackets.
	set ignorecase          " Do case insensitive matching
	set smartcase           " Do smart case matching
	set incsearch           " Incremental search
	set hidden              " Hide buffers when they are abandoned
	set number              " Enable line of number
	set hlsearch            " Enable hightlight search result
	set smartindent         " auto head line format

Linux 基礎

這裡是Linux入門教程中的一些有趣的知識的記錄。

輸出一個目錄下的指定檔案行數

第一個讓我感興趣的是 統計當前目錄的程式碼行數的任務,這裡使用了這麼一條命令實現:

find . | grep '\.c$\|\.h$\'| xargs wc -l

前面兩個指令自然是非常熟悉了,但是第三條指令還是能讓我學到很多。其中xargs可以將輸入轉化為引數一命令的引數,比如前面管道來的檔案,xargs會進行分詞,然後作為wc -l 命令的引數執行,而wc -l 可以統計檔案的行數。這裡我統計了anaconda3中的\.c$\|\.h$
這個正規表示式也可以解釋一下,首先\.是為了轉義.符號,因為.在正規表示式中預設是匹配任意的一個字元,轉義後是.檔案型別區分標誌的開頭,而尾部的$表示從尾部匹配。'|'與前面的轉義類似,是用於給|轉義,在正則中|是或者的含義。所以我們就能得到我們想要的結果:
image

統計磁碟使用情況

du -sc /usr/share/* | sort -nr | more

同樣的,對於前兩條命令依舊是相當熟悉了,最後一個more我卻是第一次見,在輸出非常長的情況,可以使用more/less來讓輸出可以翻頁,more使用空格後翻,而less可以前後翻頁。

編譯一個hello world程式(或許不止於編譯它?)

這些命令這裡不留註釋了,希望自己再再次看到他們的時候只會覺得非常熟悉,而不是需要查閱資料才能理解含義。

vim test.c
gcc -o test test.c
./test
./test > out.txt
./test | tee out.txt
objdump -d test | tee output.txt
time ./test < data | tee output.txt

可以記錄的是一個將輸出過濾掉的操作,只保留最後一條命令中的time輸出time ./test < data > /dev/null/dev/null這個檔案我也用過,但是一直只是把它當一個垃圾桶,沒有深入理解過它,今天把它也搞明白。

/dev/null 是一個特殊的裝置檔案,它丟棄一切寫入其中的資料 可以將它 視為一個黑洞, 它等效於只寫檔案, 寫入其中的所有內容都會消失, 嘗試從中讀取或輸出不會有任何結果,同樣,/dev/null 在命令列和指令碼中都非常有用。具體參考:shell指令碼中 /dev/null 的用途

使用Makefile

相關文章