6 实用指令与高级功能
本章介绍将会介绍一些不经常使用,但是非常实用的功能与指令,它们属于比较复杂的操作,用熟练了可以方便实现很多功能。
一、管道
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