《鸟哥的Linux私房菜》读书笔记

By Mac小兔

在学习过程中记录的一些常用命令,供日常参考。

1 在线求助

1.1 man page

1.1.1 壳程序

文本模式登入后所取得的程序被称为壳,这是因为这支程序负责最外面跟使用者沟通,所以被戏称为壳程序

1.1.2 指令太长可以使用\进行分行

1.1.3 英文大小写字母是不一样的

1.1.4 语系的支持:

echo $LANG 或 locale

1.2 基础指令的操作

1.2.1 date:显示日期与时间的指令

date格式化:date +%Y/%m/%d 或 date +%H:%M

1.2.2 cal:显示日历的指令

cal [month][year]

1.2.3 bc

简单好用的计算器(如需小数点下位数,需执行scale=number,quit离开)

1.2.4 ctrl+d

类似于exit,能够直接离开

1.3 Linux系统的在线求助

1.3.1 man 之后,主动搜索关键词

向下搜索:输入/word,向上搜索:?string

1.3.2 man之后,常见的几个数字意义

如DATE(1)

代号 内容说明
1 用户在shell环境中可以操作的指令或可执行文件
2 系统核心可呼叫的函数与工具等
3 一些常用的函数与函式库,大部分为C的函式库
4 装置档案的说明,通常在/dev下的档案
5 配置文件或者是某些档案的格式
6 游戏
7 惯例与协议等,例如Linux文件系统、网络协议、ASCII code等等的说明
8 系统管理员可用的管理指令
9 跟kernel有关的文件

1.3.3 man 之后,大致分为几个部分

代号 内容说明
NAME 简短的指令,数据名称说明
SYNOPSIS 简短的指令下达语法简介
DESCRIPITION 较为完整的说明,这部分最好仔细看看
OPTIONS 针对SYNOPSIS部分中,有列举的所有可用的选项说明
COMMANDS 当这个程序在执行的时候,可以在此程序中下达的指令
FIFES 这个程序或数据所使用或参考或连结到的某些档案
SEE ALSO 可以参考的,跟这个指令或数据有相关的其他说明
EXAMPLE 一些可以参考的范例
BUGS 是否有相关的bug
  • man –f 指令(相当于whatis [指令或数据]):找出命令的所有完整名称
  • man –k 指令(相当于apropos[指令或数据]) 找出含有该指令的关键字的所有档案
  • whatis和apropos指令能使用,必须要建立whatis数据库才行,建立方法:makewhatis

1.4 man 和 info的区别

1.4.1 man page

一口气输出一堆信息

1.4.2 info page

将文件数据拆成一个一个的段落,每个段落用自己的页面来撰写,并且各个页面中还有类似网页的【超链接】来跳到各不同的页面中,每个独立的页面也被成为一个节点。

1.4.3 info page 文件放置

/usr/share/info/

1.4.4 /usr/share/doc

1.4.5 man page 显示内容的档案放置目录

/usr/share/man/ 、/usr/local/man

1.5 观察系统的使用状态

1.5.1 who

查看当前在线用户及详细信息

1.5.2 netstat –a

查看网络的联机状态

1.5.3 ps –aux

查看背景执行的程序

1.6 几个与关机/重启相关的指令

1.6.1 sync

将数据同步写入硬盘中的指令(系统关机或重启之前最好多执行几次)

1.6.2 shutdown

管用的关机指令

1.6.3 reboot,halt,poweroff

重新启动

1.6.4 halt和shutdown的区别:

  • halt:能够不理会目前系统状况下,进行硬件关机
  • shutdown:可以依据目前已启动的服务来逐次关闭各服务后才关机
  • Linux的7种执行等级
  • run level 0:关机
  • run level 3:纯文本模式
  • run level 5:含有图形接口模式
  • run level 6:重新启动

1.6.6 fsck

文件系统检查的指令

1.6.7 如果根目录损坏

可以使用Live CD利用光盘开机进入Linux操作系统,然后fsck设备名

1.7 建议划分的磁盘区块

/   /boot   /usr    /home   /var

1.8 root密码忘记,更改方法

http://jingyan.baidu.com/article/fec7a1e51096481191b4e746.html

2 Linux的档案权限与目录配置

2.1 Linux用户身份与群组记录的档案

2.1.1 /etc/passwd

记录系统上账号和root相关信息

2.1.2 /etc/shadow

记录个人的密码

2.1.3 /etc/group

所有的组名

2.2 基本命令

2.2.1 ls –l –full-time

能够显示完整的时间格式

2.2.2 权限修改指令

  • chgrp:改变档案所属群组
  • chown:改变档案拥有者
  • chmod:改变档案的权限,SUID,SGID,SBIT等的特性
  • 能不能进入目录和X权限有关,和r权限无关
  • 不管other身份是否具有某文件的r w x权限,只要在自己的home目录下,都有删除该文件

2.3 FIFO-数据输送文件

主要的目的解决多个程序同时存取一个档案所造成的错误问题

2.4 档案名

避免将档案档名的开头以-或+来命名

2.5 Linux目录配置的依据

FHS(Filesystem Hierarchy Standard)标准
  • 重点在于规范每个特定的目录下应该要放置什么样的数据
  • 根据FHS,目录定义为
