《Linux命令行大全》读书笔记一

第一章:shell是什么

shell接受键盘书输入的命令,传递给操作系统来执行,几乎所有的Linux都提供shell程序。
在终端仿真器中(Terminal Emulator)写shell命令。
在终端不要尝试ctrl-c或者ctrl-v,对于shell而言,鼠标中键是粘贴键。
简单的shell命令:

data    //显式日期
cal     //显示当月日历
df      //当前磁盘的可用空间
free    //显示可用内存
clear   //清屏
exit    //结束终端

第二章:导航

介绍文件导航系统:

pwd     //查看当前工作目录
cd      //改变目录      
  1. 绝对路径名:从根目录开始紧接一个又一个文件树分支。
  2. 相对路径名:点号代表.代表当前目录,符号..代表当前目录的父目录。
cd ..   //回到当前目录的父目录
cd bin  //当前目录的bin子目录
cd ./bin    //和上面的命令作用一样

常见的cd快捷方式:

cd      //将当前目录转向主目录
cd -     //将工作目录改编成先前的额工作目录

第三章.Linux系统

ls      //列出目录内容
file    //确定文件类型
less    //查看文件内容

ls命令可以查看当前目录下的一系列子目录和文件:

ls(选项)(参数)

参数:要显示的目录,或者文件,可以是多个。
选项:

-l      //输出长格式显示
-a      //列出所有文件,包括以点号开头的
-d      //查看目录的详细信息而非内容,常与-l连用
-F      //添加类型指定符
-h      //长格式列出, 显示文件大小
-r      //逆序
-S      //文件大小排序
-t      //修改时间排序

长格式:

-rwxrwxr-x 1 xxx xxx 9216 Jun 23 19:41 test
-rwxrwxr-x   //对文件的访问权限
1       //硬链接的数目
xxx     //文件所有者用户名
xxx     //文件所属用户组的名称
9216    //字节数大小
Jun 23 19:41    //上一次修改时间
test        //文件名

filelless命令:

file filename   //打印文件内容的说明
less filename   //查看文件内容,按q退出

less命令中查看文件内容:

page up或者b        //后翻一页
page down或者Space  //前翻一页
向上箭头            //向上一行
向下箭头            //向下一行

第四章:操作文件与目录

  1. 通配符(类似正则表达式):
*                   匹配代表任意多个字符
?                  匹配单个字符
[characters]        匹配一个属于该字符集的字符
[!characters]       匹配一个不属于该字符集的字符
[[:class:]]         匹配一个指定字符类的字符

常用的字符类:

[:alnum:]           匹配一个字母或者数字
[:alpha:]           匹配一个字母
[:digit:]           匹配一个数字
[:lower:]           匹配一个小写字母
[:upper:]           匹配一个大写字母

例如:

[![:digit:]]*       不以数字开头
*[[:lower:]123]     以小写字母或者数字1,2,3任意一个结尾

尽量避免使用类似于[A-Z]或者[a-z],这些在早期的Linux版本有效,现在不一定。

  1. mkdir:创建目录
    格式如下:
mkdir dir...

...代表参数可以重复,下文统一这样约定。
例如:

mkdir dir1 dir2 dir3    //创建3个目录
  1. cp:复制文件和目录
    使用方式如下:
cp item1 item2          //将文件或者目录item1复制到文件或者目录item2
cp item... directory   //将多个项目(文件或者目录)复制进一个目录

cp常见的选项:

-v, --verbose           //复制时,显示消息
-i, --interactive       //复制已经存在的文件,提示
-r, --recursive         //用于目录复制
-a, --archive           //复制所有权限
-u, --update            //只复制更新的文件

例如:

