Linux命令行大全——(1)学习shell

前言

最近在看Shotts大神写的Linux命令行大全,写篇blog做一下笔记。已经玩Linux快1年了,基本操作和解决问题的能力还是有的,这本书也的确不错,不是那种很玄学的书,通俗易懂却又知识量丰富,适合帮助我加深对Linux命令的理解和记忆。

这篇blog按照书籍的顺序,分为4个部分进行总结,学习shell,配置与环境,常见任务和主要工具,编写shell脚本。

PS:本篇所有命令前带 。

1. 简单命令

  1. 查看当前时间

    1
    $ date
  2. 查看当前日期

    1
    $ cal
  3. 查看磁盘可用空间

    1
    $ df
  4. 查看内存可用空间

    1
    $ free
  5. 关闭终端

    1
    $ exit

2. 导航

  1. 查看当前工作目录

    1
    $ pwd
  2. 改变目录

    1
    $ cd
  3. 列出当前目录下的内容

    1
    $ ls
选项 长选项 含义
-a —all 列出所有文件(含隐藏)
-d —directory 查看目录本身的信息
-F —classify 名字是文件夹时,后面带斜杠/
-h —human-readable 以长格式列出
-l 使用长格式列出结果
-r —reverse 倒序显示结果
-S 按文件大小对结果排序
-t 按修改时间排序

3. 文件系统

  1. 确定文件类型

    1
    $ file filename
  2. 查看文件内容

    1
    $ less filename

    • Q: 为什么less表示查看文件?
      A: 早期是more,后来有句less is more,就改了233333

4. 操作文件与目录

  1. 通配符
形式 匹配项
* 所有文件
g* 以g开头的任一文件
b*.txt 以b开头,中间有任意多个字符,并以.txt结尾的任一文件
Data??? 以Data开头,后面跟3个字符的任一文件
[abc]* 以abc中的任一个开头
BACKUP.[0-9][0-9][0-9] 以BACKUP.开头,后面跟3个数字的任一文件
[[:upper:]1]* 以大写字母或1开头的任一文件
[![:digit:]]* 不以数字开头的任一文件
*[[:lower:]123] 以小写字母或数字1,2,3中的任一个结尾的任一文件
  1. 创建目录

    • 单个名为dir的文件夹

      1
      $ mkdir dir
    • 多个文件夹

      1
      $ mkdir dir1 dir2 dir3
  2. 复制文件和目录

    1
    $ cp item1 item2
    • cp命令选项
选项 含义
-a, —archive 复制文件和目录及其属性,包括所有权和权限,复制后的文件具有默认属性
-i, —interactive 覆盖已存在文件时,会提示用户进行确认
-r, —recursive 递归地复制目录及其内容,如果目标文件夹不存在,会自动创建
-u, —update 只复制目标文件里不存在的文件或相应文件的更新文件
-v, —verbose 复制文件时,会显示信息性消息
  1. 移除和重命名文件

    1
    $ mv item1 item2
    • mv命令选项
选项 含义
-i, —interactive 覆盖已存在文件时,会提示用户进行确认
-u, —update 只移动目标文件里不存在的文件或相应文件的更新文件
-v, —verbose 移动文件时,会显示信息性消息
  1. 删除文件和目录

    1
    $ rm item
    • rm命令选项
选项 含义
-i, —interactive 删除已存在文件时,会提示用户进行确认
-r, —recursive 递归地删除目录及其内容,如果目标目录有子目录的话,自动删除
-f, —force 忽略不存在的文件并无需确认,该选项存在时会覆盖-i选项
-v, —verbose 删除文件时,会显示信息性消息
  1. 创建链接

    • 硬链接(早期链接)

      1
      $ ln file link
    • 符号链接(先进一点)

      1
      $ ln -s file link

5. 命令的使用

  1. 命令有哪些?

    • 可执行程序
    • shell内置命令
    • shell函数
    • alias命令
  2. type——显示命令的类型

  3. which——显示可执行程序的位置
  4. help——获取shell内置命令的帮助文档
  5. man——显示程序的手册页
  6. apropos——显示合适的命令
  7. whatis——显示命令的简要描述
  8. info——显示程序的info条目
  9. 使用别名来创建自己的命令
    1
    $ alias name='string'