可分享的 不可分享的
不变的(static) /usr(软件放置处) /etc(配置文件)
不变的(static) /opt(第三方协力软件) /boot(开机与核心档)
可变动的(variable) /var/mail(使用者邮件信箱) /var/run(程序相关)
可变动的(variable) /var/spool/news(新闻组) /var/lock(程序相关)

2.6 Linux登录数据记录位置

/var/log/wtmp

2.7 文件类型

2.7.1 连结档

类似Windows系统底下的快捷方式,第一个属性为l,例:lrwxrwxrwx

2.7.2 设备与装置文件

与系统周边及存储等相关的一些档案,通常都集中在/dev这个目录下,通常分为两种
- 区块(block)设备档:储存数据,字符b
- 字符(character)设备文件:一些串行端口接口设备,字符c

2.7.3 数据接口文件(socket),第一个属性为s

2.7.4 数据传送文件,第一个属性为p

2.8 /lib/modules/放置核心相关的模块(驱动程序)

2.9 /proc

本身是一个“虚拟文件系统”,放置的数据都是在内存当中,例如:系统核心、行程信息、周边装置的状态及网络状态

2.10 下面五个目录不可与根目录分开在不同的分割槽

  • /etc:配置文件
  • /bin:重要执行档
  • /dev:所需要的装置档案
  • /lib:执行档所需的函式库不核心所需的模块
  • /sbin:重要的系统执行文件

2.11 usr

Unix Software Resource Unix操作系统软件资源

2.12 /selinux

此目录的内容数据是在内存中的信息,不会占用任何硬盘容量,它是Linux核心的重要外挂功能之一,Secure Enhance Linux的执行目录

2.13 ./代表本目录

如果执行文件放置在本目录,但本目录并非正规的执行文件目录(/bin,/usr/bin等为正规),需要严格指定该执行档案,例./文件名.sh

2.14 查看Linux基本信息

  • uname –r 可以察看实际的核心版本
  • lsb_release –a:查看LSB版本

2.15 要开放目录给任何人浏览时,应至少给予r及x的权限,但w权限不可随便给

2.16

/bin放置的是一般用户惯用的指令,/sbin是系统管理员才会使用的指令,它们俩都与开机、单人维护模式有关,更多执行档被放置到/usr/bin及/usr/sbin底下

3 Linux档案与目录管理

3.1 – 代表前一个工作目录

3.2 pwd –P显示确实的路径

3.3 mkdir

  • –m 创建目录,并配置权限
  • –p 直接将所需要的目录递归建立起来

3.4 rmdir 仅能“删除空的目录”

3.5 echo $PATH $表示后面接的是变量

3.6 使用PATH=”$PATH”:/root

将/root路径加入到PATH中

3.7 ll=ls –l

3.8 cp复制

  • cp –a 源文件 目标文件 会将将档案所有特性都一起复制过来
  • cp –s 建立符合链接,类似一个快捷方式
  • cp –l 实体链接
  • cp –d 可以将链接文件的属性复制来
  • 可以将多个数据文件一次复制到同一个目录中去

    例:cp ~/.bashrc ~/.bash_history /tmp

3.9 删除带-开头的档案

rm ./–aaa-

3.10 touch(修改档案时间或建置新档)

3.10.1 可以建立空档案

3.10.2 时间参数

  • mtime:modification time 当该档案的内容数据变更时,会更新此时间
  • ctime: status time当该档案状态改变时,会更新此时间,如权限和属性
  • atime:access time 当档案的内容被取用时,更新此时间

3.10.3 如果系统时间来自未来,touch一下即可,三个时间参数都会变成当前时间

3.11 rename

可以用来更改大量档案的档名

3.12 取得路径的文件名与目录名称

3.12.1 basename 取得最后档案名

例:basename /etc/sysconfig/network  输出:network

3.12.2 dirname 取得目录名

例:dirname /etc/sysconfig/network 输出:/etc/sysconfig

3.13 档案内容查阅

3.13.1 cat

由第一行开始显示档案内容
-A 显示完整内容(包含特殊字符) tab(^I表示) 断行字符($表示)

3.13.2 tac

从最后一行开始显示

3.13.3 nl

显示的时候,顺道输出行号

3.13.4 more

一页一页的显示档案内容

3.13.5 less类似more,它可以往前翻页

3.13.6 head只看头几行

例:head –n -100 文档   除了后面100行数据都打印

3.13.7 tail 只看最后几行

例:tail –f 文档名  持续监测后面所接的文档,tail –n +100 文档名,档案从100行后都会被列出来

3.13.8 od 以二进制的方式读取档案内容

3.14 档案与目录的默认权限与隐藏权限

  • 其他系统隐藏属性,chattr来设定,lsattr来查看
  • chattr +i 文档,设置一个档案无法被删除,改名,或者写入等,取消-i
  • lsattr 查看隐藏的属性

3.15 umask(档案预设权限)

3.15.1 档案预设权限666

-rw-rw-rw-   -022 == -rw-r—r--

3.15.2 目录预设权限777

drwxrwxrwx  -022 == -drwxr-xr-x

3.15.3 修改值

直接在umask后面添加数字即可