cp -r dir1 dir2         //将dir1目录复制到dir2,如果dir2不存在,先创建之
cp dir1/* dir2          //dir1总所有文件复制到dir2,dir2必须存在
  1. mv:移动或者重命名文件或者目录
    基本格式:
mv item1 item2
mv item... directory

mv选项:-i, -u, -v,含义和cp一样。
5. rm:删除文件或者目录

rm item...

rm选项-i, -r, -v, -f-f –force。
6. ln:创建链接
链接包括:符号链接(symbolic link)和硬链接(hard link)。
符号链接类似于windows中的快捷方式,本质是文本文件,里面存放的是位置信息。
硬链接通过索引节点来进行连接,硬链接和源文件公用一个索引节点。每一个文件均有一个硬链接,为文件起名,每当创建一个硬链接,也就为文件创建了一个额外的目录条目。硬链接有两个局限性:
- 不能引用不在同一磁盘分区的文件
- 无法引用目录
基本格式:

ln file link        //创建硬链接
ln -s item link     //创建符号链接,可以是目录

例如:

ln file1 file2      //硬链接
ln -s file1 file3   //符号链接

删除file1,对file2无影响,file3失效;
删除file2,对file1和file3都无影响;
删除file3,对file1和file2都无影响;
删除file1和file2,文件被真正删除。

第五章:命令的使用(7月6日更新)

  1. 识别命令:type, which
    type是shell一个内置命令:
type command        //显示command的类型
which command       //显示command的位置,只适用于可执行程序,不适用内置命令和别名

例如:

type ls     //ls is aliased to `ls --color=auto'
which ls    //bin/ls
  1. 获得命令文档:
    help命令:
help command        //
command --help      //只有一些可执行程序支持--help

man: 显示程序的手册页

man program     //program是需要查看的命令名称

手册被分为多个部分:

1       //用户命令
2       //内核函数调用的程序接口
3       //c库函数程序接口
4       //特殊文件
5       //文件格式
6       //游戏和娱乐
7       //其它杂项
8       //系统管理命令

例如:

man 5 passwd        //

apropos: 显示合适的命令,通过搜索参考手册列表

apropos floppsy   //

whatis: 显示命令的简要描述

whatis ls   //ls (1)               - list directory contents

info: 显示程序的info目录
info页面可以通过info阅读器来显示。
4. 使用别名 alias 来创建自己的命令
多条命令可以用分号隔开:

command1; command2; command3

使用别名前最好type来验证是否被使用:

type foo
alias foo = 'cd /usr; ls; cd -'
foo         //执行三个命令

使用unalias删除别名:

unalias foo

第六章:重定向

I/O重定向:从文件获取内容,输出结果重定向到文件。
1. 标准输入,标准输出和标准错误
>>>表示输入,前者表示从文件的开头重写,后者表示从文件的末尾开始写入。方式如下:

command > file
command >> file

例如:

ls -l > ls-output.txt   //命令ls -l不再输出到屏幕,而是写入文件ls-output.txt
> ls-output.txt         //将文件清空或者创建一个空文件
ls -l >> ls-output.txt

文件描述符:in-0, out-1, err-2

ls -l 2 > ls-error.txt

使用&>将标准输出和标准错误重定向到同一个文件

ls -l &> ls-output.txt

处理不想要的输出,把输出丢弃:

ls -l 2> /dev/null      //但是还是显示了,不知道为什么

标准输入重定向:
cat: 合并文件,cat读取一个或者多个文件,并把它们复制到标准输出文件中。
格式:

cat file...
cat ls-output.txt   //作用和type一样

假设我们有文件:file001,file002,file003

cat file00* > file      //将文件连接在一起

直接写cat

cat

看起来什么都没发生,实际正等待从键盘输入内容,完成后按ctrl+d,表示输入完毕,就会显示刚刚键盘输入。

cat > flie

上述命名执行后等待从键盘写入,ctrl+d完成写入。
cat还接受标准输出:

cat < file      //输出file的内容
  1. 管道
    管道操作符|可以把一个命令的标准输出传送到另外一个命令的标准输入。
command1 | command2

例如:

ls -l | less    

过滤器:管道功能经常对数据执行复杂的操作,也可以把多条命令合在一起构成一个管道,这种方式中用到的命令也称为过滤器。

ls | sort | less    //排序并使用less读取内容

uniq:忽略文件中重复的行:

ls | sort | uniq | less    //排序并删除重复行,然后使用less读取内容

wc: 打印行数,字数和字节数
例如:

wc output.txt         //

grep: 打印匹配行

grep pattern file...

例如:

ls | sort | uniq | grep zip     //搜索文件名中包含zip

选项:

-i      //忽略大小写
-v      //只输出和模式不匹配行

head/tail: 打印文件的开头部分或者结尾部分
有时候只需输出前几行或者倒数几行,需要-n选项:

head -n 5 output.txt        //打印前5行
tail -n 10 output.txt       //打印倒数10行

这些命令也可以用在管道上:

ls | tail -n 5

tail还可以用来刷新日志,使用-f选项监视文件,一旦添加了新行,就会立即显示在屏幕上:

tail -f logfile

tee: 从stdin读取数据,同时输出到stdout

ls | tee ls.txt | grep zip

第七章:透过shell看世界

echo: 显示一行文本

echo this is a test     //屏幕输出this is a test
ech *       //等价于命令ls,将*扩展为当前目录下的所有文件名

路径名扩展

ls          //
echo D*     //输出以D开头的文件名
echo *s     //输出以s结尾的文件名
echo [[:upper:]]*
echo /usr/*/share