6. 重定向

  1. 标准输出&错误重定向

    • 标准输出重定向

      1
      $ ls -l /usr/bin > ls-output.txt

      使用>>让输出结果添加在尾部

      1
      $ ls -l /usr/bin >> ls-output.txt
    • 标准错误重定向

      1
      $ ls -l /bin/usr 2> ls-error.txt
    • 标准输出和标准错误输出重定向到同一个文件

      1
      $ ls -l /bin/usr > ls-output.txt 2>&1

      1
      $ ls -l /bin/usr &> ls-output.txt
    • 丢弃输出到Dev null

      1
      $ ls -l /bin/usr 2> /dev/null
  2. 标准输入重定向

  3. cat——合并文件

    1
    $ cat movie.mpeg.0* > movie.mpeg
  4. 管道|(把标准输出作为另一个命令的标准输入)

    1
    $ Command1 | Command2

    例:

    1
    $ ls -l /usr/bin | less
  5. 过滤器(多个管道)

    1
    $ ls /bin /usr/bin | sort | less
  6. uniq——报告或忽略文件中重复的行

    • 没有重复行

      1
      $ ls /bin /usr/bin | sort | uniq | less
    • 列出重复的行

      1
      $ ls /bin /usr/bin | sort | uniq -d | less
  7. wc——打印行数,字数和字节数

    1
    $ wc ls-output.txt

    查看已排序列表的条目数

    1
    $ ls /bin /usr/bin | sort | uniq | less | wc -l
  8. grep——打印匹配行

    • 搜索出文件名中包含zip的所有文件

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
          $ ls /bin /usr/bin | sort | uniq | grep zip
      ~~~

      | 选项 | 含义 |
      | --- | --- |
      | -i | 忽略大小写 |
      | -v | 只输出和模式不匹配的行 |

      7. head/tail——打印文件的开头部分/结尾部分
      * 打印前十行
      ~~~bash
      $ head -n 10 ls-output.txt
    • 打印后十行

      1
      $ tail -n 10 ls-output.txt

      也可以应用在管道中

      1
      2
      3
      4
      5
      6
          $ ls /usr/bin | tail -n 5
      ~~~

      8. tee——从stdin读取数据,并同时输出到stdout和文件
      ~~~bash
      $ ls /usr/bin | tee ls.txt | grep zip

