Linux命令集


前言

主要命令以及常见的复杂命令
参考: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<文件系统类型> 指定设备的文件系统类型。常用的选项说明有:

选项功能
minixLinux最早使用的文件系统。
ext2Linux目前的常用文件系统。
msdosMS-DOS 的 FAT。
vfatWin85/98 的 VFAT。
nfs网络文件系统。
iso9660CD-ROM光盘的标准文件系统。
ntfsWindows NT的文件系统。
hpfsOS/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
字符运算

运算表达式意义
matchmatch STRING REGEXPSTRING 中匹配 REGEXP 字符串并返回匹配字符串的长度
substrsubstr STRING POS LENGTH从 POS 位置获取长度为 LENGTH 的字符串
indexindex STRING SUBSTR查找子字符串的起始位置
lengthlength 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 的神奇之处,它可以让远端服务器的命令,脱离用户自己的电脑来执行,还可以随时召唤回来,继续进行操作和查看。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值