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
wheremeans 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
。
此時可以看到下方的狀態列中出現了recording @1
,也就是正在錄製。然後yyp
,這裡分為兩段,yy
可以複製當前行,p
可以貼上當前行。得到的結果就是:
下一個指令是<C-a>
,在我的STFW下,發現這個操作的作用是使整數資料+1,執行之後,第二行應該變成2,事實如此:
到這裡之後的操作就很清晰了,q
停止錄製,98@1
執行宏98次。最後得到:
第一個例子就給出了非常有意思的操作,這裡給出一些宏操作的簡單例項:
命令 | 功能 |
---|---|
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$
這個正規表示式也可以解釋一下,首先\.
是為了轉義.
符號,因為.
在正規表示式中預設是匹配任意的一個字元,轉義後是.
檔案型別區分標誌的開頭,而尾部的$
表示從尾部匹配。'|'與前面的轉義類似,是用於給|
轉義,在正則中|
是或者的含義。所以我們就能得到我們想要的結果:
統計磁碟使用情況
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 的用途