花两周时间玩玩Linux - Day 2:命令行&实用程序
花两周时间玩玩Linux - Day 2:命令行&实用程序
今天该玩命令行了!一旦你学会命令行,你就会觉得命令行的设计真是优雅无比,你就会爱上它。❤️
1.introduction to commandline
命令行一般就是:
$ command_or_program_name arg_1 arg_2 arg_3 ...
$ 命令名或程序名 参数1 参数2 参数3 ...
就这么简单。记住了吧?
看一些例子:
1. cat 🐱
cat 就是concatenate,连接的意思。用法:
$ cat file_1 file_2 file_3
cat会把file_1,file_2,file_3连着打印到屏幕上。
$ cat -n file_1
-n 是一个标记,表示打印行号。(number)
2. pwd
print working directory 打印当前工作目录。
$ pwd
查看pwd命令的参数:
$ pwd --help
对一般的程序和命令,你可以先试试--help 和 --version,一般都有相关信息。
插曲:命令行参数的约定
一般用一个短线(dash, 就是-
)表示缩写的参数,用两个短线(--
)表示不缩写的参数。
例子: -v
, --version
, -h
, --help
$ sudo apt-get update --fix-missing
3.wc
word count 字数统计
$ wc new.txt
27 27 497 new.txt
$ wc new.txt --lines
27 new.txt
[ -l,--lines 输出行数; -c,--bytes,输出字节数 ]
$ wc new.txt -cl
27 497 new.txt
[ -cl 相当于 -c -l,多个短命令一般可以连用 ]
2.路径 🚋🚋🚋
Windows和Linux上都有路径(Path)。路径是什么,为什么总要"配置路径"?
路径就是一个系统变量:Path。
执行命令时,Windows的cmd会先搜索内置命令,再在Path指定的路径中按顺序搜索同名的程序exe,最后在当前目录搜索同名exe。
🌈试一试:打开Windows的cmd,输入: PATH
Linux的shell会先搜索内置命令,再在Path指定的路径中按顺序搜索同名的程序,但是不会搜索当前目录。Linux不允许直接输入程序名执行当前目录下的程序,要这样做,需要写全路径: ./program_to_be_executed
🌈试一试:打开Linux的Shell,输入: echo $PATH
众所周知,Windows的可执行文件是exe。Linux的可执行文件是ELF文件,而且一般没有扩展名。在本系列的二进制部分会有更详细的介绍。
所以,有些程序想要正确执行,就依赖于PATH,PATH里找不到,它就束手无策了。
3. 管道 Pipeline 🔧
管道是一种非常好用的东西!ruby语言的发明者,松本行弘,受到管道的启发,开发了一款语言:streem。
首先你需要了解流(stream)
的概念。一切信息都是流,比如你听到人说话就是一个字一个字听的,就像水流流动一样流进你的耳朵。打印信息的时候就是逐字打印,也是一个流。游戏一些特殊的流,我们平时打交道最多的沮丧标准输入流和输出流。如果你学过C语言的话,应该知道stdin和stdout,甚至标准错误流stderr。事实上,stdio.h
,意思就是std-i[n]-o[ut]
标准输入输出。而C++中的iostream
就更不言自明了。
理解了流,自然懂管道,管道不就是导流的吗!
管道用|
表示,表示把|
前的命令行的输出结果传到|
后的命令作为输入。
🍍 例子:统计一下 n1.txt 和 n2.txt 一共有几行?
$ cat n1.txt n2.txt | wc -l
4.常用Linux命令与程序简介 🍰
1. cat,head,tail,more
常用的打印程序。
cat:连接,把后面跟的文件都连着打出来。
head:打印前几行。默认是6行。
tail:打印后几行。默认是6行。
more:允许你像看man page一样看一个文件。
2. wc,sort,tee,ls
word count,已经介绍过了。
sort,按照一个文件的行给文件内容重新排序。
tee,三通。来源于英文字母T。可以把当前内容继续传下去的同时,打印到标准输出。
ls,list ,列出目录下的文件信息。在文件系统那里会有详细讲解。默认列出当前目录下的信息。
3.令人快乐的正则表达式,与grep
相信大家都会正则表达式的😄不如我不讲了吧🐶出门左拐菜鸟教程看正则表达式
$ grep pattern file_list # 普通正则表达式
$ egrep pattern file_list # Extensive grep,拓展的正则表达式
$ fgrep string file_list # 只根据字符去搜
🍍例子:搜索当前目录下扩展名为txt的文件。
$ ls | grep \.txt
$ ls | fgrep .txt
4.神奇的awk
文本处理程序awk。也许你能用上。可以对输入文字的每一行进行一些处理。
$ awk 'awk-script-here' file_list
编写awk简单脚本,只需要了解awk内置变量:
NR-代表行号、$0-代表整行文字,$1代表第一个空格前的文字,$2代表第一个空格(准确说是whitespace,连续的空格算一个空格)与第二个空格间的文字,以此类推;FILENAME表示文件的名字。
awk脚本规则:
condition { action }
满足condition就会执行action。
action有:
print var_1, var_2 , var_3
printf("%d,%s,%c\n",var_1,var_2,var_3)
condition可以是:比大小等、正则表达式/pattern/
、特殊hook:BEGIN
文件开始前、END
文件结束。
脚本太长,也可以写到文件里。
$ awk -f awk_script.txt file_list
5.tr,cmp,diff
tr,translate,翻译。把输入的文字变成指定的对应文字。
例子:把大写变小写:
$ cat new.txt | tr '[A-Z]' '[a-z]'
linux命令行里方括号有特殊意思,请用引号引起来一个参数。如果参数里面有空格的话,也请这么做。
cmp:compare,比较两个文件是否相同
diff:找出两个文件哪里不同。
diff file1 file2
报告格式:a-add, c-change, d-delete
l1al2,l3:文件1的l1行后添加了文件2的l2-l3行
l1,l2cl3,l4:文件1的l1-l2行改成文件2的l3-l4行
l1,l2dl3:文件l1-l2行删掉后,后面的内容与文件2的l3行之后一样
6.命令行简单文本编辑器:nano
GNU nano,比vim简单的命令行文本编辑器,很傻瓜🍈,会英语就会用。
下一篇,我们会介绍更强大的vim的使用。
5.作业
玩一玩这些命令和程序,看看man page和info,试试怎么用。
如果你缺习题的话...
- 统计你的工作目录下,扩展名为txt或pdf或xlsx或docx或没有扩展名的文件或文件夹有几个。
- strcpy函数在头文件string.h的哪一行出现了?(include头文件放在
/usr/include
目录下) - 用awk实现如此打印效果:
+------------------------------+
|This file is printed using awk|
+------------------------------+
+ Happy king was voted
* the most vicious
+ person in the
* world
+------------------------------+
| The end |
+------------------------------+
4.用tr实现凯撒密码。