The Linux Command Line

This passage is about getting started with GNU/Linux by reading The Linux Command Line. Chinese version is available here. It’s an excellent introductory book of Linux. No more talk, let’s just get it started. If you want to see more details, read this book, because I will ignore many details of a commmand like “How many options do this command has ?” or “how to use every option of a command ?”.

我的环境: Unbuntu 18.04LTS virtual machine.
还是不用我那四级水平的英语了。这不是文档,只是笔记。详细信息请使用man或者查看文档。

Part 1 – Learning The Shell

shell

首先什么是Shell?Shell翻译为壳,是对应于核的概念,shell是CLI(Command Line Interface,与之对应的为GUI)的命令解析工具,类似于windows下的cmd。Shell读取用户从键盘的输入,将其解释为对应的命令,然后执行对应的程序。在Linux中,常用的Shell有Bash,这里使用的即是Bash。

当使用GUI时,通常我们需要使用终端模拟器来和Shell交互。不同GUI叫法不太一样,或Terminal(终端)或Console(控制台)或其他。

Terminal Emulators 终端模拟器

tiko@killing-boat:~$              #普通用户
root@killing-boat:/home/tiko#     #superuser

键入每一条命令前的Shell提示符:username@machinename : current-working-directory $
last character: # means superuser/administrator.

最简单的几条命令:

date - display date
cal - display the calender
df - to see the current amount of free space on your disk drives
free - display the amount of free memory
exit - closing the terminal emulator window

The Console Behind The Curtain:
Pressing Ctrl-Alt-F1 through Ctrl-Alt-F6 to switch.
My machine : Ctrl-Alt-F1/F2 are GUIs, Ctrl-Alt-F3 to F6 are CLIs.

Command

Shell命令基本格式:

command [选项options] [参数arguments]

有的选项不需要参数像ls -l,有的选项参数可选,像ls <file>不给参数则使用默认参数.。有的命令可以带多个参数。
选项分长选项与短选项,长选项如--help--开头,短选项如-l-开头。多个短选项可合并如ls -alh

每个命令具体选项信息、参考文档可以通过以下帮助命令得到:

command --help  # 获取命令帮助的选项,较为简略
help command    # Shell内部命令帮助,仅对内部命令有效,比如cd
man command     # 命令手册manual,常用
info command    # 比man更为详细

使用下面的命令在系统中游走:
pwd - Print name of current working directory
cd - Change directory

cd ..         # 上一级
cd -          # 上一次工作目录
cd ./subdir   # 子目录
cd .          # 当前目录

Linux中使用目录(directory)而不使用文件夹(folder)的概念。
文件与目录的路径可以是绝对路径(like /root/code/me)或者相对路径(like ../mydir/mydir/file ./subdir/file)。

ls - List directory contents

ls dir-or-file-path  # default is .

常用选项:

ls -a   # 所有文件与目录,包括.开头的隐藏文件
ls -l   # 长格式
ls -h   # 文件大小以人可读的方式列出
ls -d   # 列出目录本身,而不是其中的内容
ls -F   # 在文件结尾附加文件类型
          # * 可执行文件
          # / 目录
          # @ 链接文件
          # | 管道文件
          # = 套接字
          # > 进程间通讯设备

上面的-a -l等称为选项(options),而后跟参数(parameter)。
ls命令所有选项与详细信息可使用下列命令得到:

ls --help
man ls
info ls

根目录/下每一个目录都有其作用,可参见这里

/        根目录,万物起源
/bin     二进制程序
/boot    Linux内核,RAM系统映像,启动加载程序
/dev     设备节点,一切皆是文件
/etc     系统层面配置文件,shell脚本
/home    普通用户家目录上一级
/lib     系统核心程序库文件
/media   可移除设备自动挂载点
/mnt     同上,早期linux系统中
/opt     安装可选软件
/proc    虚拟文件系统,内核相关
/root    root用户家目录
/sbin    系统二进制文件,为root用户保留
/tmp     存储临时文件,重启清空
/usr     包含用户所需要所有程序和文件
/var     动态文件存储地址

