本章介绍将会介绍一些不经常使用,但是非常实用的功能与指令,它们属于比较复杂的操作,用熟练了可以方便实现很多功能。

一、管道

Linux的指令有个特殊的功能叫做管道,即执行一段很长的指令,将前半段指令的输出直接输入后半段指令,从而实现数据的一步到位的处理,或者实现更加复杂的功能。

Linux的管道十分复杂和深奥,这里举例几个具体的功能,是比较常用的。

1、从结果中筛选 grep

当需要从很长的一段文本中寻找关键词时,人工是效率最低的方法。我们可以实用管道连接grep指令,快速筛选出包含目标的行。基本用法如下:

  command A | grep "关键词"
  

下面有一些例子:

  # 日志文件中找到与"input" 有关的内容
cat  abc.log  |  grep "input"

# 找到/dev中所有的ttyS串口
ls  -l  /dev  |  grep "ttyS"

# 从日志中找到不包含Linux的行(tail是查看文件最后几行的指令)
tail  -n  50  abc.log  |  grep  -v  "Linux"
  

grep支持多个参数,比如grep -i "abc"表示忽略大小写,既能找到abc也能找到aBc。grep -v "abc"表示排除这个关键词。

“|“还有更多的管道用法,就不多做介绍了。

2、信息流输入文件 >

我们可以将指令的输出直接保存到某个文件中,实用”>” 或 “»"。(»是两个>,而不是》)

  # 将字符串123 输入到文件number.txt中
echo  "123"  >  number.txt
# txt文件内容:123

# 将字符串456  追加 输入到文件number.txt中
echo  "456"  >>  number.txt
# txt文件内容:
# 123
# 456

# 再次使用 > 输入 789
echo  "789"  >  number.txt
# txt文件内容:789
  

通过上面的例子,可以说明,’>‘进行输入时,会先清空文件,然后输入新内容。’»‘则是在文件的末尾追加输入内容。

一个特殊的用法,如果执行指令不想看到结果,尤其在写脚本的时候,可以使用>符号。

  COMMAND > /dev/null
  

3、特殊的&符号

在指令后面添加&符号,表示将指令转入后台运行。如果是添加在多条指令之间,则将这些指令同时转入后台运行。

  CMD1  &  CMD2  &  CMD3
# 三条CMD都会同时执行
  

如果多条指令之间是”&&" 两个符号,则表示前面一条运行成功了才会执行下一条。

  mkdir  name  &&  cd  name
  

如果mkdir失败了,cd就不会执行。

二、与硬件有关的操作

1、查看USB信息 lsusb

lsusb是用于查看USB信息的指令,其结果包含USB的硬件路径和编号、设备的识别号(VID:PID)、设备名称。

lsusb -t 可以以列表树的形式展示usb设备的信息,层级关系比较清晰,但是不展示设备识别号和名称。

  ksd@kMS:~$ lsusb
Bus 002 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
Bus 001 Device 003: ID 05e3:0610 Genesys Logic, Inc. Hub
Bus 001 Device 002: ID 24ae:1100 Shenzhen Rapoo Technology Co., Ltd. Rapoo 2.4G Wireless Device
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
# BUS Device是设备的路径, ID是设备的硬件识别号, 最后是设备名称

ksd@kMS:~$ lsusb -t
/:  Bus 02.Port 1: Dev 1, Class=root_hub, Driver=xhci_hcd/4p, 5000M
/:  Bus 01.Port 1: Dev 1, Class=root_hub, Driver=xhci_hcd/10p, 480M
    |__ Port 4: Dev 2, If 1, Class=Human Interface Device, Driver=usbhid, 12M
    |__ Port 4: Dev 2, If 0, Class=Human Interface Device, Driver=usbhid, 12M
    |__ Port 6: Dev 3, If 0, Class=Hub, Driver=hub/4p, 480M
# BUS是USB 根总线,Port则对应到具体端口。Dev与lsusb的Device的数字一致。
  

2、列出PCIE总线上的外设

lspci可以列出PCIE总线上的所有外设,包含外设的逻辑路径与名称。

lspci -vvv -s 01:00.0 可以查看具体外设的详细信息,其中01:00.0需要替换成lspci显示的逻辑路径。

3、列出硬盘信息

lsblk 可以展示所有分区信息。

  ksd@kMS:~$ lsblk
NAME   MAJ:MIN RM   SIZE RO TYPE MOUNTPOINTS
sda      8:0    0 476.9G  0 disk
├─sda1   8:1    0   190M  0 part /boot/efi
├─sda2   8:2    0 114.4G  0 part /
├─sda3   8:3    0 114.4G  0 part /home
└─sda4   8:4    0  19.1G  0 part [SWAP]
  

上面的结果中,sda是硬盘的名称。在Linux中,SATA接口的硬盘叫做sda、sdb(最后一位字母类推),NVME接口的硬盘是nvme0n1(最后一位数字递增)

硬盘分区的名称则是在硬盘名的基础上添加,sata直接添加数字成为sda1、sda2,nvme接口的变成nvme0n1p1、nvme0n1p2。

SIZE列是分区的大小,Type列表示该行是硬盘(disk)还是分区(part)。最后一列 MOUNTPOINTS 是这个分区的挂载点位,下面的挂载和卸载操作将会解读这个含义。

4、挂载和卸载硬盘分区

Linux分区的挂载与Windows不同,盘符只有根目录一个,分区则可以挂载到根目录下的任意文件夹。挂载点就是分区挂载的实际路径,可以通过这个路径访问分区中的文件。

当需要手动更改分区的挂载点时,可以用下面的指令。

  sudo  mount  /dev/sda1  /path
sudo  umount  /dev/sda1 
  

其中,‘sda1’需要替换成实际操作的分区,名称要和lsblk展示出来的一致。umount指令不是"unmount",请注意拼写。

5、驱动的加载和卸载

Linux中硬件的驱动程序被封装成一个ko文件,可以通过下面的方式进行手动加载。

  # 列出驱动程序liebiao
lsmod

# 加载驱动文件
sudo  insmod  xxx.ko

# 卸载驱动(不要.ko后缀)
sudo  rmmod  xxx
  

三、文件操作

1、文件查看

cat指令会显示文件的所有内容,如果文件很大,可能会填满终端,不方便查找。可以用下面的指令,只显示文件的开头几行或者最后几行。

  # 显示前10行
head  -n  10  xxx.txt

# 显示最后10行
tail  -n  10  xxx.txt