7. 透过shell看世界

  1. 扩展

    1
    $ echo *
  2. 路径名扩展

    1
    2
    3
    4
    $ echo D*
    $ echo *s
    $ echo [[:upper:]]*
    $ echo /usr/*/share
  3. 波浪线扩展
    拓展当前用户的主目录名

    1
    $ echo ~
  4. 算术扩展

    1
    $ echo $((expression))

    例:

    1
    2
    3
    4
    $ echo $((2+2))  // 4
    $ echo $(($((5**2))*3)) // 5^2 * 3 = 75
    $ echo Five divided by two equals $((5/2)) // 2
    $ echo with $((5%2)) left over // 1
  5. 花括号扩展

    1
    2
    3
    4
    $ echo Number_{1..5} // Number_1 Number_2 Number_3 Number_4 Number_5
    $ 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
    $ echo a{A{1,2},B{3,4}}b // aA1b aA2b aB3b aB4b
    $ mkdir {2009..2011}-0{1..9} {2009..2011}-{10..12} // 摄影师图集按月份创建-骚操作
  6. 参数扩展

    1
    2
    $ echo $USER // fuujiro
    $ printenv | less // 查看可用变量列表
  7. 命令替换

    1
    2
    3
    $ echo $(ls)
    $ ls -l $(which cp)
    $ file $(ls /usr/bin/* | grep zip)
  8. 引用

    • 引用造成的问题($100未定义,扩展成了空字符串)

      1
      $ echo The total is $100.00 // The total is .00
    • 双引号

      1
      $ ls -l "two words.txt"
    • 单引号(抑制)

    • 转义字符
      大专栏   Linux命令行大全——(1)学习shellash">
      1
      $ echo "The balance for user $USER is: $5.00"

8. 高级键盘技巧

请戳->终端HHKB键盘杀手技这篇blog~

  • 使用历史命令
    1
    2
    $ history | less
    $ history | grep /usr/bin

9. 权限

胡扯:UNIX和MS-DOS操作系统不同,区别是UNIX不仅是多任务(multitasking)系统,而且还是多用户(multiuser)系统,这是深嵌在操作系统设计理念的一个特色功能。为啥,可以自己想想啦~

  1. 所有者,组成员和其他用户

    1
    2
    3
    4
    fuujiro@fuujiro-PC ~/f/test> file /etc/shadow
    /etc/shadow: regular file, no read permission
    fuujiro@fuujiro-PC ~/f/test> less /etc/shadow
    /etc/shadow: Permission denied

    产生这个错误的原因是,作为一个普通用户,没有读取这个文件的权限。

    1
    2
    fuujiro@fuujiro-PC ~/f/test> id
    uid=1000(fuujiro) gid=1000(fuujiro) groups=1000(fuujiro),7(lp),27(sudo),100(users),109(netdev),113(lpadmin),117(scanner),123(sambashare)
  2. 读取、写入和执行
    对文件和目录的访问权限是按照读访问、写访问以及执行访问来定义的。

    1
    2
    fuujiro@fuujiro-PC ~/f/test> ls -l ls-output.txt 
    -rw-r--r-- 1 fuujiro fuujiro 99672 Aug 8 18:28 ls-output.txt

    列出输出结果的前10个字符表示的是文件属性(file attribute),其中第一个字符表示文件类型(file type)。
    -rw-r--r--可分为

- rw r r
文件类型 所有者权限 组权限 其他用户权限
  • 文件属性
属性 文件类型
- 普通文件
d 目录文件
l 符号链接
c 字符设备文件
b 块设备文件
  • 权限属性
属性 文件 目录
r 打开和读取 如果设置了执行权限,允许列出目录
w 写入和截短 重命名和删除由目录权限决定
x 允许把文件当作程序一样执行 允许进入目录下
  1. chmod——更改文件模式
    只有文件所有者和超级用户才可以更改文件或者目录的模式。chmod命令支持两种不同方式改变文件模式——八进制和符号表示法。
  • 八进制表示法
八进制 二进制 文件模式
0 000 —-
1 001 —x
2 002 -w-
3 003 -wx
4 004 r—
5 005 r-x
6 006 rw-
7 007 rwx
    例:
    
  
  
1
2
3
4
5
fuujiro@fuujiro-PC ~/f/test> ls -l ls.txt
-rw-r--r-- 1 fuujiro fuujiro 15877 Aug 9 08:28 ls.txt
fuujiro@fuujiro-PC ~/f/test> chmod 600 ls.txt
fuujiro@fuujiro-PC ~/f/test> ls -l ls.txt
-rw------- 1 fuujiro fuujiro 15877 Aug 9 08:28 ls.txt
  • 符号表示法
符号 含义
u user的简称,表示文件或目录的所有者
g group的简称,文件所属群组 
o others的简写,表示其他用户
a all的简写,是u,g,o三者的组合
u+x 为文件所有者添加可执行权限
u-x 删除文件所有者的可执行权限
+x 相当于a+x
o-rw 除了我user和group外,删除其他用户的读写权限
go=rw g,o具有读写权限;如果g,o之前具有可执行权限,则删除jincheng
u+x,go=rx 需要多种权限时,需要逗号分隔
  1. 采用GUI设置文件模式
    GNOME和KDE桌面系统都可右击文件或目录图标,弹出GUI框设置。

  2. umask——设置默认权限

    了解——>掩码操作

  3. 更改身份

    • su——以其他用户和组ID的身份来运行shell
    • sudo——以另一个用户的身份执行命令
  4. chown——更改文件所有者和所属群组
    更改文所有者和所属群组,需要超级用户权限。

  5. chgrp——更改文件所属群组
    类似与chown。

  6. 更改用户密码

    1
    $ passwd

10. 进程

每个进程有自己的进程ID(PID,process ID),进程ID按递增的顺序来分配,init的进程的PID始终为1

  1. 使用ps命令查看进程信息
    只能得到当前终端会话的进程信息(我用的不是bash,是fish)

    1
    2
    3
    4
    fuujiro@fuujiro-PC ~/f/test> ps
    PID TTY TIME CMD
    3400 pts/0 00:00:00 fish
    6016 pts/0 00:00:00 ps

    ps xps aux可以得反映系统运行情况的更大视图界面

    1
    2
    $ ps x
    $ ps aux
  1. 使用top命令动态查看进程信息

    1
    $ top

    动态(默认每3秒刷新一次),主要用于查看系统“最高(top)”进程的运行情况。
    键盘控制:

    • h: 显示帮助界面
    • q: 退出top命令
  2. 控制进程
    xlogo测试

    1
    $ xlogo
  1. 中断进程
    Ctrl+c可以中断一个程序,比如上面的xlogo

  2. 使进程在后台运行

    1
    $ xlogo &

    测试:

    1
    2
    3
    4
    5
    6
    7
    8
    fuujiro@fuujiro-PC ~/f/test> ps
    PID TTY TIME CMD
    3400 pts/0 00:00:00 fish
    6305 pts/0 00:00:00 xlogo
    6368 pts/0 00:00:00 ps
    fuujiro@fuujiro-PC ~/f/test> jobs
    Job Group CPU State Command
    1 6412 0% running xlogo &

    jobs中每个启动的作业都有自己的作业编号,比如上面是1。
    bg让进程恢复在前台运行。

  3. 使进程回到前台运行

    1
    2
    3
    4
    5
    6
    fuujiro@fuujiro-PC ~/f/test> jobs
    Job Group CPU State Command
    1 6412 0% running xlogo &
    fuujiro@fuujiro-PC ~/f/test> fg %1
    Send job 1, “xlogo &” to foreground
    ^C⏎

    fg命令中%后跟的数字是作业编号。

  4. 停止(暂停)进程
    Ctrl+Z暂停进程

    1
    $ bg %1

    bg命令让进程到后台运行。

  5. 信号
    kill命令通常用来杀死进程。

    1
    2
    3
    4
    5
    6
    7
    8
    fuujiro@fuujiro-PC ~/f/test> xlogo &
    fuujiro@fuujiro-PC ~/f/test> Warning: Cannot convert string "xlogo32" to type Pixmap
    ps
    PID TTY TIME CMD
    3400 pts/0 00:00:00 fish
    6942 pts/0 00:00:00 xlogo
    6947 pts/0 00:00:00 ps
    fuujiro@fuujiro-PC ~/f/test> kill 6942

    除了kill信号,还有比如:
    Ctrl+c给出个INT(中断,Interrupt)的信号;
    Ctrl+Z给出个TSTP(终端暂停,Terminal Stop)的信号。

  6. 使用kill命令发送信号到进程

    1
    $ kill [-signal] PID...

    如果命令行中没有指定信号,那么默认发送TERM(终止,Terminate)信号。

信号编号 信号名 含义
1 HUP 挂起命令
2 INT 中断信号
9 KILL 杀死信号
15 TERM 终止信号 
18 CONT 继续运行信号
19 STOP 暂停信号 |

  
  
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
fuujiro@fuujiro-PC ~/f/test> xlogo &
fish: Job 1, “xlogo &” terminated by signal SIGTERM (Polite quit request)
fuujiro@fuujiro-PC ~/f/test> Warning: Cannot convert string "xlogo32" to type Pixmap
ps
PID TTY TIME CMD
3400 pts/0 00:00:00 fish
7122 pts/0 00:00:00 xlogo
7127 pts/0 00:00:00 ps fuujiro@fuujiro-PC ~/f/test> xlogo &
fish: Job 1, “xlogo &” terminated by signal SIGTERM (Polite quit request)
fuujiro@fuujiro-PC ~/f/test> Warning: Cannot convert string "xlogo32" to type Pixmap
ps
PID TTY TIME CMD
3400 pts/0 00:00:00 fish
7318 pts/0 00:00:00 xlogo
7323 pts/0 00:00:00 ps
fuujiro@fuujiro-PC ~/f/test> kill -INT 7318
fuujiro@fuujiro-PC ~/f/test> kill -1 7122
1
2
3
4
5
6
7
8
9
fuujiro@fuujiro-PC ~/f/test> xlogo &
fish: Job 1, “xlogo &” terminated by signal SIGTERM (Polite quit request)
fuujiro@fuujiro-PC ~/f/test> Warning: Cannot convert string "xlogo32" to type Pixmap
ps
PID TTY TIME CMD
3400 pts/0 00:00:00 fish
7318 pts/0 00:00:00 xlogo
7323 pts/0 00:00:00 ps
fuujiro@fuujiro-PC ~/f/test> kill -INT 7318
  1. 使用killall命令发送信号到多个进程

    1
    $ killall [-u user] [-signal] name...

    例:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    fuujiro@fuujiro-PC ~/f/test> xlogo &
    fish: Job 2, “xlogo &” terminated by signal SIGINT (Quit request from job control (^C))
    fuujiro@fuujiro-PC ~/f/test> Warning: Cannot convert string "xlogo32" to type Pixmap
    xlogo &
    fuujiro@fuujiro-PC ~/f/test> Warning: Cannot convert string "xlogo32" to type Pixmap
    ps
    PID TTY TIME CMD
    3400 pts/0 00:00:00 fish
    7408 pts/0 00:00:00 xlogo
    7413 pts/0 00:00:00 xlogo
    7420 pts/0 00:00:00 ps
    fuujiro@fuujiro-PC ~/f/test> killall xlogo
    fuujiro@fuujiro-PC ~/f/test> ps
    PID TTY TIME CMD
    3400 pts/0 00:00:00 fish
    7467 pts/0 00:00:00 ps
    fish: Job 2, “xlogo &” terminated by signal SIGTERM (Polite quit request)
    fish: Job 1, “xlogo &” terminated by signal SIGTERM (Polite quit request)
  2. 更多命令

命令 描述
pstree 树状输出进程列表
vmstat 输出系统资源使用情况的快照
xload 图形化显示| 
tload Ctrl+c退出|

猜你喜欢

转载自www.cnblogs.com/liuzhongrong/p/12390484.html