波浪线(~)扩展:如果将其用在一个单词的开头,那么它将被扩展为指定用户的主目录名;如果没有指定用户名,则扩展为当前用户的主目录。
算术扩展:表达式

$((expression))

常见的操作符:

+, -, *, /, %, **       //前五个和C一样,**代表取幂

例如:

echo $((2 ** (3 - 1)))  //输出4

花括号扩展
例如:

echo F{A,B,C}B    //输出FAB FBB FCB
echo {Z..A}     //输出Z Y ... C B A

花括号还支持嵌套:

echo a{A{1,2}, B{3,4}}b     //输出aA1b aA2b aB3b aB4b

应用:创建一系列文件或者目录

参数扩展

echo $(USER)

命令替换:将一个命令的输出作为一个扩展模式使用:

echo $(ls)      //
  1. 引用

双引号:除了美元符号$,反斜杠\和反引号'其它特殊字符都失去特殊含义。因此,参数扩展,算术扩展和命令替换在双引号中依然有效,例如:

echo "$((2 + 2)) this is"       //4 this is

单引号: 抑制 所有扩展,例如:

echo "$((2 + 2)) this is"       //$((2 + 2)) this is

转义字符

\\
\&
\$
\!

第八章:高级键盘技巧

  1. 光标移动:
Ctrl+A          //移动光标到行首
Ctrl+E          //移动光标到行尾
Ctrl+F          //光标向前移动一个字符
Ctrl+B          //光标向后移动一个字符
Alt+F           //光标向前移动一个字
Alt+B
Ctrl+L          //等价于clear,但是不会清除当前正在输入的字符
  1. 修改文本:
Ctrl+D          //删除光标处的字符
Ctrl+T          //使光标处的字符和前面的字符对调
Alt+T           //使光标处的字和前面的字符对调
Alt+L           //从光标到字尾的字符转换成小写
Alt+U           //从光标到字尾的字符转换成大写
  1. 剪切和粘贴文本:
Ctrl+K          //剪切从光标到行尾的文本
Ctrl+U          //剪切从光标到行首的文本
Alt+D           //剪切从光标到当前词尾的文本
Alt+Backspace   //剪切从光标到词头的文本,如果光标在词头,则剪切这个单词
Ctrl+Y          //粘贴文本

自动补齐功能:在输入命令时,按TAB键将自动触发自动补齐功能。
使用历史命令:

history | less
history | grep /usr/bin         //搜索并打印 /usr/bin目录下的命令

