爱程序网

Linux Command Line 笔记(1)

来源: 阅读:

Yunduan CUI

graphical user interfaces make easy tasks easy, while command line interfaces make difficult tasks possible

Part 1 学习Shell

1. 什么是 Shell?

Shell 是用户与操作系统交流的程序,它读取用户的键盘输入并交由操作系统执行相应的命令。所有linux都支持一个叫做 bash 的shell,它的全称是 “Bourne Again SHell”,bash 的前身是由 Steve Bourne 写的sh。

当我们使用Shell的时候,我们实际上需要另一个叫做 terminal emulator 的程序与shell进行交互,也就是我们常见的一个叫做终端的程序。(终端可以选择不同的Shell)

2. 巡航

巡航linux的文件系统,常用命令为:

  • ls:显示当前工作目录的文件
  • cd: 更改工作目录
  • pwd:显示当前工作目录名称

linux使用一个基于树德文件系统。不同于windows把每一个磁盘都看做是独立的文件系统,linux 总是保持一个文件系统。

在使用cd命令时,cd 直接返回默认目录,cd ~user_name 返回对应用户的默认目录,cd - 返回之前的目录。另外 . 表示当前目录,..表示父目录

使用ls命令时默认是不显示隐藏文件的,要显示它们 使用 ls -a

3. 探索文件

使用ls的更多技巧,ls支持显示指定文件夹内容,也支持显示两个文件夹的内容。使用 ls -l 可以显示文件的长格式。-t 可以按照更改时间对文件进行排序。其他比较有用的选项:
* -F 特别标注/在文件夹名后 -r 反向用字母表显示 -S 以文件大小排序 -t 以更改时间排序

关于文件的长格式

其中第一列 是文件访问权限 第一个字母:- 代表常规文件 d 代表文件夹 l 代表连接文件 接下来三个字母是对文件拥有者的权限 再接下来三个字母是对同组成员的权限,最后三个是对所有人的权限 r代表读 w代表写 x代表执行 第二列表示文件个数(对于文件夹,文件的话自然是1) 第三列表示拥有者 第四列表示属于的组 第五列表示文件大小(bytes) 第六列是创建日期 第七列是文件名

确定文件类型

使用 file 命令确定文件类型

读取文件内容

使用 less 命令读取文件内容, 进入内容后的操作如下:
Page Up/b 前滚一页
Page Down/空格 后滚一页
上/下箭头 前滚/后滚一行
G 移动到文件尾
1G/g 移动到文件头
/【characters】 前向查找【characters】
n 找到下一个查找目标
h 显示帮助
q 退出

less 的前身叫做 more,之所以取这个看起来相反的名字是因为 Less is more

介绍文件系统

目录名 介绍
/ 根目录
/bin Contains binaries 存放系统的程序
/boot 有关启动的信息,初始化的 RAM与硬盘镜像,以及linux内核
/dev 存放驱动程序
/etc 存放系统,程序的配置文件,和shell script
/home 给用户使用的文件夹,一般用户只需要在这个文件件内工作
/lib 所有程序使用的库文件(有点像windows的DLL文件)都在这里
/lost+found 被格式化的linux文件系统才会有这个文件夹,可以用来部分的恢复文件。除非发生了糟糕的事情,它一般是空的
/mnt 只出现在老的linux上,用来存放可移动设备的驱动
/opt 可选的程序都放在这里,这里一般存放用户后来安装的程序
/proc 这是一个特殊的文件夹。它是一个虚拟文件夹,相当于一个通向linux内核的窥视孔,你可以从里面的文件看到内核是如何看当前这一台PC的
/root root 账号的目录
/sbin 超级用户使用,内含核心系统程序
/tmp 临时文件存放处
/usr 一般来说都是最大的一个文件夹,含有所有常规用户使用的程序和文件
/usr/bin 存放安装的linux可执行文件
/usr/lib 用户安装文件使用的库文件
/usr/local 用户安装的程序,一般从源码编译的文件都装在这里
/usr/sbin 存放安装的管理员程序
/usr/share 存放/usr/share中程序共享的文件
/usr/share/doc 一般安装的一些包都含有文档,就放在啊这里
/var 也是用来存放经常被更改的文件,例如用户邮件
/var/log 存放日志文件

