花两周时间玩玩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,试试怎么用。

如果你缺习题的话...

  1. 统计你的工作目录下,扩展名为txt或pdf或xlsx或docx或没有扩展名的文件或文件夹有几个。
  2. strcpy函数在头文件string.h的哪一行出现了?(include头文件放在/usr/include目录下)
  3. 用awk实现如此打印效果:
+------------------------------+
|This file is printed using awk|
+------------------------------+
+ Happy king was voted
* the most vicious
+ person in the
* world
+------------------------------+
| The end                      |
+------------------------------+

4.用tr实现凯撒密码。

posted @ 2020-07-05 23:21  holazzer  阅读(206)  评论(0)    收藏  举报