bash也支持以递增的方式搜索历史纪录,按下Ctrl+R,接着输入你要查找的内容,选定查找好的内容,按下enter表示执行该命令,按下Ctrl+J则表示把选定好的内容复制到当前命令行,要退出搜索按下Ctrl+C或者Ctrl+G即可。

Ctrl+P          //移动到前一条历史命令,等价于向上箭头
Ctrl+N          //移动到后一条历史命令 
Ctrl+R          //逆向递增搜索
Alt+P           //逆向非递增搜索,输入待搜索的字符,按下enter才执行
Alt+N           //向前非递归搜索
Ctrl+O          //执行列表中的当前项,执行完后跳到下一项

历史纪录扩展:
使用! string来重复历史命令

!!              //重复最后一个执行的命令
!number         //重复历史类记录中第number行的命令
!string        //重复最近以string开头的历史命令
!?string        //重复以string开头的历史命令    

第九章:权限

用户群组与权限
每一个用户(user)都有一个唯一的用户标识符(uid),放在/etc/passwd中,为了用户间共享文件或者资源,引入了群组(group)的概念,Linux中的每个用户都属于群组,每一个群组都有一个群组标识符(gid),每个用户至少有一个同名的群组,当然也可以加入到其它群组。
一般用户只能访问自己的文件和同群组中其它成员共享的文件,不能访问其它群组的成员的文件,root用户则不受此限制,root用户具有最高权限。
在Ubuntu系统中:

id          //uid=1000(user) gid=1000(user) groups=1000(user),4(adm),24(cdrom),27(sudo),30(dip),46(plugdev),113(lpadmin),128(sambashare)

使用ls -l命令得到的前十个字符表示文件的属性:

文件属性 所有者权限 组权限 其它用户权限
- rwx rw- r–

文件属性分类:

-               //普通文件
d               //目录
l               //符号链接,剩下的属性总是rwxrwxrwx
c               //字符设备文件
b               //块设备文件

剩下的九个字符表示文件模式:

r           //允许打开和读取文件
w           //允许写入和阶段文件
x           //允许把文件当作程序一样执行

例如:

-rwx------      //普通文件,文件所有者具有读取、写入和执行权限,其它没有任何访问权限

chmod: 改变文件模式,通常使用八进制来表示:

八进制 二进制 文件模式
0 000
1 001 –x
2 010 -w-
3 011 -wx
4 100 r–
5 101 r-x
6 110 rw-
7 111 rwx

使用方式:

chmon 600 file      //将文件file的文件模式改为600即rw-------

符号表示法:

u           //user简写
g           //文件所属群组
o           //other,其它所有用户
a           //all u,g,o三者组合

用法:

chmod u-x file      //删除file文件的文件所有者的可执行权限
chmod +x file       //等价于chmod a+x
chmod go-rw file    //

umask:设置默认权限。
我的Ubuntu使用umask命令后得到的是:0002。四个数字,第一个数字代表特殊权限,后面三个数字都是八进制,假设是xyz,那么目录的权限为(7-x)(7-y)(7-z),文件的默认权限为(6-x)(6-y)(6-x),例如:

ls -l foo.txt       //-rw-rw-r-- (664)

更改身份:
su:以root用户来运行shell,常见如:

su -        //提示输入密码后,进入root权限,$变成#
exit        //退出root权限
su -c 'command'   //

sudo:受限制的su,切换到root,命令执行完成后退回当前用户,不需要启动一个新的shell环境。
chown:更改文件所有者和所属群组,格式:

chown [owner] [:[group]] file...

例如:

sudo chown janet: ~tony/myfile.txt      //改变文件的所属者 

chgrp:改变文件的所属群组。
更改密码:passwd命令。

主要参考自《Linux命令行大全》William E. Shotts, Jr. 著 郭光伟 郝记生 译 以及 Linux命令大全。

你可能感兴趣的:(shell,shell)