Symbolic Links

Linux中独特的一种文件形式,可以连接到其他文件。也叫做软式连接 soft link,他可以方便我们更新某些组件的版本,因为link可以当做是变量名一样。

4. 操作文件与目录

本节我们将介绍命令:

  • cp:拷贝文件/目录
  • mv: 移动 or 重命名 文件/目录
  • mkdir:创建目录
  • rm:删除文件/目录
  • ln:创建link

通配符 (wildcards)

星号* 对应所有的符号(含复数个)
?对应所有的单个符号
[character]对应任意一个属于括号内集合的符号
[!character]对应任意一个不属于括号内集合的符号
[[:class:]]对应任意一个属于该类型的符号,类型为:

[:alnum:] 对应所有字母数字
[:alpha:] 对应所有字母
[:digit:] 对应所有数字
[:lower:] 对应所有小写字符
[:upper:] 对应所有大写字符

一些通配符的例子:

*               所有文件
g*          所有以字母 g 开头的文件
b*.txt      所有以字母 b 开头且结尾是 .txt 的文件
Data???     所有以 Data 开头,后面接着三个符号的文件
[abc]*      所有以 a 或者 b 或者 c 开头的文件
BACKUP.[0-9][0-9][0-9]  所有已 BACKUP. 开头后接三个数字的文件
[[:upper:]]*    所有以大写字母开头的文件
[![:digit:]]*   所有以非数字开头的文件
*[[:lower:]123] 所有以小写字母或者 1  或者 2 或者 3 结尾的文件

mkdir 创建目录

我们可以单独创建一个目录 或者连续创建多个目录:

mkdir dir1
mkdir dir1 dir2 dir3

cp 拷贝文件

将文件/目录 1 拷贝至 文件/目录2:

cp item1 item2

拷贝复数个文件/目录到一个目录:

cp item... directory

cp命令的选项有:

-d 复制相同的符号连接
-p 复制相同的文件属性
-R 递归复制目录下的所有文件
-a 等于-dpR
-i 交互式拷贝,在需要覆盖原有文件之前询问用户
-u 只复制目标目录中没有的文件
-v 详细显示操作的消息

mv 移动或者重命名文件

-i 交互式拷贝,在需要覆盖原有文件之前询问用户
-u 只复制目标目录中没有的文件
-v 详细显示操作的消息

rm 删除文件

-i 交互式删除,在动作之前询问
-f 无提示不检查暴力删除
-v 显示详细操作信息

rm 的使用是比较危险的,注意空格会造成截然不同的结果:
      rm *.html 将会删除所有目录下的 html 格式文件,然而如果我们错误的使用了一个空格
rm * .html 将会删除全部目录下的文件并提示找不到文件 .html

ln 创造链接

ln file link
注意软硬链接的不同,一般我们使用软链接就好.

5. 使用命令工作

命令的种类可以分为:

  1. 可执行程序
  2. shell 自建的命令
  3. shell 方程
  4. 一个其他命令的代称

  显示命令的种类 type

type command

显示可执行命令的位置 which

which command

获取命令的帮助 help

help command

这是一个非常重要的命令,可以用来学习大量的命令

有一些命令支持使用

command --help

来获取帮助信息。

获取可执行命令的手册 man

man 命令可以获得命令的完全手册, 很多手册都非常凶残且难以阅读 比如 bash 的。

man program

apropos 命令获得一个粗略的模糊的潜在搜索名单

apropos command

简化版的手册 whatis

使用 whatis 可以获得简短的帮助文件

whatis program
>ls(1)                    - list directory contents

另一个可选的手册 info

用法和 man 一样。

使用 alias 制作自己的命令

语法:

alias name='string'

这里举一个例子,我们要进入 /usr 目录,运行 ls 然后在返回之前的目录,即:

naist-wavenet125-052:~ YunduanCUI$ cd /usr;ls;cd -
X11     bin     libexec     sbin        standalone
adic        lib     local       share
/Users/YunduanCUI
naist-wavenet125-052:~ YunduanCUI$ 

我们使用一个没有被占用的名称 foo 来建立这个联合命令:

alias foo='cd /usr; ls; cd -'
naist-wavenet125-052:~ YunduanCUI$ foo
X11     bin     libexec     sbin        standalone
adic        lib     local       share
/Users/YunduanCUI
naist-wavenet125-052:~ YunduanCUI$ 