我的根目录:

tiko@killing-boat:~$ ls -F /
bin/   cdrom/  etc/   initrd.img@      lib/    lost+found/  mnt/  proc/  run/   snap/  swapfile  tmp/  var/      vmlinuz.old@
boot/  dev/    home/  initrd.img.old@  lib64/  media/       opt/  root/  sbin/  srv/   sys/      usr/  vmlinuz@

file – Determine file type 显示文件类型
less – View file contents 查看文本文件内容
cat – 亦是查看文本内容,与less有区别
tree – 以树形结构打印目录文件(需要先安装:sudo apt-get install tree

Manipulating Files And Directories

cp – Copy files and directories
使用-i选项来提示是否要覆盖已存在文件,若没有则直接覆盖。
mv – Move/rename files and directories
移动到不同目录即移动,移动到当前目录即重命名。
mkdir – Create directories

mkdir dir1 dir2 ../dir3
mkdir -p ./mydir1/mydir2   # 递归创建

rm – Remove files and directories 删除文件与目录

rm -rf /*    # 人们常开的玩笑 -f 强制执行,-r递归删除目录与文件 

其中*是通配符,详细信息查看这里
ln – Create hard and symbolic links 创建硬链接或者符号链接

ln fun fun-hard       # to create a hard link, point to a block of disk
ln -s fun fun-soft    # to create a symbolic link, point to the path of a file

Working With Commands

type – Indicate how a command name is interpreted 表明命令类型,分类:alias别名、bulitinShell内建命令、file磁盘可执行文件、functionShell函数、keyword关键字/Shell保留字。

tiko@killing-boat:~$ type ls
ls 是 `ls --color=auto' 的别名
tiko@killing-boat:~$ type cd 
cd 是 shell 内建
tiko@killing-boat:~$ type cp
cp 是 /bin/cp

which – Display which executable program will be executed

tiko@killing-boat:~$ which gcc
/usr/bin/gcc

help – Get help for shell builtins
man – Display a command’s manual page 使用man查手册
apropos – Display a list of appropriate commands
info – Display a command’s info entry
whatis – Display a very brief description of a command

tiko@killing-boat:~$ whatis ls
ls (1)               - list directory contents

alias – Create an alias for a command 给命令创建别名

alias ll='ls -alF'

使用alias不加选项与参数打印当前已经创建的别名。常用的已经创建的别名:

alias grep='grep --color=auto'
alias l='ls -CF'
alias la='ls -A'
alias ll='ls -alF'
alias ls='ls --color=auto'

键入alias命令创建的别名在终端关闭后失效。

Redirection 重定向

cat - 连接文件并显示

cat log.txt test.txt

sort - 排序文本行
uniq - 报道或省略重复行

cat log.txt | uniq        # 打印出log.txt中内容,重复行只打印一次
cat log.txt | uniq -d     # 只打印重复行

grep - 打印匹配行
wc - 打印文件中换行符,字,和字节个数

tiko@killing-boat:~$ wc new.txt 
 19  61 416 new.txt

head - 输出文件第一部分

head -n 10 new.txt    # 查看前10行

tail - 输出文件最后一部分

tail -n 10 new.txt    # 查看尾10行

> - 重定向标准输出
>> - 以追加的方式重定向标准输出

cat log.txt test.txt > new.txt  # 将前面两个文件的内容连接并输出到

2> - 重定向标准错误输出
2>> - 以追加的方式重定向标准错误输出

tiko@killing-boat:~$ ahsjkfh 2> log.txt
tiko@killing-boat:~$ cat log.txt 
ahsjkfh:未找到命令

| - 管道符,将一个命令的输出作为另一个命令的输入

tiko@killing-boat:~$ ll | sort | grep code    # 多个管道符连接使用,过滤器
drwxrwx--x  8 tiko tiko  4096 520 22:53 code/

重定向到文件管道符到命令,千万不要混淆。

tee - 从 Stdin 读取数据,并同时输出到 Stdout 和文件

cat log.txt | tee new.txt | grep ha

使用| tee和重定向>作用类似,但是| tee可以在输出到文件的同时将信息输出到终端。

Seeing The World As The Shell Sees It

echo - 显示一行文本

tiko@killing-boat:~$ echo hello.world!
hello.world!
tiko@killing-boat:~$ echo * 
code examples.desktop log.txt new.txt snap test.txt 公共的 模板 视频 图片 文档 下载 音乐 桌面
tiko@killing-boat:~$ echo /*n
/bin /run /sbin
tiko@killing-boat:~$ echo /usr/*/share
/usr/local/share
tiko@killing-boat:~$ echo ~
/home/tiko
tiko@killing-boat:~$ echo ~root
/root
tiko@killing-boat:~$ echo $SHELL
/bin/bash
tiko@killing-boat:~$ echo $((2+3))
5

甚至可以求解表达式,形式:$((expression)),支持+ - * / % **(取幂)操作,$表示变量或者参数。

tiko@killing-boat:~$ echo $(( (4-2+3**2*10) / 10 % 2))
1

花括号展开,甚至可以嵌套

tiko@killing-boat:~$ echo front-{A,B,C}-back
front-A-back front-B-back front-C-back
tiko@killing-boat:~$ echo A{B{1,2},C{3,4}}D
AB1D AB2D AC3D AC4D
tiko@killing-boat:~$ echo {A..Z}
A B C D E F G H I J K L M N O P Q R S T U V W X Y Z

然后可以这样,超级棒有木有?解放生产力!

tiko@killing-boat:~$ mkdir mydir ; cd mydir
tiko@killing-boat:~/mydir$ mkdir {2007..2009}-0{1..9} {2007..2009}-{10..12}
tiko@killing-boat:~/mydir$ ls
2007-01  2007-05  2007-09  2008-01  2008-05  2008-09  2009-01  2009-05  2009-09
2007-02  2007-06  2007-10  2008-02  2008-06  2008-10  2009-02  2009-06  2009-10
2007-03  2007-07  2007-11  2008-03  2008-07  2008-11  2009-03  2009-07  2009-11
2007-04  2007-08  2007-12  2008-04  2008-08  2008-12  2009-04  2009-08  2009-12

参数展开

tiko@killing-boat:~/mydir$ echo $USER
tiko

命令替换,将一个命令的输出作为展开模式来使用,用法 $(command)

tiko@killing-boat:~$ ls -l $(which cp)
-rwxr-xr-x 1 root root 141528 118 17:43 /bin/cp

也可以使用一种旧语法,使用反引号 `

tiko@killing-boat:~$ ls -l `which cp`
-rwxr-xr-x 1 root root 141528 118 17:43 /bin/cp

使用双引号" ",除Shell的特殊字符$ \ 和 ` 之外均会失去其特殊含义。双引号中,参数展开,算术表达式,命令替换展开任然有效。

tiko@killing-boat:~$ echo there is a test
there is a test
tiko@killing-boat:~$ echo "there is a    test"
there is a    test

使用双引号可以很微妙,其中的空格不被当做分界符,而是一个字符。看一看下面:

tiko@killing-boat:~$ echo $(cal)
五月 2018 日 一 二 三 四 五 六 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
tiko@killing-boat:~$ echo "$(cal)"
      五月 2018         
日 一 二 三 四 五 六  
       1  2  3  4  5  
 6  7  8  9 10 11 12  
13 14 15 16 17 18 19  
20 21 22 23 24 25 26  
27 28 29 30 31

如果想使用$ \ ` 这些字符则需要转义 \$ \\ \`

如果要禁止所有展开,则使用单引号' '

tiko@killing-boat:~$ echo '$(cal)'
$(cal)

展开和引用是非常有用的东西,甚至可以说是学习Shell 最重要的部分

echo-e选项可以使其可以解释转义字符,转义字符参见ASCII码表的前32个字符。

tiko@killing-boat:~$ echo -e "\t$SHELL\a"
    /bin/bash

这里\t是制表符,\a是响铃。

Advanced Keyboard Tricks

首先:
clear - 清空屏幕
history - 显示历史命令

至于光标移动,不熟悉不写,可以看这里

自动补全使用Tab。如果有多个匹配项,则两次Tab显示所有匹配项。

!!执行上一条命令,直接上下箭头更方便。
!number执行历史命令列表中number行的命令。只想问真的有人会这样用吗??

需要用到的话在回来看。

Permissions 权限

Linux同Windows一样是多用户系统,所以需要管理用户、用户组与权限。
某些时候我们读写文件时会遇到权限不够的情况。以长格式列出一个文件的信息:

tiko@killing-boat:~$ ls -l log.txt 
-rw-rw-r-- 1 tiko tiko 41 526 11:11 log.txt

其中第一个字符表示文件类型。分类:-普通文件、d目录、l符号链接、c字符设备文件(如键盘)、b块设备文件(如硬盘)。【Linux中一切皆是文件
其后rw-rw-r--三个一组分别表示文件所有者、文件所有组、其他用户的读、写、执行权限。
其后一个数字表示该文件硬链接数目,然后是文件所有者以及文件所属用户组、字节为单位的文件大小、上次修改文件日期,最后为文件名。

当没有这个权限的用户对该文件执行该操作就会提示权限不够:

tiko@killing-boat:~$ ll /etc/shadow
-rw-r----- 1 root shadow 1357 430 16:13 /etc/shadow
tiko@killing-boat:~$ cat /etc/shadow
cat: /etc/shadow: 权限不够

id – 显示用户身份号

tiko@killing-boat:~$ id
uid=1000(tiko) gid=1000(tiko) 组=1000(tiko),4(adm),24(cdrom),27(sudo),30(dip),46(plugdev),116(lpadmin),126(sambashare)

其中uid是用户ID,gid是组ID。
用户帐户定义在/etc/passwd文件里面,用户组定义在/etc/group中,文件/etc/shadow包含了关于用户密码的信息。

chmod – 更改文件模式,仅文件/目录所有者和root用户可以更改

该命令两种使用方法:八进制数字表示、符号表示法。
八进制法的意思是将rwx三种权限作为三位二进制数,有权限为1,无权限为0,表示为八进制数。更改是使用三个八进制数更改所有者、所有组、其他人的权限。

ko@killing-boat:~$ ll log.txt 
-rwxrwxrwx 1 tiko tiko 41 526 11:11 log.txt
tiko@killing-boat:~$  chmod 764 log.txt ; ll log.txt 
-rwxrw-r-- 1 tiko tiko 41 526 11:11 log.txt*

上面的764表示为文件log.txt赋予rwxrw-r--权限。末尾的*表示该文件可执行(其实只有执行权限,执行会出现错误),不是文件名的一部分。
符号表示法比较麻烦,不写。用八进制表示法就很方便。

umask – 设置默认的文件权限

使用八进制掩码作为参数,默认权限rw-rw-rw-,掩码位为1,则创建新文件时该位权限被关闭。常用系统掩码位0002,默认屏蔽其他用户的写权限。一般情况下不需要更改。

tiko@killing-boat:~$ umask
0002
tiko@killing-boat:~$ umask 0000
tiko@killing-boat:~$ umask 
0000
tiko@killing-boat:~$ touch new.txt
tiko@killing-boat:~$ ll new.txt 
-rw-rw-rw- 1 tiko tiko 0 526 15:29 new.txt

其实除了读写执行外还有其他权限,这里略过。

su – 以另一个用户的身份来运行 shell

tiko@killing-boat:~$ su
密码: 
root@killing-boat:/home/tiko# su tiko
tiko@killing-boat:~$ exit
exit
root@killing-boat:/home/tiko# exit
exit
tiko@killing-boat:~$

可以看到su会重新启用一个Shell,exit退出该Shell返回原先Shell,不加参数默认切换到root用户。

sudo – 以另一个用户的身份来执行命令

tiko@killing-boat:~$ sudo apt-get update
[sudo] tiko 的密码:

其配置文件为/etc/sudoers,修改可配置sudo权限。

chown – 更改文件或者目录所有者

tiko@killing-boat:~$ ll -d .
drwx--x--x 20 tiko tiko 4096 526 15:37 ./

root@killing-boat:/home/tiko# chown root:root .
root@killing-boat:/home/tiko# ll -d .
drwx--x--x 20 root root 4096 526 15:37 ./

chgrp – 更改文件组所有权

root@killing-boat:/home/tiko# chgrp root .
root@killing-boat:/home/tiko# ll -d .
drwx--x--x 20 tiko root 4096 526 15:37 ./

passwd – 更改用户密码

passwd user

其他用来创建和维护用户与用户组的命令,见名知意:
adduser useradd groupadd

Processes 进程

进程详细定义见操作系统类教材,Linux Kernel核维护每一个进程的信息,并为每一个进程分配一个数字称PID。进程按PID升序排列。进程也有所有者和用户ID。

ps – 报告当前进程快照

tiko@killing-boat:~$ ps
   PID TTY          TIME CMD
 10383 pts/2    00:00:00 bash
 10553 pts/2    00:00:00 ps

top – 显示任务
jobs – 列出活跃的任务
在一个任务后加&将其作为后台任务,与执行一个前台任务时按Ctrl-Z功能相同,均为将任务中止转入后台等待,使用fg %number将其移入前台运行,bg %number将其移入后台运行。而执行一个任务时Ctrl-C为终止该任务。
bg – 把一个任务放到后台执行
fg – 把一个任务放到前台执行

tiko@killing-boat:~$ jobs
[1]   已停止               vim new.txt
[2]-  已停止               vim if.txt
[3]+  已停止               sudo visudo
tiko@killing-boat:~$ fg %3     # 则唤醒任务sudo visudo

kill – 给一个进程发送信号

kill [-signal] PID...
kill PID       # 杀死PID对应进程
kill -l        # 获得完整信号列表

killall – 杀死指定名字的进程
shutdown – 关机或重启系统

tiko@killing-boat:~$ xlogo &
[1] 10987
tiko@killing-boat:~$ xlogo &
[2] 10994
tiko@killing-boat:~$ ps
   PID TTY          TIME CMD
 10836 pts/0    00:00:00 bash
 10987 pts/0    00:00:00 xlogo
 10994 pts/0    00:00:00 xlogo
 10995 pts/0    00:00:00 ps
tiko@killing-boat:~$ fg %1
xlogo
^C
tiko@killing-boat:~$ killall xlogo
tiko@killing-boat:~$ ps
   PID TTY          TIME CMD
 10836 pts/0    00:00:00 bash
 11003 pts/0    00:00:00 ps
[2]+  已终止               xlogo

其他命令:
pstree – 输出一个树型结构的进程列表,这个列表展示了进程间父/子关系。
vmstat – 输出一个系统资源使用快照,包括内存,交换分区和磁盘 I/O。
xload – 一个图形界面程序,可以画出系统负载的图形。
tload – 与 xload 程序相似,但是在终端中画出图形。使用 Ctrl-c,来终止输出。

关机与重启(root用户不需要sudo):

sudo shutdown -h now    # 立即关机
sudo poweroff           # 立即关机
sudo init 0             # 立即关机
sudo shutdown -h -t 60  # 60s后关机
sudo shutdown -c        # 取消关机
sudo shutdown -r now    # 立即重启
sudo reboot             # 立即重启
sudo init 6             # 立即重启

OK, Part 1 is over. Let’s get to Part 2.

Part 2 – Configuration And The Environment

The Environment

printenv - 打印部分或所有的环境变量
不加选项执行之后你会看到所有环境变量。

tiko@killing-boat:~$ printenv SHELL
/bin/bash
tiko@killing-boat:~$ echo $SHELL
/bin/bash

一些有趣的环境变量:

  • SHELL 使用的Shell程序,如/bin/bash
  • HOME 用户家目录
  • PATH 可执行程序的搜索目录,用冒号分开的目录列表
  • PWD 当前工作目录
  • OLD_PWD 先前工作目录
  • USER 当前用户
  • PS1 用于订制Shell提示符
  • LANG 定义字符集与语言编码格式,我的为zh_CN.UTF-8

set - 显示环境变量与Shell变量
export — 导出环境变量,让随后执行的程序知道
alias - 创建命令别名

建立Shell环境的称为启动文件的配置脚本:
登录Shell会话:
- /etc/profile,所有用户的全局配置脚本。
- ~/.bash_profile,用户私有启动文件,用于扩展或重写全局配置脚本中的设置。
- ~/.bash_login,如果上面这个文件没有找到,则读取这个。
- ~/.profile,如果上面两个都没有找到,则读取这个,这是Debain发行版中的默认设置,比如Ubuntu中。

非登录Shell会话:
- /etc/bash.bashrc,全局配置脚本。
- ~/.bashrc,用户私有启动文件。

vi & vim

不用多说,经典的编辑器。vimvi的增强版,但我真的不会用,用不习惯,什么时候想好好折腾了再去理解vim的哲学吧。
终端键入vimtutor即可开始vim练习,半小时入门。vim的哲学

Customizing The Prompt

自己订制Shell提示符。详见这里。可以更改格式与颜色,比如这样:
shell

更改环境变量$PS1

tiko@killing-boat:~$ PS1="\[\033[1;35m\u@\h:\W$\] \[\033[1;33m\]"

其中一些主要转义字符:
\u 当前用户
\h 本地主机名
\w 当前工作目录
\$ 普通用户提示字符$

另外还可以及进行颜色控制。

Part 3 – Common Tasks And Essential Tools

Package Management

Linux发行版两大阵营:Debian, RedHat

阵营 发行版
Debian Debian, Ubuntu, Xandros, Linspire
RedHat Fedora, CentOS, Red Hat Enterprise Linux, OpenSUSE, Mandriva, PCLinuxOS

包管理工具:

风格 底层工具 顶层工具
Debian dpkg apt-get,aptitude
RedHat rpm yum

不过现在Ubuntu中好像鼓励用apt替代apt-get,原因是apt命令更简单,更友好。详见:Linux中apt与apt-get命令的区别与解释

当然还有其他不属于这两个阵营的发行版。上一张图体会一下Linux大家族:
linux

Storage Media 存储媒介

关于文件系统,这里就不多说了。Linux中大多使用ext3文件系统(我的是ext4,使用df -T或者cat /etc/fstab查看)。Linux维护单一的文件系统树,允许挂载不同文件系统的设备。
挂载,顾名思义,就是将文件设备连接到系统文件树上(Linux中一切皆是文件,设备亦然)。

文件/etc/fstab列出了系统启动时要挂载的设备。
/dev目录包含了所有系统中使用的外部设备。要使用就要将设备挂载到一个目录,然后通过访问该目录来访问设备。
设备文件分为块设备(Block device)和字节设备(Character device)。其中

  • 块设备文件,有缓冲可以随机存取(有物理设备与虚拟设备之分),如HDD,CD-ROM。
  • 字节设备文件,无缓冲只能顺序读取,如键盘,鼠标。

mount – 挂载一个文件系统
不带参数显示当前挂载的文件系统。列表格式:设备 on 挂载点 type 文件系统类型(可选的)。

mount -t [文件类型] /dev/设备 /mnt/挂载目录

umount – 卸载一个文件系统

umount /dev/设备

fsck – 检查和修复一个文件系统
fdisk – 分区表控制器
mkfs – 创建文件系统
fdformat – 格式化一张软盘(软盘没有人用了吧!)
dd — 把面向块的数据直接写入设备
genisoimage (mkisofs) – 创建一个 ISO 9660的映像文件
wodim (cdrecord) – 把数据写入光存储媒介
md5sum – 计算 MD5检验码

Networking 网络

ping - 发送 ICMP ECHO_REQUEST 软件包到网络主机

ping URL    # 向指定URL的主机发送一种叫做IMCP ECHO_REQUEST的特殊网络数据包

traceroute - 打印到一台网络主机的路由数据包
netstat - 打印网络连接,路由表,接口统计数据,伪装连接,和多路广播成员
ftp - 因特网文件传输程序(文件传输协议)
wget - 非交互式网络下载器
使用wget可以从网站或者FTP服务器上下载数据,比如下载github的首页:

wget github.com

ssh - OpenSSH SSH 客户端(远程登录程序)

Searching For Files 查找

locate – 通过名字来查找文件
快速搜索数据库,输出每个与字符串匹配的文件名。支持路径匹配与通配符。现在一般使用slocate或者mlocate,但命令一般依旧使用locate
我的locate的数据库为/var/lib/mlocate/mlocate.db,可在man手册中找到。这个数据库由updatedb程序周期性运行创建。所以新建的文件搜索不到的话,可手动执行sudo updatedb创建。

find – 在目录层次结构中搜索文件

find ~ -type d | wc -l

可以使用-type指定搜索类型,更多选项参考man手册。

xargs – 从标准输入生成和执行命令行
touch – 更改文件时间,如果文件不存在则创建文件
stat – 显示文件或文件系统状态

Archiving And Backup 归档与备份

文件压缩:
gzip – 压缩或者展开文件
bzip2 – 块排序文件压缩器
归档:
tar – 磁带打包工具
zip – 打包和压缩文件
文件同步程序:
rsync – 同步远端文件和目录

Regular Expressions 正则

正则内容不少,很早之前了解过,不过现在全忘了,什么时候需要用到了复习一下了,单独写。可参考这篇文章:正则表达式30分钟入门(才怪)。

Text Processing 文本处理

cat – 连接文件并且打印到标准输出
sort – 给文本行排序
uniq – 报告或者省略重复行
cut – 从每行中删除文本区域
paste – 合并文件文本行
join – 基于某个共享字段来联合两个文件的文本行
comm – 逐行比较两个有序的文件
diff – 逐行比较文件
patch – 给原始文件打补丁
tr – 翻译或删除字符
sed – 用于筛选和转换文本的流编辑器
aspell – 交互式拼写检查器

Formatting Output 格式化输出

nl – 添加行号
fold – 限制文件列宽
fmt – 一个简单的文本格式转换器
pr – 让文本为打印做好准备
printf – 格式化数据并打印出来
groff – 一个文件格式系统

Compiling Programs 编译程序

学习Linux,必然少不了在Linux上进行代码编译。Linux上最常用的编译工具自然是GNUGCC(GNU Compiler Collection,GNU编译器套件)了。

GNU make是Linux常用的维护程序的软件,我们用它来管理自己的项目。Make有自己的语法,可以在Makefile中编写项目中源文件的编译规则,指定源文件间的依赖关系。然后执行make命令即可编译整个项目。当项目中的源文件更改之后,make会检查源文件的时间戳,并重新编译所有依赖于被修改的文件的源文件。这在需要大量编译时间的大型项目中,是非常必要的。关于make的语法细节可参考Makefile经典教程,或者官方文档

Part 4 – Writing Shell Scripts

Shell脚本编写内容较多,放在下一次单独写。

猜你喜欢

转载自blog.csdn.net/qq_35527032/article/details/80560192