3.16 Set UID,简称SUID特殊权限,限制和功能如下

  • 仅对二进制程序有效
  • 执行者对于该程序需要具有x的可执行权限
  • 本权限仅在执行该程序的过程中有效
  • 执行者将具有该程序拥有者的权限
  • 对目录无效

3.17 Set GID,功能如下

  • SGID对二进制程序有用
  • 程序执行者对于该程序来说,需具备x的权限
  • 执行者在执行的过程中将会获得该程序群组的支持

3.18 Sticky Bit,简称SBIT,对于目录的作用

  • 当用户对于此目录具有w,x权限,亦即具有写入的权限时;
  • 当用户在该目录下建立档案或目录时,仅有自己与root才有权利删除该档案

3.19 SUID(4)/SGID(2)/SBIT(1)权限设定

例 chmod 4755 filename

3.20 file 观察文件类型

3.21 搜索

3.21.1 which 脚本文件名的搜索(执行档)

-a列出所有可以找到的同名执行文件,非仅显示第一个;which预设是找PATH内所规范的目录,bash内建的指令不会查找

3.21.2 whereis(寻找特定档案)

速度快的原因:系统内的所有档案都记录在一个数据库档案里,使用whereis都会以此数据库档案的内容为准

3.21.3 locate

  • 方便忘记完整档案名时使用;
  • 它是由“已建立的数据库/var/lib/mlocate/”里面的数据所搜寻到的,缺点,数据库更新频率慢
  • 手动更新数据库方法:updatedb

3.21.4 find

可以找到n天内,或者n天前更动过的内容档案

  • find /etc –newer /etc/passwd :寻找/etc底下的档案,如果档案日期比/etc/passwd新就列出
  • find /home –user vbird:寻找/home 底下属于vbird的档案
  • find / -nouser 搜寻系统中不属于任何人的档案
  • find / -perm +7000 –exec ls –l {} \;
  • find 参数-a 表示and,-o表示or

3.22 alias 命令别名

3.23 id 账号 查阅账号的属性

4 Linux磁盘与文件系统管理

4.1 磁盘分区完毕后,格式化的原因

以便成为操作系统能够利用的“文件系统格式”

4.2 文件系统运作

4.2.1 档案权限(rwx)与文件属性(拥有者、群组、时间参数等)

4.2.2 inode

放置档案权限和属性,一个档案占用一个inode,有档案数据放置的block号码

4.2.3 data block区块

放置实际数据,若档案太大,会占用多个block

4.2.4 superblock超级区块

记录整个文件系统的整体信息,包括inode与block的总量、使用量、剩余量等,以及文件系统的格式与相关信息等,大小:1024bytes

4.2.5 优点

可以一口气将多个block内容全部读出来

4.2.6 由于ext是索引式文件系统,基本不需要碎片整理

4.3 data block(资料区块)

  • block大小与数量在格式化完就不能再改变
  • 每个block内最多放置一个档案的数据
  • 如档案大于block的大小,则一个档案会占用多个block数量
  • 如档案小于block,则该block的剩余容量就不能够再被使用了

4.4 inode table

4.4.1 每个inode大小均固定为128bytes

4.4.2 每个档案都仅会占用一个inode

4.4.3 文件系统能够建立的档案数量与inode的数量有关

4.5 superblock

4.5.1 只有在第一个block group内会含有superblock

4.5.2 大小1024bytes

4.6 Filesystem Description(文件系统描述说明)

可以描述每个block group的开始与结束的block号码,以及说明每个区段(superblock,bitmap,inodemap,data block)分别介于哪一个block号码之间

4.7 查看Linux支持的文件系统

ls –l /lib/modules/$(uname -r)/kernel/fs

4.8 已加载到内存中支持的文件系统

cat /proc/filesystems

4.9 Linux管理认识的文件系统

通过一个名为Virtual Filesystem Switch的核心功能去读取filesystem

4.10 /proc

这个目录本身是一个虚拟文件系统,放置的数据都是在内存中,如系统核心、行程信息、周边装置的状态及网络状态等,本身不占用任何硬盘空间上

4.11 磁盘与目录的容量

4.11.1 df

列出文件系统的整体磁盘使用量

4.11.2 du

