前言
主要命令以及常见的复杂命令
参考:http://c.biancheng.net/linux_tutorial/
常用知识
|:管道,前面的输出作为后面的输入
&&:如果这个命令执行成功&&那么执行这个命令
||:如果这个命令执行失败了||那么就执行这个命令
例子:
ls dir &>/dev/null && echo "success" || echo "fail"
查看文件的各种属性:
ls -l、lsattr、file、stat、wc
内存、磁盘占用:free、\time、ls -l 、du、wc
进程:ps、kill
文件管理
ls、cp、mkdir、mv、pwd、ln
改变文件属性、组、权限、所有者:
chattr、chgrp、chmod、chown
chattr的属性:
a:让文件或目录仅供附加用途。
b:不更新文件或目录的最后存取时间。
c:将文件或目录压缩后存放。
d:将文件或目录排除在倾倒操作之外。
i:不得任意更动文件或目录。
s:保密性删除文件或目录。
S:即时更新文件或目录。
u:预防意外删除。
参数:
-R 递归处理,将指定目录下的所有文件及子目录一并处理。
-v<版本编号> 设置文件或目录版本。
-V 显示指令执行过程。
+<属性> 开启文件或目录的该项属性。
-<属性> 关闭文件或目录的该项属性。
=<属性> 指定文件或目录的该项属性。
lsattr 显示文件属性
比较文件/文件夹的不同:
cmp只能比较文件的不同、diff、diffstat
diff:
-<行数> 指定要显示多少行的文本。此参数必须与-c或-u参数一并使用。
-a或--text diff预设只会逐行比较文本文件。
-b或--ignore-space-change 不检查空格字符的不同。
-B或--ignore-blank-lines 不检查空白行。
-c 显示全部内文,并标出不同之处。
-C<行数>或--context<行数> 与执行"-c-<行数>"指令相同。
-d或--minimal 使用不同的演算法,以较小的单位来做比较。
-D<巨集名称>或ifdef<巨集名称> 此参数的输出格式可用于前置处理器巨集。
-e或--ed 此参数的输出格式可用于ed的script文件。
-f或-forward-ed 输出的格式类似ed的script文件,但按照原来文件的顺序来显示不同处。
-H或--speed-large-files 比较大文件时,可加快速度。
-I<字符或字符串>或--ignore-matching-lines<字符或字符串> 若两个文件在某几行有所不同,而这几行同时都包含了选项中指定的字符或字符串,则不显示这两个文件的差异。
-i或--ignore-case 不检查大小写的不同。
-l或--paginate 将结果交由pr程序来分页。
-n或--rcs 将比较结果以RCS的格式来显示。
-N或--new-file 在比较目录时,若文件A仅出现在某个目录中,预设会显示:
Only in目录:文件A若使用-N参数,则diff会将文件A与一个空白的文件比较。
-p 若比较的文件为C语言的程序码文件时,显示差异所在的函数名称。
-P或--unidirectional-new-file 与-N类似,但只有当第二个目录包含了一个第一个目录所没有的文件时,才会将这个文件与空白的文件做比较。
-q或--brief 仅显示有无差异,不显示详细的信息。
-r或--recursive 比较子目录中的文件。
-s或--report-identical-files 若没有发现任何差异,仍然显示信息。
-S<文件>或--starting-file<文件> 在比较目录时,从指定的文件开始比较。
-t或--expand-tabs 在输出时,将tab字符展开。
-T或--initial-tab 在每行前面加上tab字符以便对齐。
-u,-U<列数>或--unified=<列数> 以合并的方式来显示文件内容的不同。
-v或--version 显示版本信息。
-w或--ignore-all-space 忽略全部的空格字符。
-W<宽度>或--width<宽度> 在使用-y参数时,指定栏宽。
-x<文件名或目录>或--exclude<文件名或目录> 不比较选项中所指定的文件或目录。
-X<文件>或--exclude-from<文件> 您可以将文件或目录类型存成文本文件,然后在=<文件>中指定此文本文件。
-y或--side-by-side 以并列的方式显示文件的异同之处。
--help 显示帮助。
--left-column 在使用-y参数时,若两个文件某一行内容相同,则仅在左侧的栏位显示该行内容。
--suppress-common-lines 在使用-y参数时,仅显示不同之处。
例子:
diff -c -20 a.c b.c //打印的行数为20
diff log2014.log log2013.log -y -W 50 //按照
diffstat 联合diff使用
看文件信息:file
浏览文件:less
例子:
ps -ef | less
history |less
-b <缓冲区大小> 设置缓冲区的大小
-e 当文件显示结束后,自动离开
-f 强迫打开特殊文件,例如外围设备代号、目录和二进制文件
-g 只标志最后搜索的关键词
-i 忽略搜索时的大小写
-m 显示类似more命令的百分比
-N 显示每行的行号
-o <文件名> 将less 输出的内容在指定文件中保存起来
-Q 不使用警告音
-s 显示连续空行为一行
-S 行过长时间将超出部分舍弃
-x <数字> 将"tab"键显示为规定的数字空格
/字符串:向下搜索"字符串"的功能
?字符串:向上搜索"字符串"的功能
n:重复前一个搜索(与 / 或 ? 有关)
N:反向重复前一个搜索(与 / 或 ? 有关)
b 向上翻一页
d 向后翻半页
h 显示帮助界面
Q 退出less 命令
u 向前滚动半页
y 向前滚动一行
空格键 滚动一页
回车键 滚动一行
[pagedown]: 向下翻动一页
[pageup]: 向上翻动一页
分割文件:split
//将文件king_of_ring.avi分成400mb和剩余大小的两个文件,
split -b 400m -d king_of_ring.avi king_of_ring_part_ //-b:指定大小 -d指定后缀为数字 king_of_ring_part_指定前缀
//对于文本文件可以按照行数拆分:
split -d -10 /etc/passwd my_passwd_
//合并文件
cat xaa xab > king_of_ring_merge.avi
//合并后的校验:
md5sum king_of_ring.avi
md5sum king_of_ring_merge.avi
//比较其MD5的值,一模一样表示合并成功
查找:find、locate、whereis、which、grep
grep的用法:
查找文件空行和非空行
grep -c ^$ file_1
grep -c ^[^$] file_1
grep -Rw stretch /etc/* 只要成单词的,不要在单词中有其他内容
grep -R stretch /etc/* 单词中有此成分即可
grep -s stretch /etc/* 只扫描etc目录
grep –i stretch /etc/* 大小写不敏感
grep -n stretch /etc/* 显示行号
find的用法:
find –name filename
whereis“命令可以搜索linux系统中的所有可执行文件即二进制文件。
whereis test
which命令查看系统命令是否存在
which ls
locate:
locate passwd
文档编辑
cat
将软盘设备制作成镜像文件:
cat /dev/fd0 > fdisk.iso
持续写入内容,碰到EOF结束并保存(没有文件时新建文件,有文件时会将原本内容擦除):
cat > filename.txt <<EOF
cat一个文件的内容到另一个文件:
cat file > test 覆盖原文件
cat file >> test 在末尾添加
echo
使用反引号符执行命令,并输出其结果到终端:
echo `date`
输出变量提取后的值:
echo $PATH
sed:替换、删除、更新文件中的内容
sed每次处理一行的内容
sed 可依照脚本的指令来处理、编辑文本文件。
Sed 主要用来自动编辑一个或多个文件、简化对文件的反复操作、编写转换程序等。
参数说明
-e<script>或–expression=<script> 以选项中指定的script来处理输入的文本文件。
-f<script文件>或–file=<script文件> 以选项中指定的script文件来处理输入的文本文件。
-n或–quiet或–silent 仅显示script处理后的结果。
动作说明
a :新增, a 的后面可以接字串,而这些字串会在新的一行出现(目前的下一行)~
c :取代, c 的后面可以接字串,这些字串可以取代 n1,n2 之间的行!
d :删除,因为是删除啊,所以 d 后面通常不接任何东东;
i :插入, i 的后面可以接字串,而这些字串会在新的一行出现(目前的上一行);
p :打印,亦即将某个选择的数据印出。通常 p 会与参数 sed -n 一起运行~
s :取代,可以直接进行取代的工作哩!通常这个 s 的动作可以搭配正规表示法!例如 1,20s/old/new/g 就是啦!
tr
转换文件中的字符(参数不常用,字符集合常用)
参数说明:
-c, --complement:反选设定字符。也就是符合 SET1 的部份不做处理,不符合的剩余部份才进行转换
-d, --delete:删除指令字符
-s, --squeeze-repeats:缩减连续重复的字符成指定的单个字符
-t, --truncate-set1:削减 SET1 指定范围,使之与 SET2 设定长度相等
字符集合的范围:
\NNN 八进制值的字符 NNN (1 to 3 为八进制值的字符)
\\ 反斜杠
\a Ctrl-G 铃声
\b Ctrl-H 退格符
\f Ctrl-L 走行换页
\n Ctrl-J 新行
\r Ctrl-M 回车
\t Ctrl-I tab键
\v Ctrl-X 水平制表符
CHAR1-CHAR2 :字符范围从 CHAR1 到 CHAR2 的指定,范围的指定以 ASCII 码的次序为基础,只能由小到大,不能由大到小。
[CHAR*] :这是 SET2 专用的设定,功能是重复指定的字符到与 SET1 相同长度为止
[CHAR*REPEAT] :这也是 SET2 专用的设定,功能是重复指定的字符到设定的 REPEAT 次数为止(REPEAT 的数字采 8 进位制计算,以 0 为开始)
[:alnum:] :所有字母字符与数字
[:alpha:] :所有字母字符
[:blank:] :所有水平空格
[:cntrl:] :所有控制字符
[:digit:] :所有数字
[:graph:] :所有可打印的字符(不包含空格符)
[:lower:] :所有小写字母
[:print:] :所有可打印的字符(包含空格符)
[:punct:] :所有标点字符
[:space:] :所有水平与垂直空格符
[:upper:] :所有大写字母
[:xdigit:] :所有 16 进位制的数字
[=CHAR=] :所有符合指定的字符(等号里的 CHAR,代表你可自订的字符)
tr [:lower:] [:upper:]
和tr a-z A-Z一样
sort
对文件内容以一定的规律加以排序
参数:
-b 忽略每行前面开始出的空格字符。
-c 检查文件是否已经按照顺序排序。
-d 排序时,处理英文字母、数字及空格字符外,忽略其他的字符。
-f 排序时,将小写字母视为大写字母。
-i 排序时,除了040至176之间的ASCII字符外,忽略其他的字符。
-m 将几个排序好的文件进行合并。
-M 将前面3个字母依照月份的缩写进行排序。
-n 依照数值的大小排序。
-u 意味着是唯一的(unique),输出的结果是去完重了的。
-o<输出文件> 将排序后的结果存入指定的文件。
-r 以相反的顺序来排序。
-t<分隔字符> 指定排序时所用的栏位分隔字符。
+<起始栏位>-<结束栏位> 以指定的栏位来排序,范围由起始栏位到结束栏位的前一栏位。
[-k field1[,field2]] 按指定的列进行排序。
uniq
删除文件中重复出现的行
统计文件中重复出现行的数量:sort testfile1 | uniq -c
wc
统计文件字数
计算文件的Byte数、字数、或是列数,若不指定文件名称、或是所给予的文件名为"-",则wc指令会从标准输入设备读取数据。
文件传输
rcp
scp
磁盘管理
badblocks
-b<区块大小> 指定磁盘的区块大小,单位为字节。
-o<输出文件> 将检查的结果写入指定的输出文件。
-s 在检查时显示进度。
-v 执行时显示详细的信息。
-w 在检查时,执行写入测试。
[磁盘装置] 指定要检查的磁盘装置。
[磁盘区块数] 指定磁盘装置的区块总数。
[启始区块] 指定要从哪个区块开始检查。
例子:badblocks -s -v /dev/sda1 -o sda1_badblock.txt
cfdisk
磁盘分区,和fdisk类似
fdisk
fdisk -l查看磁盘分区
fdisk /dev/sdb给磁盘分区
lsblk:很清晰,查看磁盘分区
df
df -h 显示已挂载的分区列表
df -i:-i选项的df命令的输出显示inode信息而非块使用量。
du
du -h
mount
mount [-t 系统类型] [-L 卷标名] [-o 特殊选项] [-n] 设备文件名 挂载点
各选项的含义分别是:
-t 系统类型:指定欲挂载的文件系统类型。Linux 常见的支持类型有 EXT2、EXT3、EXT4、iso9660(光盘格式)、vfat、reiserfs 等。如果不指定具体类型,挂载时 Linux 会自动检测。
-L 卷标名:除了使用设备文件名(例如 /dev/hdc6)之外,还可以利用文件系统的卷标名称进行挂载。
-n:在默认情况下,系统会将实际挂载的情况实时写入 /etc/mtab 文件中,但在某些场景下(例如单人维护模式),为了避免出现问题,会刻意不写入,此时就需要使用这个选项;
-o 特殊选项:可以指定挂载的额外选项,比如读写权限、同步/异步等,如果不指定,则使用默认值(defaults)。具体的特殊选项参见表 1;
表 1 mount 命令选项及功能
选项 | 功能 |
---|---|
rw/ro | 是否对挂载的文件系统拥有读写权限,rw 为默认值,表示拥有读写权限;ro 表示只读权限。 |
async/sync | 此文件系统是否使用同步写入(sync)或异步(async)的内存机制,默认为异步 async。 |
dev/nodev | 是否允许从该文件系统的 block 文件中提取数据,为了保证数据安装,默认是 nodev。 |
auto/noauto | 是否允许此文件系统被以 mount -a 的方式进行自动挂载,默认是 auto。 |
suid/nosuid | 设定文件系统是否拥有 SetUID 和 SetGID 权限,默认是拥有。 |
exec/noexec | 设定在文件系统中是否允许执行可执行文件,默认是允许。 |
user/nouser | 设定此文件系统是否允许让普通用户使用 mount 执行实现挂载,默认是不允许(nouser),仅有 root 可以。 |
defaults | 定义默认值,相当于 rw、suid、dev、exec、auto、nouser、async 这 7 个选项。 |
atime | 每次存取都更新inode的存取时间,默认设置,取消选项为noatime。 |
nodiratime | 每次存取时不更新所在目录的atime |
-t<文件系统类型> 指定设备的文件系统类型。常用的选项说明有:
选项 | 功能 |
---|---|
minix | Linux最早使用的文件系统。 |
ext2 | Linux目前的常用文件系统。 |
msdos | MS-DOS 的 FAT。 |
vfat | Win85/98 的 VFAT。 |
nfs | 网络文件系统。 |
iso9660 | CD-ROM光盘的标准文件系统。 |
ntfs | Windows NT的文件系统。 |
hpfs | OS/2文件系统。Windows NT 3.51之前版本的文件系统。 |
auto | 自动检测文件系统。 |
remount 重新挂载已挂载的文件系统,一般用于指定修改特殊权限。
umount
stat
用于显示inode等文件属性
stat a.c
File: 'a.c'
Size: 177 Blocks: 1 IO Block: 1024 regular file
Device: 30h/48d Inode: 20403 Links: 1
Access: (0777/-rwxrwxrwx) Uid: ( 0/ root) Gid: ( 0/ root)
Access: 2022-02-10 19:16:52.000000000 +0800
Modify: 2022-02-10 19:16:52.000000000 +0800
Change: 2022-02-10 19:16:52.000000000 +0800
Birth: -
stat、fstat、lstat类似
格式化文件系统
mkfs /dev/hdl
mkfs -t vfat 32 -F /dev/hdl 创建一个FAT32文件系统
系统管理
time
测量命令的执行时间或者系统资源的使用情况
time有两种,bash自带的,也可以用户自己安装,执行用户自己安装的需要\time:
[root@roclinux ~]# \time ls
bin dev lib media proc seLinux tmp
boot etc lib64 mnt root srv usr
cgroup home lost+found opt sbin sys var
0.00user 0.00system 0:00.00elapsed 0%CPU (0avgtext+0avgdata 956maxresident)k
0inputs+0outputs (0major+289minor)pagefaults 0swaps
-v打印出更详细的信息:
[root@roclinux /]# \time -v ls
bin dev lib media proc seLinux tmp
boot etc lib64 mnt root srv usr
cgroup home lost+found opt sbin sys var
Command being timed: "ls"
User time (seconds): 0.00
System time (seconds): 0.00
Percent of CPU this job got: 0%
Elapsed (wall clock) time (h:mm:ss or m:ss): 0:00.00
Average shared text size (kbytes): 0
Average unshared data size (kbytes): 0
Average stack size (kbytes): 0
Average total size (kbytes): 0
Maximum resident set size (kbytes): 956
Average resident set size (kbytes): 0
Major (requiring I/O) page faults: 0
Minor (reclaiming a frame) page faults: 292
Voluntary context switches: 1
Involuntary context switches: 1
Swaps: 0
File system inputs: 0
File system outputs: 0
Socket messages sent: 0
Socket messages received: 0
Signals delivered: 0
Page size (bytes): 4096
Exit status: 0
其显示的指标如下:
(1) 时间
指 标 | 含 义 |
---|---|
Elapsed (wall clock) time | 执行命令所花费的时间,格式是:[hour]:minute:second |
System time | 命令执行时在内核模式所花费的时间,单位是秒 |
User time | 命令执行时在使用者模式所花费的时间,单位是秒 |
Percent of CPU this job got | 命令执行时 CPU 的占用比例。其实这个数字就是内核模式的 CPU 时间加上使用者模式的 CPU 时间除以总时间 |
(2) 内存
指 标 | 含 义 |
---|---|
Maximum resident set size | 执行程序所占用内存的最大值。单位是 KB |
Average resident set size | 执行程序所占用内存的平均值,单位是 KB |
Average total size | 执行程序所占用的内存总量(stack+data+text)的平均大小, 单位是 KB |
Average unshared data size | 执行程序所占用的私有数据区(unshared data area)的平均 大小,单位是 KB |
Average stack size | 执行程序所占用的私有堆栈(unshared stack)的平均大小, 单位是 KB |
Average shared text size | 执行程序间共享内容(shared text)的平均值,单位是 KB |
Page size | 系统内存页的大小,单位是 byte。对于同一个系统来说,这 是个常数 |
(3) I/O
指 标 | 含 义 |
---|---|
Major (requiring I/O) page faults | 此程序的主要内存页错误发生的次数。所谓的主要内存页错误是指某一内存页己经詈换到 SWAP 分区中,又被其他程序使用过,该页的内容必须从 SWAP 分区里再读出来才能使用 |
Minor (reclaiming a frame) page faults | 此程序的次要内存页错误发生的次数。所谓的次要内存页错误是指某一内存页虽然己经詈换到 SWAP 中,但尚未被其他程序使用。此时该页的内容并未 被破坏,不必从 SWAP 分区里读出来即可直接使用 |
Swaps | 此程序被交换到 SWAP 分区的次数 |
Involuntary context switches | 此程序被强迫中断(如 CPU 时间耗尽)的次数 |
Voluntary context switches | 此程序自愿中断(I/O 执行完毕,磁碟读取完成等)的次数 |
File system inputs | 此程序所输入的文件数 |
File system outputs | 此程序所输出的文件数 |
Socket messages received | 此程序所收到的 Socket Message |
Socket messages sent | 此程序所送出的 Socket Message |
Signals delivered | 此程序所收到的信号数 |
Exit status | 命令退出状态 |
free
显示内存的使用情况,包括实体内存,虚拟的交换文件内存,共享内存区段,以及系统核心使用的缓冲区等。
参数:
-b 以Byte为单位显示内存使用情况。
-k 以KB为单位显示内存使用情况。
-m 以MB为单位显示内存使用情况。
-h 以合适的单位显示内存使用情况
-o 不显示缓冲区调节列。
-s<间隔秒数> 持续观察内存使用状况。
-t 显示内存总和列。
删除用户,新建用户,为用户设密码
sudo userdel myuer
sudo passwd user
sudo adduser user
按ctrl+d或输入exit退出当前用户
组
groupadd :用于创建一个新的工作组,新工作组的信息将被添加到系统文件中。
相关文件:
/etc/group 组账户信息。
/etc/gshadow 安全组账户信息。
/etc/login.defs Shadow密码套件配置。
用户
usermod、useradd、userdel、passwd、chmod
ps
显示进程的状态
显示php进程:ps -ef | grep php
-A 列出所有的进程
-w 显示加宽可以显示较多的资讯
-au 显示较详细的资讯
-aux 显示所有包含其他使用者的行程
au(x) 输出格式 :
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
USER: 行程拥有者
PID: pid
%CPU: 占用的 CPU 使用率
%MEM: 占用的记忆体使用率
VSZ: 占用的虚拟记忆体大小
RSS: 占用的记忆体大小
TTY: 终端的次要装置号码 (minor device number of tty)
STAT: 该行程的状态:
D: 无法中断的休眠状态 (通常 IO 的进程)
R: 正在执行中
S: 静止状态
T: 暂停执行
Z: 不存在但暂时无法消除
W: 没有足够的记忆体分页可分配
<: 高优先序的行程
N: 低优先序的行程
L: 有记忆体分页分配并锁在记忆体内 (实时系统或捱A I/O)
START: 行程开始时间
TIME: 执行的时间
COMMAND:所执行的指令
kill
top
设备管理
insmod
命令用于载入模块。
modinfo
用于显示kernel模块的信息。
root@ubuntu:/home# modinfo drm
filename: /lib/modules/4.15.0-142-generic/kernel/drivers/gpu/drm/drm.ko
license: GPL and additional rights
description: DRM shared core routines
author: Gareth Hughes, Leif Delgass, José Fonseca, Jon Smirl
license: GPL and additional rights
description: DRM bridge infrastructure
author: Ajay Kumar <ajaykumar.rs@samsung.com>
license: GPL and additional rights
description: DRM panel infrastructure
author: Thierry Reding <treding@nvidia.com>
srcversion: BE2EC51D242EBBE7056C39B
depends:
retpoline: Y
intree: Y
name: drm
vermagic: 4.15.0-142-generic SMP mod_unload
parm: edid_firmware:Do not probe monitor, use specified EDID blob from built-in data or /lib/firmware instead. (string)
parm: vblankoffdelay:Delay until vblank irq auto-disable [msecs] (0: never disable, <0: disable immediately) (int)
parm: timestamp_precision_usec:Max. error on timestamps [usecs] (int)
parm: edid_fixup:Minimum number of valid EDID header bytes (0-8, default 6) (int)
parm: debug:Enable debug output, where each bit enables a debug category.
Bit 0 (0x01) will enable CORE messages (drm core code)
Bit 1 (0x02) will enable DRIVER messages (drm controller code)
Bit 2 (0x04) will enable KMS messages (modesetting code)
Bit 3 (0x08) will enable PRIME messages (prime code)
Bit 4 (0x10) will enable ATOMIC messages (atomic code)
Bit 5 (0x20) will enable VBL messages (vblank code)
Bit 7 (0x80) will enable LEASE messages (leasing code) (int)
lsmod
显示已加载的模块
lsmod |grep drm
rmmod
卸载模块
shell环境相关
1.chsh:查看和修改当前登录的shell
查看我们拥有的shell:chsh -l
或者:cat /etc/shells
查看当前shell:echo $SHELL
将shell环境切换到bash:chsh -s /bin/bash
cat /etc/passwd|grep ^root
或者grep ^root /etc/passwd
就可以看到root用户的shell环境这是我们执行chsh -s的原理所在,真正修改的地方。
2.查看和设置shell的环境变量
查看环境变量:export、set、env、declare
Shell 的变量,可以分为“环境变量”和“自定义变量”两种类型,两者的区别在于作用范围不同。环境变量可以在其进程的子进程中继续有效,而自定义变量的势力范围则无法延伸到其进程的子进程中。
export、env只显示环境变量,set、declare显示环境变量+自定义变量。
设置环境变量:
用 export 设置的变量就成为了环境变量,而没有使用 export 设置的则是自定义变量:
#我们在当前Shell进程中指定了var1变量
[roc@roclinux ~]$ var1="hello"
[roc@roclinux ~]$ echo $var1
hello
#我们在当前Shell进程中又指定了var2变量
[roc@roclinux ~]$ var2="world"
[roc@roclinux ~]$ echo $var2
world
#我们通过export发布var1
[roc@roclinux ~]$ export var1
#我们进入到一个bash子进程中
[roc@roclinux ~]$ bash
#var1变量仍然有效, 而var2变量已经无效了
[roc@roclinux ~]$ echo $var1 # 输出变量的值
hello
[roc@roclinux ~]$ echo $var2 # 什么也没有输出
export PATH=$PATH:/home/to/operation_tools
注意export设置的只在此命令行下有效,若想将设置的环境变量作用在所有的shell环境中,需要将此命令添加到开机执行脚本中去。
3.expr
计算器:注意特殊字符需要反斜杠:expr \( 20 - 10 \) \* 3
字符运算
运算 | 表达式 | 意义 |
---|---|---|
match | match STRING REGEXP | STRING 中匹配 REGEXP 字符串并返回匹配字符串的长度 |
substr | substr STRING POS LENGTH | 从 POS 位置获取长度为 LENGTH 的字符串 |
index | index STRING SUBSTR | 查找子字符串的起始位置 |
length | length STRING | 计算字符串的长度 |
其他好用命令
tmux
凡是互联网行业的从业者,无论是做运维的同学,还是做开发的同学,一般都是在自己的工作电脑上安装远程连接工具(如 iTerm、putty、XShell、SecureCRT 等),远程登录到公司服务器上,进行具体的操作,而其中一些操作的耗时会很长。
在这期间,一旦我们的远程连接工具所在的工作电脑出现断网或断电的情况,那么很多耗时较长的操作就会因此中断,这是所有运维、开发同学都很头疼的一个问题。下面,我们就先给大家列出一些典型的痛点。
痛点一:大数据传输的漫长一夜
相信做过 Linux 服务运维的同学,都用 scp 进行过服务器间的大文件网络传输。一般这需要很长的时间,这期间,如果工作电脑出现断网或者断电的情况,则会导致远程连接工具无法与服务器通信,从而使得它所控制的数据传输也因此中断。
情景再现:
localhost:~ roc$ ls -hl
total 36419584
-rw------- 1 roc staff 17G 1 20 11:06 win7.vdi
localhost:~ roc$ scp -P 22000 win7.vdi roc@roclinux.cn:/home/roc
win7.vdi 0% 7296KB 800.3KB/s 6:19:05
一个 17GB 的大文件,刚刚开始传输,预估耗时 6 小时 19 分钟,谁能保证中间不出现关机和断电的情况呢。
有些同学说可以用 nohup 来解决啊,是的,这是一个办法,可是使用 nohup 的问题在于如果同时传输的任务众多,则最后你自己可能都分不清哪个任务对应哪个传输了,何况 nohup 还会留下 nohup.out 这么一个临时文件在那里。
还有同学说,即使中断了,也可以断点续传啊。可惜的是,scp 并不支持断点续传。如果改用 rsync 倒是可以,可惜 rsync 参数用起来很是复杂,谁能保证每位运维工程师都能熟练掌握那么多复杂的参数呢?这个时候,请试一试 tmux 吧!
痛点二:正在编译却被拉去开会
和大文件数据传输情况类似,一些大型的开发项目的代码编译过程,往往也需要很长的时间,短则几分钟,长则一通宵。对于一通宵的编译来说,这要是中间出现断网断电,那就相当悲剧了。整个项目进展就又要向后推迟至少一天。这个时候,我们向你推荐 tmux!
痛点三:多个窗口切换到晕
痛点四:一屏显示多窗口之殇
有时候为了进行多文件内容对比,如果没有一款很好用的分屏管理工具,那么我们只好创建多个终端,然后手动调整它们的大小和位置
1.启动 tmux
首先,我们使用远程登录工具,登录到远程服务器上,然后执行下面的命令:
[root@roclinux ~]# tmux new -s roclinux
-s是 session 的缩写,顾名思义,我们启动了一个全新的 tmux 会话(tmux session),并且把这个会话起名叫作 roclinux。
2.再创建一个新的窗口
在创建会话的同时,tmux 会在会话中创建一个窗口(tmux window),就是图 4 中的 0:bash。
好了,我们试着再创建一个窗口:
第一步:按 Ctrl+B 组合键,然后松开。
第二步:再单独按一下 c 键。
细心的同学可能会提出一个问题,为什么刚才星号(*)是在 0:bash 后面,而现在却到了 1:bash 后面呢?
这是个好问题,星号()在这里表示的是“当前处于活跃状态的窗口”,也就是哪个窗口现在处于可操作状态,星号()就在哪个窗口的后面。这回知道了吧。
3.在窗口间切换
既然,我们在 roclinux 这个 session 中已经有了两个窗口,那么如果想在两个窗口间进行切换,应该怎么操作呢?
很简单,假如我们要切换到 0:bash 这个窗口,步骤如下:
第一步:按 Ctrl-B 组合键,然后松开。
第二步:按数字 0 键。
看,我们刚才说的星号(*)是不是已经悄悄移动到 0:bash 的后面啦。同理,在按下 Ctrl+B 组合键后,按相应数字键,就可以切换到相应的窗口了。就是这么简单!
4.退出会话,还能再回来
现在,我们切换到 0:bash,运行一个命令:
[root@roclinux ~]# watch -n 2 free
这个命令会每隔 2 秒钟更新一次内存使用状态,如果不输入 Ctrl+C,则永远不会退出。
假如这时候你要带着办公电脑去开会,你的电脑要断网,又不想中断服务器上正在执行的 watch 命令,怎么办呢?
哈哈,tmux 正好可以派上用场,方法是这样的:
第一步:输入组合键 Ctrl+B,然后松开。
第二步:输入字母 d。
看,tmux 环境消失了!眼前只有一行提示 [detached]:
[root@roclinux ~]# tmux new -s roclinux
[detached]
这表示,我们已经切断了办公电脑和刚才那个 tmux 之间的桥梁。现在如果你要外出,可以放心地关闭你的电脑了。
当你回到家后,打开电脑,连接到你的那台远程服务器,然后执行一个神奇的命令:
[root@roclinux ~]# tmux ls
roclinux: 2 windows (created Fri Jan 22 16:30:13 2016) [130x36]
[root@roclinux ~]# tmux a -t roclinux
看,我们又回到了刚才的状态,那个查看内存使用状态的 watch 命令,在那里乖乖地运行着。这就是 tmux 的神奇之处,它可以让远端服务器的命令,脱离用户自己的电脑来执行,还可以随时召唤回来,继续进行操作和查看。