一、Linux命令概述1、Linux命令的分类Linux命令的执行必须依赖于Shell命令解释器。Bash是Linux系统中默认使用的Shell程序,文件位于/bin/bash。根据Linux命令与Shell程序的关系,一般分为以下两种类型:内部命令:指的是集成于shell解释器程序(如bash)内部的一些特殊指令,也称为内建(Built-IN)指令。内部命令属于shell的一部分,所以并没有单独对应的系统文件,只要shell解释器被运行,内部指令也就自动载入内存了,用户可以直接使用。内部命令无需从硬盘中读取文件,因此执行效率更高。外部命令:指的是linux系统中能够完成特定功能的脚本文件或二进制程序,每个外部命令对应了系统中的一个文件,是属于shell解释器程序之外的命令,所以称为外部命令。Linux系统必须知道外部命令对应的文件位置,才能够由shell加载并运行。2、Linux命令行的格式命令字 [选项] [参数]命令字:命令字即命令名称选项: 使用单字符的选项时,一般在选项前使用“-”符号(半角的减号符)引导,称为短格式选项 使用多字符的选项时,一般在选项前使用“--”符号(两个半角的减号符)引导,称为长格式选项。参数:命令参数是命令字的处理对象。经验总结:在实际使用Linux命令行的过程中,“选项”和“参数”的称谓经常容易混淆,甚至前后顺序也可以颠倒,但一般不会影响到命令的执行结果,所以很多时候并不做严格区分。3、命令行界面几个辅助操作①Tab键:按一次补全(必需是命令的唯一标识字串时才会补全),按两次列出所有可能项。②反斜杠“\”:强制换行,如果输入的一行命令内容太长,终端会自动换行。有时候为了显示美观及方便查看,也可以插入“\”强制换行,在一行出现的“>”提示符后可以继续输入内容,将作为上一行命令的延续。③Ctrl+U:快速删除光标之前的所有字符。④Ctrl+K:快速删除光标处及之后的所有字符。⑤Ctrl+A:快速移动到行首。⑥Ctrl+L:清屏⑦Ctrl+C:强制取消当前操作。4、获得命令帮助
(1)使用help命令help命令本身是Linux Shell中的一个内建指令,其用途是查看各Shell内部命令的帮助信息。例如:help pwd为什么运行printf --help不能查看帮助呢?在bash环境下面,运行help可以看见所有的内置命令,可以看见内置命令包括printf,命令同名时,内置命令的优先级高于外部命令,并且内置命令用help printf来查看帮助。综上所述,查看内置printf命令的帮助用help printf,查看外部printf命令的帮助要带上全路径,运行/usr/bin/printf --help 或 help /usr/bin/printf 查看帮助(不带全路径会被认为是内置printf命令)。
(2)使用“--help”选项对于大多数linux外部命令,都可以使用一个通用的命令选项“--help”,用于显示对应命令字的格式即选项等帮助信息。例如:ls --help(3)使用man手册页man手册页(Manual Page)是Linux系统中最为常用的一种在线帮助形式,绝大部分的外部软件都在安装时为执行程序、配置文件提供了详细的帮助手册页。例如:阅读file命令的帮助手册页信息(file命令用于判断文件的类型):man file阅读man手册页时,使用“↑↓”方向键可以向上、向下滚动一行文本内容;使用Page Up和Page Down键可以向上、向下翻页。按Q或q键可以退出手册页。按“/”键可以对手册内容进行查找,如输入“/-v”可以查找到“-v”选项的帮助信息,若找到的结果有多个,可以按N、n键分别用于向上、向下进行定位选择例 2.5将ls命令的man手册页的内容保存为文本文件lshelp.txt。man ls | col -b > /tmp/lshelp.txt(4)使用info命令信息页(Info Page)是Linux系统中提供的另外一种在线帮助形式,功能与man手册页类似,但提供的信息通常会更加详尽,而且提供了不同帮助主题间的跳转功能。例如:info file通常使用man手册页已经能够满足绝大部分的命令在线帮助需求,因此时用到info命令的情况较少。二、文件和目录管理1、目录操作命令(1)pwd命令--查看当前工作目录(Print Working Directory)(2)cd命令--切换工作目录(Change Directory)若不指定目标目录位置,将缺省切换到当前用户的宿主目录(家目录),宿主目录是Linux用于登录系统后默认的工作目录。例如root用户的宿主目录位于/root,用于teacher的宿主目录位于/home/teacher/。 绝对路径:这种方式以根目录为起点,若要确切表明grub是一个目录(而不是一个文件),可以在最后也加上一个目录分隔符,如表示为“/boot/grub/”。 相对路径:这种方式一般以当前工作目录为起点,在开头不使用“/”符号,相对路径主要包括以下几种形式:①直接使用目录名或文件名,用于表示当前工作中的子目录、文件的位置。②“./”开头,表示当前目录下,例:路径执行一个当前目录中的命令就必须加上“./”,否则系统会默认在PATH路径下找。③“../”开头,表示父目录下,例如若当前处于“/boot/grub/”目录中,则“../vmlinuz”等同于“/boot/vmlinuz”。④使用“~用域名”的形式开头,表示指定用户的宿主目录下,省略用户名时默认为当前用户的宿主目录下。“cd -”:上一次执行cd命令之前所处的目录。(上一次cd工作目录)“cd ~”等于“单独执行cd”(3)ls命令--列表显示目录内容(List)ls选项:aAldhR --color①-a:显示所有。包括以点号“.”开头的隐藏目录和隐藏文件。②-A:显示除“.”和“..”以外的所有。 “.”和“..”是两个特殊隐藏目录(当前目录和父目录)。③-l:长格式显示,ls默认以短格式显示。④-d:只显示本身属性,而不显示子目录属性。⑤-h:以k、m等单位显示。⑥-R:递归显示(更深层次的子目录和文件)。⑦--color:在字符模式中以颜色区分不同的文件。“--color=tty”表示使用终端预定义的颜色方案。一般是这样的:深蓝色表示目录、白色表示一般文件、绿色表示可执行文件、黄色表示设备文件、红色表示压缩文件。⑧-i:显示i节点号⑨--sort=time :显示时按照时间排序(最新的在最前头)sort by WORD instead of name: none (-U), size (-S), time (-t), version (-v), extension (-X)ls -l 输出格式详解:drwxrwxrwx 6 www www 4096 Oct 16 11:32 style前面十位字符,分成四段来看 d | rwx |rwx |rwx 第一段代表文件类型,后三段是文件权限紧接着后面的 6代表“文件硬链接数”或“目录子对象数”。对象是文件时,这个数字代表有多少个硬链接指向它,没有额外硬链接则为1;对象是目录时,则是它包含的子文件/目录数,需要注意的是每个目录都会有两个子目录,".",".."分别指向当前目录和父目录,所以这个数字会比我们正常看到的目录多2。
同时查看多个文件时,以空格分隔:ls -l install.log /etc/hosts通配符:?表示任意单个字符(相当于正则表达式的.),表示0到任意多个字符(即0到正无穷个字符)例如:以长格式列出/etc/目录下以“ns”开头、“conf”结尾的文件信息:ls -lh /etc/ns.confalias别名机制: alias 别名='实际命令' 例如:alias dir='/bin/mkdir'unalias 别名:取消命令别名 unalias -a:取消所有别名单独执行alias时,可以查看当前用户环境中已经定义好的命令别名。(4)mkdir命令--创建新目录(Make Directory)-p:创建多层目录(递归创建)。若不使用“-p”选项,则只能在已存在的目录中创建其子目录。-p的另一用途:加-p后,若未存在则创建,若已存在也不会报错(相当于未执行),用于脚本多次执行。例如 同时创建多个目录:mkdir mp3 mp4 mp5mkdir /usr/local/zookeeper/{server0,server1,server2}补充:创建目录、文件时前加点“.”是创建隐藏目录、文件(5)du命令--统计目录和文件的空间占用情况(estimate file space usage)文件大小和文件空间占用情况不同:因为磁盘在分区时指定簇大小(如4K),占磁盘空间时以簇为最小单元,5k的文件也需占两个簇,所以用ls -l查文件大小为5k,du查文件空间占用情况为8K。①-a:分别统计各个文件的空间占用情况。②-h:以k、m等单位显示。 ③-s:汇总统计所有文件的总空间占用情况。用du -sh /u01/* 可以针对/u01/下各个子目录/文件,分别汇总统计他们的空间占用情况
④--apparent-size(简写为--apparent就行):打印表面大小,而不是空间占用情况。“表面大小”通常比“空间占用”小,但也可能由于稀疏(空洞)文件 、内部碎片、间接块等原因导致表面大小比“空间占用”大。⑤-x:禁止跨越FS(同rsync的-x)(即禁止统计挂载的目录) ⑥--exclude=PATTERN 排除指定模式的文件比如说排除/proc目录,因为/proc目录无法被统计
du -sh -x /* --exclude=proc
2、文件操作命令(1)touch命令--新建空文件/更新文件时间 可以同时创建多个文件:touch file1.txt file2.txt(2)file命令--查看文件类型例2.20 查看ls命令程序的文件类型(32/64位执行程序)
例2.21 查看/etc/init.d/network文件的类型(文本格式的shell执行脚本)
例2.22 查看/etc/resolv.conf文件的类型(ASCII格式的普通文本文件)
(3)cp命令--复制文件或目录(Copy) 基本使用格式:cp [选项] ... 源文件或目录 ... 目标文件或目录注意:若需要复制的源是多个文件或目录时,则目标必须是目录。①-f:(force)强制复制(有同名目标时不提醒)。②-i:(Interactive)交互式复制(有同名目标时提醒)。③-p:(Preserve )保持源文件的权限、属主、时间标记等属性不变 ④-r:递归复制,又叫复制目录。复制目录时必须使用此选项。补充:Linux CentOS中cp复制强制覆盖已存在的目标Linux下默认cp命令是有别名的(alias cp='cp -i'),无法在复制时强制覆盖,即使你用 -f 参数也无法强制覆盖文件,下面提供几个从网上找的Linux下cp命令覆盖的方法。 1) 取消cp的alias(放心这不是永久生效): #unalias cp #cp a /test/a 2) 加反斜杠 \cp 执行cp命令时不走alias: #\cp a /test/a (就用此) 3)另外一个有意思的方法: #yes|cp a /test/a补充:cp中大括号{}的用法大括号中的字串用逗号分隔,表示或字关系紧临前后字符串。
例2.25 将目录/boot/grub、/etc/httpd/conf复制到当前目录中:cp -r /boot/grub/ /etc/httpd/conf/ ./(4)rm命令--删除文件或目录(Remove) ①-f:强制删除(不提醒)②-i:交互式删除(默认的)③-r:递归删除,又叫删除目录。 删除目录时必须使用此选项。例如:一次删除多个文件 :rm -rf file1 file2(5)mv命令--移动文件或目录(Move) ,也可用于改名(同路径移动时,相当于改名)基本使用格式:mv [选项] ... 源文件或目录...目标文件或目录例2.28 将当前目录中的mytouch程序文件改名为tfile.exe:mv mytouch tfile.exe例2.29 将当前目录中的grub目录转移至public_html目录中:mv grub public_html/ (6)which命令--查找命令的路径(Remove) 内部命令没有路径,which只用于查找外部命令的路径。如cd命令:
搜索范围主要是“默认命令搜索路径 ”和“命令别名”。在rhel5系统中搜索范围还包括用户环境中设置的命令别名。默认当找到第一个目标后即不再继续查找,若希望在搜索路径中查找所有匹配项,可以添加“-a”选项。 -a:查找所有匹配项(7)find命令--查找目录文件 基本使用格式: find pathname 查找条件 [-print -exec -ok]该命令的参数:pathname: find命令所查找的目录路径。例如用.来表示当前目录,用/来表示系统根目录。-print: find命令将匹配的文件输出到标准输出。(默认就是标准输出)-exec: find命令可以对查找的结果进行过滤处理,在表达式后添加一个“-exec”关键字,并设置过滤命令即可。在过滤命令中,使用“{}”表示find相应命令的输出结果,最后需要添加“[空格] \;”表示命令结束。形式为-exec command {} \;,注意{ }和\;之间的空格。{}为查找结果,作为命令的参数灵活调用,并不一定要放到最后例如:#find / -user ira -exec cp {} /root/findfiles \;-ok 和-exec的作用相同,只不过以一种更为安全的模式来执行该参数所给出的shell命令,在执行每一个命令之前,都会给出提示,让用户来确定是否执行。查找条件类型:每一个选项前面跟随一个横杠-。根据“ll file1”的属性来顺序记忆①-name 按照文件名来查找文件,允许使用?*通配符。②-mtime +n/-n 按照文件的更改时间来查找文件, - n表示文件更改时间距现在n天以内,+ n表示文件更改时间距现在n天以前(+n表示n天以前,-n表示n天以内)。-mmin +n/-n按照文件的更改时间来查找文件, +n表示n分钟以前,-n表示n分钟以内③-size 根据文件大小寻找文件。-empty 查找大小为0的目录或文件④-user 按照文件属主来查找文件。-group 按照文件属组来查找文件。、-nouser 查找无有效属主的文件,即该文件的属主在/etc/passwd中不存在。-nogroup 查找无有效属组的文件,即该文件所属的组在/etc/group中不存在。⑤-perm 按照文件权限来查找文件。⑥-type 查找某一类型的文件,诸如:b 块设备文件。块设备是可随机读写的设备,例如硬盘。 c 字符设备文件。字符设备必须是顺序读写的,比如串口d 目录。 f 普通文件。p 管道文件。管道文件是一种很特殊的文件,主要用于不同进程间的信息传递。当两个进程间需要进行数据或信息传递时,可以通过管道文件。一个进程将需传递的数据或信息写入管道的一端,另一进程则从管道的另一端取得所需的数据或信息。通常管道是建立在缓存中.l 符号链接文件。同时使用多个查找条件:若有多个查找条件时,用-a、-o连接,表示而且(and)、或者(or)。例2.35 在/boot目录中查找超过1024KB而且文件名以“vmlinuz”开头的文件。
练习:1、如果想在当前目录查找文件名以两个小写字母开头,跟着是两个数字,最后是*.txt的文件:
find . -name “[a-z][a-z][0--9][0--9].txt” -print
2、在当前目录下查找文件权限位为7 5 5的文件,即文件属主可以读、写、执行,属组可以读、执行,其他用户可以读、执行的文件:
find . -perm 755
-perm mode 文件的权限位恰好是 mode -perm -mode 所有的权限位 mode 都被设置了的文件。(文件的权限最少是mode) -perm +mode 任何权限位 mode 被设置了的文件(文件的权限最多是mode)例如:用760为例,760的权限位 mode = 111 110 000 这个样子find . -perm 760 是说恰好为760 , rwxrw----find . -perm -760 是说第一组满足7,第二组满足6就可以了,后一组无所谓,rwxrw----或rwxrwxr--等都满足。这就是 mode 中的那些 1 位必须全部满足find . -perm +760 是说3组中只要有一个满足就可以了,因此 r-x------ 也会入选,范围又扩大很多,就是说 mode 中任何 1 位得到满足都会入选3、为了查找属主帐户已经被删除的文件,可以使用-nouser选项。这样就能够找到那些属主在/etc/passwd文件中没有有效帐户的文件。在使用-nouser选项时,不必给出用户名;find命令能够为你完成相应的工作。例如,希望在/ h o m e目录下查找所有的这类文件,可以用:
find /home -nouser
4、希望在系统根目录下查找更改时间在5日以内的文件,可以用:
find / -mtime -5
为了在/var目录下查找更改时间在3日以前的文件,可以用:
find /var/adm -mtime +3
5、查找系统中所有文件长度为0的普通文件,并列出它们的完整路径,可以用:
find / -type f -size 0 -exec ls -l {} \;
或
find / -type f -empty -exec ls -l {} \;
为了查找/var/log目录中更改时间在7日以前的普通文件,并删除它们,可以用:$ find /var/logs -type f -mtime +7 -exec rm {} \;6、找出所有用户 ira 拥有的文件,并且把它们拷贝到/root/findfiles 目录中#mkdir /root/findfiles#find / -user ira -exec cp {} /root/findfiles \; //{}为查找结果,作为命令的参数灵活调用,并不一定要放到最后(8)ln命令--为文件或目录建立链接(Link) 基本使用格式:ln [-sf] 源真实目录/文件 链接文件 巧记方法:众所周知,ln是创建链接文件的命令,一般命令的操作对象都放在最后,所以ln的最后一个参数为操作对象“链接文件”-s:创建软链接 -f:强制替换已存在的同名文件(即使存在的是普通文件,也会被链接文件替换) 当目标是一个已存在的目录时,就表示在此目录下创建与源同名同路径的链接文件(新创建的链接文件将保存到该目录中,并使用与“源真实目录/文件”相同的路径和名称)。例如 已存在目录/etc/,为文件/etc/sysconfig/network-scripts/ifcfg-eth0创建符号链接文件,并保存到/etc/目录中。
例2.39 为网卡配置脚本文件“/usr/sbin/system-config-network”建立名为/sbin/mynetconfig的硬链接文件,以便通过mynetconfig文件也可以对网卡参数进行配置。
system-config-network配置界面,类似于命令setup,都可在securecrt中打开。
链接文件类型:硬链接、软链接(符号链接)。区别详见“linux软链接与硬链接的区别”注意:不能对目录创建硬链接,也不能跨越不同分区创建硬链接。无论使用哪种链接,与直接访问原始文件的效果基本相同。区别:硬链接是索引节点的链接,软链接是硬链接和目录的链接。【硬链接】硬链接指通过索引节点来进行链接。在Linux的文件系统中,保存在磁盘分区中的文件不管是什么类型都给它分配一个编号,称为索引节点号(Inode Index)。在Linux中,多个文件名指向同一索引节点是存在的。一般这种链接就是硬链接。硬链接的作用是允许一个文件拥有多个有效路径名 ,这样用户就可 以建立硬链接到重要文件,以防止“误删”的功能。其原因如上所述,因为对应该文件的索引节点有一个以上的链接。只删除一个链接并不影响索引节点本身和其它的链接,只有当最后一个链接被删除后,文件数据块的链接才会被释放。也就是说,文件真正删除的条件是与之相关的所有硬链接文件均被删除。【软链接】另外一种链接称之为符号链接(Symbolic Link),也叫软链接。软链接文件有类似于Windows的快捷方式。它是硬链接和目录的链接,而硬链接是索引节点的链接。符号链接实际上是一个特殊的文件。在符号链接中,文件实际上是一个文本文件,其中包含的有另一文件的位置信息。补充:若删除了源文件,软连接会找不到源文件,会变红,硬链接不会受影响。3、文件内容操作命令(1)cat命令--查看并连接文件的内容(Concatenate)(2)more和less命令--分页查看文件内容 more命令为较早出现的分页显示命令,表示文件内容还有更多(more)的意思,less命令是较晚出现的分页显示命令,提供了比早期more命令更多的一些扩展功能,两个命令的用法基本相似。Enter:下一行 空格:下一页 b:上一页 q:退出 例如:more /etc/httpd/conf/httpd.conf ls -lh /ctf.txt | more(3)head和tail命令--开头末尾查看文件内容 -2/3/5:指定行数,若不指定行数,默认只显示10行。 -f:跟踪(follow) --->ctrl+c取消例如:head -3 /etc/passwd tail -f /var/log/messages(4)wc命令--统计文件内容中的数量信息(Word Count)数量包括:行数(-l)、单词数(-w)、字节数(-c),默认情况下相当于三个选项都使用。统计单词时以空格来区分计数。例如:wc -l /etc/passwd(5)grep命令--截取文件内容基本使用格式:grep [选项] ...截取条件 ...目标文件 -i:忽略大小写(Ignore Case)-v:反转查找(inVert)^word:表示以word开头 word$:表示以word结尾 ^$:表示空行。补充: lspci -tv:查看主机中的pci设备信息。同理lsusb -tv:查看主机中的usb设备信息。 lsmod:查看内核加载的模块 4、归档及压缩命令(1)gzip和bzip2命令--压缩或解压不同于tar,tar是打包,此是直接把原文件压缩(即修改原文件)。一般bzip2的压缩效率要好一些。-9:提高压缩比率。-d:解压(或使用专用解压命令gunzip、bunzip2)-c:保持原文件不变,把内容标准输出(到屏幕)。gzip建议使用扩展名“.gz”,bzip2建议使用扩展名“.bz2”,zip使用扩展名“.zip”例如:使用gzip命令将当前目录下的tfile.exe文件进行压缩:gzip -9 tfile.exe
使用bzip2命令将当前目录下的tfile.exe文件进行压缩:bzip2 -9 tfile.exe
使用gzip/bzip2命令解压:gzip -d tfile.exe.gz
使用gunzip/bunzip2命令解压:bunzip2 tfile.exe.bz2
补充: zip和unzip命令:不同于gzip和bzip2的地方:zip和unzip解压不会删除原文件把/home目录下面的zhangsan目录压缩为zhangsan.zip:zip -r /home/zhangsan.zip /home/zhangsan -r:递归压缩,压缩目录时一定要指定此选项。 -9:提高压缩比率。-t:检查压缩文件是否正确(单独检查时使用) -v:执行是时显示详细信息 -q:执行时不显示任何信息
.zip文件要用unzip命令来解压:unzip /home/zhangsan.zip -d /tmp/-d:指定解压目录 (2)tar命令--打包和解包 归档即打包,打包时也可以进行压缩,tar命令选项的短杠“-”可以省略。打包:tar [选项] ... 归档文件名 需要归档的源 例:tar zcvf /tmp/ctf.tar.gz /etc/ /boot/ 解包:tar [选项] ... 归档文件名 [-C 解包目录] 例:tar zxvf /tmp/ctf.tar.gz -C /选项:cxCjz,ftprv①-c:创建(打包)。 ②-x:解包(注意区分解包和解压) 。③-C,--directory=DIR:指定解包/打包目录(改变目录DIR) (打包时是:指定打包目录 ;解包时是:指定解包目录)(默认解包到当前目录下) ④-j:调用bzip2压缩或解压。 ⑤-z:调用gzip压缩或解压。⑥-f:打包成归档文件。 ⑦-t:列表查看包内文件。 例:tar -tvf /tmp/ctf.tar.gz⑧-p:打包时保留文件及目录的权限。 ⑨-r:向现有归档文件 末尾追加文件。用于rpm -ql查询不完全,没有打包完整,可以继续查询追加。 不能与cjz选项并用(即只能是zcvf和rvf两种组合)例如:我远程电脑上没有安装yum,而我又不想找yum的rpm包,则可以在一台已经安装yum的系统上(必须与远程系统版本号相同)把yum安装的所有目录/文件打包到远程电脑上解包,即可使用yum。rpm -ql yum | xargs -i tar rvf /tmp/yum.tar {}在docker容器中:scp root@192.168.1.7:/tmp/yum.tar /tmp/tar xvf /tmp/yum.tar -C /像一些个系统内核命令useradd等直接把命令文件拷贝到容器即可使用which useradd 输出 /usr/sbin/useradd在docker容器中 :scp -p root@192.168.1.7:/usr/sbin/useradd /usr/sbin/⑩-v:显示详细信息。tar命令的补充: 1)--exclude 排除某个目录或文件tar zcvf /tmp/fd.tar.gz --exclude=file1 --exclude=dir1 或tar zcvf /tmp/fd.tar.gz --exclude=file1 --exclude=dir1 //以此为准或tar --exclude=file1 --exclude=dir1 zcvf /tmp/fd.tar.gz 如下的书写是错误的:tar zcvf --exclude=file1 --exclude=dir1 /tmp/fd.tar.gz (X)--exclude的模式也支持通配符tar zcvf /tmp/haha.tar.gz --exclude=nginx.log --exclude=supervisord.log
注意:1、--exclude=file1 2、要排除一个目录是--exclude=dir1 而不是--exclude=dir1/
如果想不包含部分的特定文件列表,可以把不包含的文件放到一个文件ext.txt,然后 tar zcvf backup_1.tar.gz --exclude=resource* -X ext.txt /opt/data就可以了。我的ext.txt文件内容如下:$ cat /tmp/ext.txt /opt/data/devs/locks/db-logs.lock/opt/data/devs/locks/db.lock/opt/data/devs/hooks/post-revprop-change.tmpl/opt/data/devs/hooks/pre-lock.tmpl/opt/data/devs/hooks/post-unlock.tmpl/opt/data/devs/db/transactions/opt/data/devs/db/txn-current-lock/opt/data/devs/db/write-lock/opt/data/devs/db/format/opt/data/devs/conf/passwd这样就可以在打包的时候不包含以上的文件或者目录。
2)-N "yyyy/mm/rr": 只打包指定“时间或文件”之后的文件(只打包比指定时间或文件更新的文件)tar zcvf /ctf.tar.gz -N "2016-01-26 00:00:00" --exclude=yum_save_tx.2016-01-28.05-10.6MQeyP.yumtx *
3)另外一个非常有用的重定向操作符"-",用 – 作为 “归档文件名”(-在此处表示打包到标准输出/从标准输入解包)请看下面这个例子: (cd /source/directory &&tar cf - . ) | (cd /dest/directory && tar xvfp -)解析:$ (cd /source/directory&& tar cf - . ) ## 进入/source/directory目录,然后打包当前目录 ( 即原命令中的那个. )这里用了 – 作为“归档文件名”,表示打包到标准输出(cd /dest/directory && tar xvfp -)这里用了 – 作为“归档文件名”,表示从标准输入解包。该命令表示把 /source/directory 目录下的所有文件通过压缩和解压,快速的全部移动到 /dest/directory 目录下去,这个命令在 /source/directory 和 /dest/directory 不处在同一个文件系统下时将显示出特别的优势。(比如向nfs挂载目录中拷贝时,当源文件数比较小而且多时,这种方法就比scp和rsync要快数十倍)由于用了管道及标准输入输出,所以这一动作不会产生中间文件。(想象一下在windows下,你要做同样的事情,就必须先产生一个实际的打包文件,然后拷贝到目的地,然后解压,然后再删除产生的打包文件。本例中在同一台主机上操作其实没有什么实际意义,用cp命令就可以了(也不是,当源文件数比较小而且多时,这种方法就比scp和rsync要快数十倍)。这种用法用在两台主机之间时就很好用了,比如通过ssh来拷贝某个目录:(cd /root/test && tar cf - .) | ssh remote_host "cd /root/test2 && tar xvfp -"就可以将本地的 /root/test下的内容,通过ssh连接,拷贝到远程remote_host上的 /root/test2 下。
还可以这样用:下载tar包后直接管道解包:curl https://www.kernet.org/pub/linux/utils/util-linux/v2.24/util-linux-2.24.tar.gz | tar zxvf -
4)tar+ssh实现异地备份(远程打包拷贝)以前有个别服务器备份是用tar+gzip打包压缩后再ftp传到异地备份,现改成通过tar+ssh的方式,可以直接备份到异地,减少在本地生成备份包,及通过内部网络传输来降低tar+gzip打包时对磁盘的IO压力。ssh无密码登陆请参考“ssh免密码登录课本笔记版” ① 本地一边打包压缩,一边传输到异地解压:(本地打包,传递到远端解包)(cd /usr/local;tar zcvf - zookeeper) | (ssh root@zookeepernode1 "cd /usr/local;tar zxvf -")管道后面ssh的小括号可有可无,只有当两个分号分隔的命令为一组时,才需用小括号括起来。
② tar打包压缩到远程服务器:(本地打包,传递到远端不解包)有两种方式,一是通过dd of,一是cat >,测试是dd of快一些,不过是跟当时服务器的负载有关系[root@local ~]# time tar zcvf – -T /mail/backup/DIR.txt |ssh root@192.168.0.103 “dd of=/mail/test.tar.gz”tar: Removing leading /’ from member names<br/>2696500+0 records in<br/>2696500+0 records out <br/>real 6m51.373s<br/>user 3m8.539s<br/>sys 0m14.306s<br/>[root@local ~]# time tar zcvf – -T /mail/backup/DIR.txt |ssh root@192.168.0.103 “cat > /mail/2.tar.gz”<br/>tar: Removing leading/’ from member names real 9m31.059suser 3m10.916ssys 0m14.924s [root@target test]# ll test.tar.gz 2.tar.gz-rw-r–r– 1 root root 1378488320 Apr 17 11:47 2.tar.gz-rw-r–r– 1 root root 1380608000 Apr 16 18:06 test.tar.gz
③ 把本地的压缩包直接解压到远程服务器 (本地有tar包,传递到远端解包)zcat dir.tar.gz | ssh 192.168.0.116 "cd /opt; tar xvf -" 或者cat dir.tar.gz | ssh 192.168.0.116 "cd /opt; tar zxvf -" 或者ssh 192.168.0.116 "tar zxvf -" < file.tar.gz④ 把远端服务器的压缩包直接解压到本地:(远端有tar包,传递到本地解包)ssh root@192.168.0.103 “cat /mail/test.tar.gz” | tar zxvf -
⑤ 也可以本地服务器进行打包,再到异地服务器进行压缩:(个人感觉这个功能比较鸡肋,可以不用记了)[root@local ~]# time tar cf – -T /mail/backup/DIR.txt |ssh root@192.168.0.103 “gzip -1 > /mail/3.tar.gz”tar: Removing leading `/’ from member names real 7m18.473suser 0m29.029ssys 0m12.023s
三、使用vi文本编辑器一般用vim而不用vi,vim是升级版,有颜色方案。1、vi编辑器的工作模式 命令模式、输入模式、末行模式
2、命令模式中的基本操作vim指定要编辑的文件名作为参数,若该文件并不存在,则vim将根据该文件名打开一个新的空文件。(1)模式切换a、i、o切换到输入模式①a:(after)在光标之后插入内容 ③i:在光标之前插入内容。 ⑤o:在本行之下插入一个新行。②A:在行尾插入内容 ④I:在行首插入内容。 ⑥O:在本行之上插入一个新行。(2)光标移动统一首行叫“第一行”,尾行叫“最后一行”(为了避免和行首、行尾叫法混乱)。下面有多个可选操作时,只记黄色标注的。①方向移动:↑↓←→②翻页移动:上翻页:PageUp、Ctrl+B 下翻页:PageDown、Ctrl+F 。PageUp、PageDown同样适用于vi的输入模式。③行内快速跳转:快速跳转到本行的行首:Home、^、 数字“0”快速跳转到本行的行尾:End、$④行间快速跳转: 5G:跳转到第5行==末行模式中“:5” gg:跳转到第一行 G:跳转到最后一行。(3)复制粘贴删除(删除相当于剪切)1)复制(其格式也适用于“删除”): yy:复制本行 5yy:复制到第5行 yG:复制到最后一行2)粘贴: p:粘贴到光标之后(下一行) P:粘贴到光标之前(上一行)3)删除:①dd:删除当前行。 ②5dd:删除到第5行(从当前行开始算)。 ③dG:删除到最后一行(从当前行开始算)。④x 、Del:删除光标处的单个字符。⑤d^:删除光标之前到行首的所有字符。⑥d$:删除光标处到行尾的所有字符。⑦dw:全局删除指定字串。空格分隔,删除单词,无单词时删除空行。(4)文件内容查找①/ctf :从光标处向后查找 ②?ctf :从光标处向前查找 ③n、N:上下选择查找结果补充:文件内容查找支持正则表达式(注意不是通配符),比如说查找purge mariadb-server mysql-commonr,可以这么写/purge.mysql(5)撤销编辑、保存退出①u:撤销最近一次的操作 ②U:撤销本行的操作 ③ZZ :保存并退出3、末行模式中的基本操作补充: 末行模式中“:set nu”----显示行号, “:set nonu”----取消显示行号, “:set ic”----不区分大小写(常用于文件内容查找时)(1)保存并退出①w:保存 ②w+文件名:另存为 ③q:退出 ④q!:强制退出(不保存退出) ⑤wq:保存并退出== x(2)编辑新文件和读入其他文件内容到当前行下①:e 新文件:编辑新文件 例如: ②:r 文件名:读入其他文件内容到当前行下 例如: :r!command:读入命令的输出结果到当前行下。 例如: 补充: :!command:执行shell命令command:n,m w!command:将当前文件n至m行的内容作为指定命令的输入并执行之,若不指定n,m,则表示将整个文件内容作为command命令的输入(3)文件内容替换:[替换范围 ] sub /旧的内容/新的内容/ [c,e,g,i] //其中“旧的内容”又称为“搜索字串”,“新的内容”又称为“替换字串”“替换范围”下面几种形式:①%:整个文件 ②n,m:指定行数范围 ; 其中n,m也可以为“.,$”(当前行到最后一行), “.或空”表示当前行(当前光标所在行),$表示最后一行 ③用包含和模式表示行的范围(类似于sed中的用法) 有以下一些表示方法:不写range : 默认为光标所在的行。.或空 : 当前行。当前行即当前光标所在的行1 : 第一行。$ : 最后一行。33 : 第33行。'a : 标记a所在的行(之前要使用ma做过标记)。+1或 .+1 : 当前行的下一行(行号大了1)。当前行即当前光标所在的行 例如 :.,.+3 表示当前行到下面第3行。由于“空”也表示当前行,so此例子也可这么写 :,+3$-1 : 倒数第二行。(这里说明我们可以对某一行加减某个数值来取得相对的行)。22,33 : 第22~33行。1,$ : 第1行 到 最后一行。1,. : 第1行 到 当前行。.,$ : 当前行 到 最后一行。'a,'b : 标记a所在的行 到 标记b所在的行。% : 所有行(与 1,$ 等价)。?chapter? : 从当前位置向上搜索,第一个包含chapter的行。(其中chapter为字符串时表示包含,为正则表达式时表示模式匹配)/chapter/ : 从当前位置向下搜索,第一个包含chapter的行。(其中chapter为字符串时表示包含,为正则表达式时表示模式匹配)注意,上面的所有用于range的表示方法都可以通过 +、- 操作来设置行的相对偏移量。(+n表示向下偏移n行(行号大了n),-n表示向上偏移n行)举例:①:sub/i/I ②:10,20sub/i/I/g ③:10,20s/i/I/g ④:%s/ 旧的内容/新的内容/g补充:vim实现批量注释(注释符号有#、//、分号等)①在10-20行添加//注释--- :10,20s#^ #//#g //此处以#作为分隔符(当替换字串与分隔符相冲突时,要改用其他字符作为新分隔符)②在10-20行添加#注释--- :10,20s/^/#/g③删除注释--- :10,20s/^#//g实现把函数中某一段代码空出四个空格 :/chown -R kube/,/service docker restart/s/^/ /g实现把函数中某一段代码删除行首四个空格 :17,38s/^ //g