此时我们检查 foo 的类型就会发现:

naist-wavenet125-052:~ YunduanCUI$ type foo
foo is aliased to `cd /usr; ls; cd -'

抹去这个自定义的命令,使用:

unalias name

6. 重定向 Redirection

本节我们学习输入输出的重定向 I/O Redirection, 学习的命令包括:

    cat         连接文件
    sort        排列
    uniq        报告或删除重复行
    grep        打印符合要求的行
    wc          向文件中输入
    head        输出文件首的部分
    tail        输出文件尾的部分
    tee         标准输入输出

命令的交互包括输入输出和错误信息。因为UNIX中所有的物件都是文件,所以实际打印在屏幕上的也是标准的输出,只是这些没有被保存为磁盘上的文件。

标准输出重定向

标准输出重定向的符号是 >

    naist-wavenet125-052:~ YunduanCUI$ ls -l > ~/ls-output.txt

之后就生成了相应的文件,注意这里就不在有屏幕显示了。将生成的文件作为标准输入的话,我们可以使用 ls 命令来直接查看它的文件状态:

    naist-wavenet125-052:~ YunduanCUI$ ls -l ls-output.txt 

如果要查看,我们使用 less 命令:

    naist-wavenet125-052:~ YunduanCUI$ less ls-output.txt 

标准错误重定向

使用运算符 2>

    naist-wavenet125-052:~ YunduanCUI$ ls -l /bin/usr 2> ls-error.txt

如果同时需要重新定向标准输出和错误输出的话,可以使用

    naist-wavenet125-052:~ YunduanCUI$ ls -l /bin/usr > ls-output.txt 2>&1

即输出的错误重定向到当先的标准输出位置(已经被重新定向过了),这样的话,没有错误就输出标准输出,有错误就输出标准错误输出。

当前的bash提供另一个方式来重定向输出和错误:

    naist-wavenet125-052:~ YunduanCUI$ ls -l /bin/usr &> ls-output.txt

清除不想要的输出

当你不想看到输出的错误信息时,可以重定向它们到比特桶里:

    naist-wavenet125-052:~ YunduanCUI$ ls -l /bin/usr 2> /dev/null

重定向标准输入

使用cat连接文件

cat实质上会把第一个参数的文件直接输出,在你没有指定第二个目标文件的参数时,它选择将第一个参数文件的内容打印到屏幕上。如果不给参数的话,cat进入输入模式,无论输入什么,它都直接将输入打印到屏幕。

naist-wavenet125-052:~ YunduanCUI$ cat > lazy_dog.txt
The quick brown fox jumped over the lazy dog.

实现了将输入内容重定向到指定文件。

管道

管道 | 可以直接将第一个命令的输出传递到第二个命令的输入。

naist-wavenet125-052:~ YunduanCUI$ ls -l /usr/bin | less

要注意与重定向的不同,重定向连接的是命令与文件而管道连接的是命令的输出和另一个命令的输入。

过滤器

使用sort来进行预先排序

naist-wavenet125-052:~ YunduanCUI$ ls /bin /usr/bin | sort | less

使用uniq来消除重复行

naist-wavenet125-052:~ YunduanCUI$ ls /bin /usr/bin | sort | uniq | less

使用 uniq -d 来查看重复内容

naist-wavenet125-052:~ YunduanCUI$ ls /bin /usr/bin | sort | uniq -d | less 

使用 wc 来计算行数字数比特数

naist-wavenet125-052:~ YunduanCUI$ wc ls-output.txt
   1       7      40 ls-output.txt

输出表示有一行七个字符共40比特,使用 wc -l 可以只计算行数

grep 寻找指定行

naist-wavenet125-052:~ YunduanCUI$ ls /bin /usr/bin | sort | uniq | grep zip
bunzip2
bzip2
bzip2recover
funzip
gunzip
gzip
unzip
unzipsfx
zip
zipcloak
zipdetails
zipdetails5.16
zipdetails5.18
zipgrep
zipinfo
zipnote
zipsplit

寻找带 zip 的行。

使用 head 和 tail 命令来选择开头或结尾的内容

    head -n 5
    tail -n 5

指定行数选择内容。

    tail -f

动态显示当前更新的行尾。

使用 shell

本章我们着重讲一个命令 echo,它的作用是输出一行文档。

naist-wavenet125-052:~ YunduanCUI$ echo this is a test
this is a test

shell 完全支持正则表达式,使用 *,我们得到:

naist-wavenet125-052:~ YunduanCUI$ echo *
Applications Desktop Documents Downloads Dropbox Google 云端硬盘 Library LinuxScript Movies Music Pictures Public Python Python_space TEXex Ten Thumbs Students VirtualBox VMs email feedparser-5.1.3 lazy_dog.txt ls-error.txt ls-output.txt nusers python.vim ros_catkin_ws src subl testDigits trainingDigits unixstuff vim vimtext vimtext2 wordpress 百度云同步盘

可以灵活的使用,像:

naist-wavenet125-052:~ YunduanCUI$ echo D*
Desktop Documents Downloads Dropbox
naist-wavenet125-052:~ YunduanCUI$ echo *s
Applications Documents Downloads Movies Pictures Ten Thumbs Students VirtualBox VMs nusers ros_catkin_ws testDigits trainingDigits wordpress
naist-wavenet125-052:~ YunduanCUI$ echo [[:upper:]]*
Applications Desktop Documents Downloads Dropbox Google 云端硬盘 Library LinuxScript Movies Music Pictures Public Python Python_space TEXex Ten Thumbs Students VirtualBox VMs
naist-wavenet125-052:~ YunduanCUI$ echo /usr/*/share
/usr/X11/share /usr/local/share

波浪号的使用

~ 表示当前用户的 home 目录

naist-wavenet125-052:~ YunduanCUI$ echo ~
/Users/YunduanCUI

算数扩张

naist-wavenet125-052:~ YunduanCUI$ echo $((2+2))
4

使用时要注意数学表达式的专用形式 $((expression)), 支持加减乘除取模和乘方(**)运算。

中括号扩张

中括号扩张让格式化重复字符变得可能:

naist-wavenet125-052:~ YunduanCUI$ echo Front-{A,B,C}-back
Front-A-back Front-B-back Front-C-back

注意{}内部和之间不可以有空格。使用 ... 可以更加方便的计数:

naist-wavenet125-052:~ YunduanCUI$ echo Number_{1..5}
Number_1 Number_2 Number_3 Number_4 Number_5
naist-wavenet125-052:~ YunduanCUI$ echo {Z..A}
Z Y X W V U T S R Q P O N M L K J I H G F E D C B A

联合起来使用:

naist-wavenet125-052:~ YunduanCUI$ echo a{A{1,2},B{3,4}}b
aA1b aA2b aB3b aB4b

naist-wavenet125-052:~ YunduanCUI$ mkdir Photos
naist-wavenet125-052:~ YunduanCUI$ cd Photos/
naist-wavenet125-052:Photos YunduanCUI$ ls
naist-wavenet125-052:Photos YunduanCUI$ mkdir {2012..2016}-{01..12}
naist-wavenet125-052:Photos YunduanCUI$ ls
2012-1  2012-8  2013-6  2014-4  2015-2  2016-11
2012-10 2012-9  2013-7  2014-5  2015-3  2016-12
2012-11 2013-1  2013-8  2014-6  2015-4  2016-2
2012-12 2013-10 2013-9  2014-7  2015-5  2016-3
2012-2  2013-11 2014-1  2014-8  2015-6  2016-4
2012-3  2013-12 2014-10 2014-9  2015-7  2016-5
2012-4  2013-2  2014-11 2015-1  2015-8  2016-6
2012-5  2013-3  2014-12 2015-10 2015-9  2016-7
2012-6  2013-4  2014-2  2015-11 2016-1  2016-8
2012-7  2013-5  2014-3  2015-12 2016-10 2016-9

参数扩张

echo 也可以用来显示参数名,使用$即可:

naist-wavenet125-052:~ YunduanCUI$ echo $USER
YunduanCUI

显示了自己的名称,如果参数不存在,则什么也不显示。

与命令行的联动

关于爱程序网 - 联系我们 - 广告服务 - 友情链接 - 网站地图 - 版权声明 - 人才招聘 - 帮助