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 的用途