评估文件系统的磁盘使用量
  • 直接输入,不加任何选项时,会分析“当前所在目录”的档案与目录所占用的硬盘空间
  • du –sm /* 检查根目录底下每个目录所占用的容量

4.12 实体链接和符号链接

4.12.1 Hard Link实体链接,硬式链接或实际连结

只是在当前目录价的block多写入了一个关联数据,既不会增加inode也不会耗用block数量
  • 不能跨Filesystem
  • 不能link目录
  • 建立一个独立的档案,读取档案link的那个档案档名
  • 修改符号链接档,实体文件也会跟着修改

4.12.3 当建立一个新目录时,新目录link数为2,上层目录数+1

4.13 延伸分割最好能够包含所有未分割的区间

  • SATA硬盘最多能够支持15号的分割槽
  • IDE则可以支持到63号
  • fdisk无法处理大于2TB以上的磁盘分区槽

4.14 磁盘格式化(make filesystem)

4.14.1 mkfs

例:mkfs –t ext3 /dev/hd2

4.14.2 格式化话需要指定详细信息,使用mke2fs

4.15 磁盘检验:fsck,badblocks

badblocks用来检查硬盘或软盘扇区有没有坏轨的指令

4.16 磁盘挂载和卸除

  • 单一文件系统不应该被重复挂载在不同的挂载点(目录)中
  • 单一目录不应该重复挂载多个文件系统
  • 要作为挂载点的目录,理论上应该都是空目录才是
  • 挂载命令:mount
  • linux支持的文件系统之驱动程序都写在如下目录中:
    /lib/modules/$(uname -r)/kernel/fs/
  • 正确的磁盘文件名要看你的光驱是什么连接接口的环境
  • 如果带有中文文件名的数据,可以指定挂载文件系统使用的语系,使用iocharset=utf-8
  • mount –bind :将某个目录挂载到其他目录
  • umount(将装置档案卸除):如果挂载的是目录,一定要用挂载点
  • e2label:修改文件系统标头(Label)
  • tune2fs:可以列出superblock的内容,还可以更新文件系统,ext2变成ext3等

4.17 dumpe2fs

每个区段与superblock的信息都可以使用该指令来查询

4.18 hdparm

可以帮助设定一些进阶参数

4.19 dump

一个用来作为备份的指令,可以透过fstab指定哪个文件系统必须进行dump备份,0代表不做dump备份,1代表每天进行dump的动作,2代表其他不定日期的dump备份动作

4.20 /etc/fstab

开机时的配置文件,主要记录的是挂载的文件系统

4.21 挂载光盘/DVD映像文件,无需刻录成光盘,也能使用

  • mkdir 目录
  • mount –o loop 文件所在目录(loop挂载回旋设备以及ISO镜像文件)

4.22 swap

  • 应付物理内存不足的情况下所造成的内存延伸记录的功能
  • 被利用到的时刻通常是物理内存不足的情况

4.23 partprobe

告知核心必须要读取新的分割表

4.24 开机管理程序

安装到boot sector,在superblock之前,如果block>2024byte,那么他们俩在一个block(0),如果block<2024byte,那么两者分别在不同的block

4.25 使用GUN的parted进行分割

4.25.1 parted 【装置】 【指令【参数】】

5 档案与文件系统的压缩与打包

5.1 常见的压缩指令

  • *.Z compress 程序压缩癿档案;
  • *.gz gzip 程序压缩癿档案;
  • *.bz2 bzip2 程序压缩癿档案;
  • *.tar tar 程序打包癿数据,并没有压缩过;
  • *.tar.gz tar 程序打包癿档案,其中并且经过 gzip 癿压缩
  • *.tar.bz2 tar 程序打包癿档案,其中并且经过 bzip2 癿压缩

5.1.1 compress:比较老旧的压缩指令

5.1.2 gzip:压缩之后,源文件不再存在

  • gzid –d == gunzip解压缩 gzip –c 保留原文档
  • zcat:读取纯文本档被压缩后的压缩文件

5.1.3 bzip2,bzcat

  • 是为了取代gzip并提供更佳的压缩比而来的
  • 压缩:bzip2 –z
  • 读取压缩的文档:bzcat
  • 解压缩:bzip2 –d == bunzip2

5.1.4 tar

  • 压缩:tar –jcv –f filename.tar.bz2 要被压缩的档案或目录名称
  • 查询:tar –jtv –f filename.tar.bz2
  • 解压缩:tar –jxv –f filename.tar.bz2 –C 欲解压缩的目录
  • 仅解开单一档案的方法:

    • 先查询找到我们要的档名
    • 将档案解开
      tar –jxv –f /root/etc.tar.bz2 etc/shadow
  • 打包某目录,但不含该目录下的某些档案
    例:tar –jcv –f /root/system.tar.bz2 –exclude=/root/etc* \ exclude=/root/system.tar.bz2 /etc /root

  • 基本名称:tarfile,tarball

    • tarfile:仅是打包
    • tarball:打包并压缩

5.2 完整备份工具:dump

5.2.1 可以备份整个filesystem,也可以针对目录来备份

5.2.2 备份完整的文件系统

  • 先找出需要备份的那个文件系统 df –h
  • 测试备份此文件系统需要多少容量:dump –S 文件系统
  • 完整备份文件系统:dump -0u –f /root/boot.dump /boot
  • –u 是将备份时间更新至/etc/dumpdates 档案,只支持完整备份

5.2.3 dump –W 查看是否有文件系统被dump过

5.2.4 备份目录时,需要完整备份,且不使用level和-u

5.3 restore复原

5.3.1 restore –C [-f dumpfile] [-D 挂载点]:比较dump与实际档案

5.3.2 restore –t [-f dumpfile] [-h] :查看dump档案

5.3.3 retore –i [-f dumpfile]:进入互动模式,可以从备份数据中只取出一部分

5.4 光盘写入工具

5.4.1 文本模式刻录作法

  • 先将所需要备份的数据建置成为一个映像档,利用mkisofs指令来处理
  • 将该映像文件刻录至光盘或DVD中,利用cdrecord指令来处理

5.4.2 mkisofs:建立映像档

5.4.3 cdrecord:光盘刻录工具

查询刻录机:cdrecord –scanbus dev=ATA

5.4.4 CD-RW会自动抹除,DVD-RW要自己手动抹除才行

5.5 其他常用的压缩和备份工具

5.5.1 dd

可以读取磁盘装置的内容,然后将整个装置备份成一个档案

dd if=”input_file” of=”output_file” bs=”block_size” count=”number”

tar可用来备份关键数据,dd则可以用来备份整颗partition或整颗disk

需要建置两颗一模一样的磁盘时,命令:

dd if=/dev/sda of=/dev/sdb

5.5.2 cpio

  • 可备份任何东西,不会主动的去找档案来备份,需配合find
  • 备份:cpio –ovcV > [file|device]
  • 还原:cpio –ivcdu < [file|device]
  • 察看:cpio –ivct < [file|device]

6 vim 程序编辑器

6.1 多窗口功能

(:sp),ctrl+w进行切换

6.2 多档案编辑

vim file1 file2 ;(:n 下一个档案   :N上一个档案 :files列出目前开启的所有档案)

6.3 查找设定值

一般模式下(:set all)

6.4 整体的vim设定值时放置在/etc/vimrc这个档案

6.5 记录动作的档案:(~/.viminfo)

6.6 DOS与Linux的断行字符

  • dos2unix [-kn] file [newfile] DOS转换成linux
  • unix2dos [-kn] file [newfile] linux转换成DOS

6.7 语系编码转换

6.7.1 iconv

7 认识与学习BASH

7.1 管理计算机硬件的是核心kernel,我们只能透过shell来跟核心沟通

7.2 Linux使用的shell版本称为:Bourne Again Shell(简称bash)

7.3 用户登录取得的shell记录在/etc/passwd这个档案内

7.4 bash优点:

7.4.1 命令编修能力:能记忆使用过的1000个指令(上下键),1000个指令放在个人目录下面的.bash_history(即~/.bash_history)

7.4.2 命令与档案补全功能

7.4.3 命令别名设定功能(alias)

7.4.3.1 直接输入alias,查看当前命令别名有哪些

7.4.3.2 也可以直接下达命令设定别名:如:alias lm=’ls -al’

7.4.4 工作控制、前景背景控制(Linux过程控制中讲解)

7.4.5 程序化脚本(shell scripts)

7.4.6 通配符

7.5 使用type指令可以观察某个指令是来自于外部还是内建的bash中

7.5.1 例 typy [-tpa] name

7.6 Shell的变量功能

7.6.1 环境变量是大写,自定义变量是小写

7.6.2 变量设定规则

7.6.2.1 等号=两边不能直接接空格符

7.6.2.2 变量名称开头字符不能是数字

7.6.2.3 var=”lang is $LANG” echo $var 可得lang is en_US

7.6.2.4 var=’lang is $LANG’ echo $var可得 lang is $LANG

7.6.2.5 可使用\将特殊符号变成一般字符

7.6.2.6 取消变量的方法为使用unset

7.6.2.7 若变量需要在其他子程序执行,则需以export来使变量变成环境变量

7.6.2.8 当需要其他指令执行的信息时,使用指令 或$(指令)

  • 7.6.2.8.1 例 cd /lib/modules/uname -r/kernel
  • 7.6.2.8.2 cd /lib/modules/$(uname –r)/kernel

7.6.2.9 例:列出相关档名的权限 ls –l locate crontab

7.7 环境变量的功能

7.7.1 查看默认的环境变量,可以利用env(environment)和export两个指令查阅

7.7.2 用set观察所有变量(含环境变量与自定义变量)

7.7.3 查看自己个人账号的pid使用:echo $$

7.7.4 echo $?关于上个执行指令的回传值

7.7.5 export:让父程序的变量值继续在子程序中使用,如果没有接变量,会把所有的环境变量显示出来.被export后的变量,可称为“环境变量”

7.7.6 declare:将环境变量转成自定义变量

7.7.7 在linux当中,通常仅设定LANG这个变量,因为它是最主要的设定变量

7.7.8 整体系统默认的语系定义在/etc/sysconfig/i18n

7.8 变量键盘读取、数组与宣告:read,array,declare

7.8.1 read:读取来自键盘输入的变量

7.8.1.1 read [-pt] 变量

7.8.2 declare / typeset

7.8.2.1 宣告变量的类型

7.8.2.2 declare [-aixr] 变量

7.8.2.3 declare +x sum 将-变成+,可以进行“取消”动作

7.9 bash对变量有几个基本定义:

7.9.1 变量类型默认为“字符串”

7.9.2 数值计算,仅能达到整数形态,如1/3结果是0

7.10 数组(array)变量类型:通过${数组}读取

7.11 ulimit:限制用户的某些资源

7.11.1 ulimit [-SHacdfltu] [配额] 显示信息中,0代表没有限制

7.12 变量内容的删除与取代

7.12.1 ${variable#/(开始符号)*符号(结束符号)}

变量设定方式 说明
${变量#关键词} ${变量##关键词} 若变量内容从头开始的数据符合『关键词』,则将符合的最短数据删除。若变量内容从头开始的数据符合『关键词』,则将符合的最长数据删除
${变量%关键词} ${变量%%关键词} 若变量内容从尾向前的数据符合【关键词】,则将符合的最短数据删除;若变量内容从尾向前的数据符合【关键词】,则将符合的最长数据删除
${变量/旧字符串/新字符串} ${变量//旧字符串/新字符串} 若变量内容符合【旧字符串】则【第一个旧字符串被新字符串取代】;若变量内容符合【旧字符串】则【全部的旧字符串会被新字符串取代】

7.12.2 new_var = ${old_var-content}

  • 如果old_var未设定内容,则content内容赋予new_var。
  • 如果old_var设定了内容,则new_var=old_var

7.12.3 new_var = ${old_var:-content}

加上:后若变量内容为空或是未设定,都能够以后面的内容替换

7.13 history

7.13.1 !number 执行第几笔指令的意思

7.13.2 !command 由最近的指令向前搜索的那个指令,并执行

7.13.3 !!执行上一个指令

7.14 bash进站与欢迎讯息:/etc/issue,/etc/motd(所有的使用者登录时都会显示)

7.15 bash的环境配置文件

7.15.1 login:

  • 7.15.1.1 取得bash时需要完整的登录流程
  • 7.15.1.2 只会读取这两个配置文件
    • 7.15.1.2.1 /etc/profile:系统整体设定文件
      • 7.15.1.2.1.1 PATH环境变量设置在此文件中设置,建议更改~/.bashrc
    • 7.15.1.2.2 ~/.bash_profile或~/.bash_login或~/.profile 属于使用者个人设定,只会读取三个档案中的一个,按顺序。
  • 7.15.1.3 source:读入环境配置文件的指令

7.15.2 non-login shell:

  • 7.15.2.1 取得bash接口的方法不需要重复登入的举动,一般以图形化登入时
  • 7.15.2.2 仅会读取~/.bashrc
  • 7.15.2.3 如果~/.bashrc不小心删除了,可以从/etc/skel/.bashrc复制过来

7.16 终端机的环境设定:stty,set

  • 7.16.1 stty:设定终端机的输入按键代表的意义
  • 7.16.2 按键功能的设定在/etc/inputrc

7.17 数据流重导向

  • 7.17.1 标准输入stdin:代码0 使用< 或<<
  • 7.17.2 标准输出stdout:代码1 使用>或>>
  • 7.17.3 标准错误输出(stderr): 代码为2,使用2> 或2>>
  • 7.17.4 /dev/null可以吃掉任何导向这个装置的信息

例:2/dev/null

  • 7.17.5 将指令的数据全部写入名为list的档案中

例:find /home –name .bashrc list 2&1
或 find /home –name .bashrc &list

  • 7.17.6 >> 代表的是【结束的输入字符】的意思

例cat catfile << “eof”

7.18 关机的时候可以先执行两次sync同步化写入磁盘后才shutdown计算机

sync;sync;shutdown –h now

7.19 选取命令:cut,grep

7.19.1 cut 可以将某段讯息的某一段给切出来(同一行里面的数据进行分解)

语法:cut –d ‘分隔字符’ –f fields 用于有特定分隔字符的

7.20 last : 显示登入者的信息

7.21 sort:排序

7.22 uniq:将重复的资料仅列出一个显示

7.23 wc:统计档案里的字数和行数

7.24 tee:双向重导向 -a以累加的方式,将数据加入到file中

7.25 字符转换命令:tr,col,join,paste,expand

  • 7.25.1 tr 用来删除一段讯息当中的文字
  • 7.25.2 join 处理两个档案之间的数据,两个档案中,有相同数据的哪一行,才将他加在一起的意思
  • 7.25.3 paste:直接将两行贴在一起,且中间以tab键隔开
  • 7.25.4 expand:将tab按键转换成空格键

7.26 分割命令:将一个大档案依据档案大小或行数来分割

  • 语法:split [-bl] file PREFIX
  • 例:split –b 300k /etc/termcap test
  • 将上面分割的几个小档案合成一个档案,档名为termcapback
  • cat test* >> termcapback

7.27 finger

finger: 为系统管理员提供知道某个时候到底有多少用户在使用这台Linux主机的方法, 通常会显示系统中某个用户的用户名、主目录、停滞时间、登录时间、登录shell等信息。

7.28 减号-的用途:

tar –cvf - /home | tar –xvf –

解释:将/home里面的档案打包,但打包的数据不是记录到档案,而是传送到stdout,经管线后,将tar –cvf - /home 传送给后面的tar –xvf -,后面的-则是取用前一个指令的stdout

8 正规表示法和文件格式化处理

8.1 正规表示法和通配符

  • 8.1.1 正规表示法是一种字符串处理的表示方式
  • 8.1.2 通配符是bash操作接口的一个功能

8.2 dmesg – 可列出核心产生的讯息

8.3 grep

grep [-A] [-B] [--color=auto] '搜寻字符串' filename 

选项不参数:
-A :后面可加数字,为 after 的意思,除了列出该行外,后续癿 n 行也列出来;
-B :后面可加数字,为 befer 的意思,除了列出该行外,前面癿 n 行也列出来;
–color=auto 可将正确癿那个撷叏数据列出颜色

当有共通的‘t?st’存在时,使用下面的命令

grep -n 't[ae]st' regular_express.txt

反向选择:

例:grep -vn 'the' regular_express.txt

不区分大小写:

grep -in 'the' regular_express.txt

某字符前不要有小写字符

grep -n '[^a-z]oo' regular_express.txt    

定位行首

例:grep -n '^[^[:alpha:]]' 文件名

找出行尾结束为小数点(.)的那一行

例:grep -n '\.$' 文件名

去掉空白行与开头为#的那一行是批注

例:grep -v '^$' /etc/syslog.conf | grep -v '^#'

8.4 特殊符号代表意义

特殊符号 代表意义
[:alnum:] 代表英文大小写字符及数字,即0-9,A-Z,a-z
[:alpha:] 代表任何英文大小写字符,即A-Z,a-z
[:blank:] 代表空格键与【Tab】按键两者
[:cntrl:] 代表键盘上面的控制按键,即包括CR,LF,Tab,Del。。。等等
[:digit:] 代表数字而已,即0-9
[:graph:] 除了空格符(空格键与【Tab】按键)外的其他所有按键
[:lower:] 代表小写字符,即a-z
[:print:] 代表任何可以被打印出来的字符
[:upper:] 代表大写字符,即A-Z
[:space:] 任何会产生空白的字符,包括空格键,[Tab],CR等等
[:xdigit:] 代表16进位的数字类型

小数点.与重复字符* 和 限定连续字符范围{}

  1. .(小数点):代表【一定有一个任意字符】的意思;
  2. *(星号):代表【重复前一个0到无穷多次】的意思,为组合形态。
  3. {}:限定字符个数,因为{}符号在shell中有特殊意义,因此需要使用字符\来让它失去意义
例:至少两个o以上的字符串时:
grep -n 'ooo*' regular_express.txt
例:查找g....g:
grepp -n 'g.*g' regular_express.txt
例:找出【任意数字】的行列
grep -n '[0-9][0-9]*' regular_express.txt
例:找到两个o的字符串
grep -n 'o\{2\}' regular_express.txt
例:找出g后面接2~5个o
grep -n 'go\{2,5\}g' regular_express.txt
例:找出g后面接2个以上o
grep -n 'go\{2,\}g' regular_express.txt
  • du -s /home:查看home目录下的大小,单位k
  • du -sh /home:单位M
  • dmesg 列出核心信息

‘^’符号

  • 在【】内代表‘反向选择’
  • 在【】之外则代表定位在行首的意义

总结

字符 意义与范例
^word 待搜寻的字符串在行首
word$ 待搜寻的字符串在行尾
. 代表【一定有一个任意字符】的字符
\ 跳脱字符,将特殊字符的特殊意义去掉
* 重复0个到无穷多个的前一个字符
[list] 列出想要搜寻的字符,[]当中代表一个搜寻字符
[n1-n2] 列出想要搜寻的字符范围
[^list] 列出不要的字符串或范围
{n,m} 连续n到m个的【前一个字符】
例:以 ls -l配合grep找出/etc/底下文件类型为链接文件属性的文件名
ls -l /etc | grep '^l'

特别声明
正规表示法的特殊字符与一般在指令列输入指令的通配符并不相同

sed工具

用途

sed [-nefr] [动作]

动作说明:[n1[,n2]]function

function:a(新增);c(取代);d(删除);i(插入);p(打印);s(取代)

  • 如果增加两行,需要在每一行之间添加反斜杠\
  • 整行取代,例:nl 文件名 | sed ‘2,5c No2-5number’
  • 列出第11~20行
    • head -n 20 文件名| tail -n 10
    • nl 文件名 | sed -n ‘11,20p’
  • 参数n代表安静模式,如果不使用安静模式,那么输出的结果将会重复显示
  • sed如果后面要接超过两个以上的动作时,每个动作前加
  • 才可以。

部分数据的搜索并取代的功能

sed ‘s/要被取代的字符串/新的字符串/g’

示例1如下图所示:

直接修改档案,例(在文件最后一行加入‘#This is a test’):

sed -i '$a #This is a test' 文件名
$代表的是最后一行,a的动作是新增

什么情况下会使用sed直接修改档案内容的这个功能
比如在一个档案包含100万行,而需要在100行添加某些文字,那么vim不是很好的选择,这是可以使用sed的修改/取代的功能

延伸型的正规表示法

egrep -v '^$|^#' regular_express.txt  ==== grep -v '^$' regular_express.txt | grep -v '^#'

RE字符 | 意义与范例

+    |重复一个或一个以上的前一个RE字符,例:egrep -n 'go+d' 文件名

? |零个或一个的前一个RE字符,例:egrep -n ‘go?d’ 文件名
| |用或(or)的方式找出数个字符串,例:egrep -n ‘gd|good’ 文件名
() |找出【群组】字符串,例:egrep -n ‘g(la|oo)d’ 文件名
()+ |多个重复群组的判别

文件格式化与相关处理

printf格式化打印

printf ‘打印格式’ 实际内容

awk好用的数据处理工具

awk运作模式
awk ‘条件类型1{动作1} 条件类型2{动作2}…’ filename

例(取出账号与登入者的IP,且账号与IP之间以【tab】隔开):

last -n 5 |awk '{print $1 "\t" $3}'
其中$1~$5 代表第一栏至第五栏,而$0代表所有列的资料
  • awk是以行为一次处理的单位,以字段为最小的处理单位
  • awk如果想知道数据有几行或者几栏,需要awk的内建变量帮忙
变量名称 代表意义
NF 每一行($0)拥有的字段总数
NR 目前awk所处理的是【第几行】数据
FS 目前的分割字符,默认是空格键

备注 awk后续所有动作是以单引号‘’括住的,单引号中如果需要用引号,则必须使用双引号来定义。

实例如下图所示

例(以passwd文件为基础,查阅第三栏小于10以下的数据,并且仅列出账号与第三栏)

cat /etc/passwd | awk '{FS=":"} $3 < 10 {print $1 "\t" $3}'

备注 当读入第一行时,变数$1,$2…默认还是以空格键为分割,即使定义了FS=“:”,但却仅能在第二行后才生效

解决办法:预先设定awk的变量,使用BEGIN关键词

awk 'BEGIN {FS=":"} $3 < 10 {print $1 "\t" $3}' 

几点重要说明

  1. awk指令间隔:当需要多个指令辅助时,可利用‘;’间隔,或者直接用Enter按键来隔开每个指令
  2. 逻辑运算中,如果是等于,一定要使用两个等号‘==’
  3. 格式化输出时,在printf的格式设定中,务必加上\n,才能进行分行
  4. 在awk中,变量可以直接使用,不需要加上$符号。
  5. awk动作内{}也是支持if条件的。

档案比对工具

使用场景

通常是同一个软件包的不同版本之间,比较配置文件与原始档的差异;

通常是用在ASCII纯文本档的比对上

diff

语法:diff [-bBi] fromfile tofile

比对两个档案之间的差异,以行为单位来比对,通常用在同一档案的新旧版本差异上。

还可以比对整个目录下的差异,比对不同目录下的相同文件名的内容。

cmp

用途没有diff广泛
主要利用“字节”单位去比对

语法:cmp [-s] file1 file2
参数-s:将所有的不同点的字节处都列出来,因为cmp预设仅会输出第一个发现的不同点

patch

用来升级,将旧的档案升级成为新的档案

操作方法如下:

- 制作补丁档案:diff -Naur passwd.old passwd.new > passwd.patch
- 更新旧档案,使其变成和新档案一样的内容:patch -pN < patch_file;N为0代表当前目录下
- 如果更新错误,还可以还原成旧档案:patch -R -pN < patch_file

pr档案打印准备

使用pr可以设定时间、页码、标题等等属性。

9 学习 Shell Scripts

9.1 什么是Shell Script

定义

shell 是一个文字接口底下与系统沟通的一个工具接口

shell script是利用shell功能缩写的一个程序,这个程序是使用纯文本文件,将一些shell的语法与指令写在里面,搭配正规表示法、管线命令与数据流重导向等功能,以达到我们想要的处理目的。

无需编译即可执行,且拥有不错的debug工具。

学习shell scripts的理由:

  • 自动化管理的重要依据
  • 追踪与管理系统的重要工作
  • 简单入侵检测功能
  • 连续指令单一化
  • 简易的数据处理
  • 简易的数据处理
  • 跨平台支持与学习历程较短

shell script处理数据速度慢的原因

用的是外部的指令与bash shell的一些默认工具,常去呼叫外部的函式库,在处理大量数据运算上,不够好。

shell script撰写需要注意的事项

1. 指令的执行从上而下,从左到右分析与执行;
2. 指令、选项与参数间的多个空白都会被忽略掉;
3. 空白行也将被忽略掉,并且tab同样视为空格键;
4. 如果读取到一个Enter符号(CR),就尝试开始执行该行(或该串)命令;
5. 如果一行内容太多,则可使用\Enter来延伸至下一行;
6. #可作为批注

执行档案的几个方法

1.直接指令下达(需具备可读与可执行的权限(rx)):
    - 绝对路径:例如 使用/home/dmtsai/shell.sh
    - 相对路径:使用./shell.sh来执行
    - 变量【PATH】功能:将shell.sh放在PATH指定目录内,例如:~/bin/

2. 以bash程序来执行:透过【bash shell.sh】或[sh shell.sh]来执行
3. 还可以利用sh的参数,如-n及-x来检查与追踪shell.sh的语法是否正确

程序大致内容

1. 第一行#!/bin/bash表明这个script使用的shell名称
2. 程序内容的说明:
    - 除第一行之外,其他的#都是批注,描述整个程序的基本功能
    - 说明该script一般包含以下内容:
        - 内容与功能
        - 版本信息
        - 作者与联络方式
        - 建档日期
        - 历史记录


3. 主要环境变量的宣告:PATH与LANG最重要,方便直接下达外部指令,不必写绝对路径
4. 主要程序部分
5. 执行结果告知:使用exit指令

备注使用撰写script的工具最好使用vim而不是vi,因为vim有额外的语法检验机制,能够在第一阶段撰写时就发现语法方面的问题

9.2 简单的shell script练习

9.3 善用判断式

9.4 条件判断式

9.5 循环loop

9.6 shell script的追踪与debug

重点回顾

Link.