工具介绍
熟练使用 Linux 命令,是每一位和 Linux 服务器打交道的人员的基本功,也是提升工作效率的必备技能。本工具提供了常用的 Linux 命令的详细说明、相关用法及示例,是开发、运维、服务器管理员必备的参考工具。

ab 命令

说明

ab 命令是 Apache 提供的 Web 服务器的性能测试工具,它可以测试安装 Web 服务器每秒种处理的 HTTP 请求数。通常,可以使用 ab 压力测试工具对网站的并发及负载能力进行测试。

语法

ab [选项] [主机名]

选项

-A:指定连接服务器的基本的认证凭据;
-c:指定一次向服务器发出请求数;
-C:添加 cookie;
-g:将测试结果输出为 gnuolot 文件;
-h:显示帮助信息;
-H:为请求追加一个额外的头;
-i:使用 head 请求方式;
-k:激活 HTTP中 的 keepAlive 特性;
-n:指定测试会话使用的请求数;
-p:指定包含数据的文件;
-q:不显示进度百分比;
-T:使用 POST 请求数据时,设置内容类型头;
-v:设置详细模式等级;
-w:以 HTML 表格方式打印结果;
-x:以表格方式输出时,设置表格的属性;
-X:使用指定的代理服务器发送请求;
-y:以表格方式输出时,设置表格属性。

参数

主机名:被测试的主机名称

ar 命令

说明

ar 命令是一个建立或修改备存文件,或是从备存文件中抽取文件的工具,ar 可 让您集合许多文件,成为单一的备存文件。在备存文件中,所有成员文件皆保有原来的属性与权限

语法

ab [选项] [参数]
Usage: ar [emulation options] [-]{dmpqrstx}[abcDfilMNoPsSTuvV] [--plugin <name>] [member-name] [count] archive-file file...
       ar -M [<mri-脚本]

选项

d            - 从归档文件中删除文件
m[ab]        - 在归档文件中移动文件
p            - 打印在归档文件中找到的文件
q[f]         - 将文件快速追加到归档文件中
r[ab][f][u]  - 替换归档文件中已有的文件或加入新文件
s            - 作为 ranlib 使用
t            - 显示归档文件的内容
x[o]         - 从归档文件中分解文件

特定命令修饰符:

[a]          - 将文件置于 [成员名] 之后
[b]          - 将文件置于 [成员名] 之前 (于 [i] 相同)
[D]          - 使用 0 作为时间戳和 uids/gids
[U]          - 使用真实的时间戳和 uids/gids (默认)
[N]          - 使用名称实例[数量]
[f]          - 截去插入的文件名
[P]          - 在匹配时使用完整的路径名
[o]          - 保留原来的日期
[u]          - 只替换比当前归档内容更新的文件

通用修饰符:

[c]          - 不在必须创建库的时候给出警告
[s]          - 创建归档索引 (cf. ranlib)
[S]          - 不要创建符号表
[T]          - 做一个压缩档案
[v]          - 输出较多信息
[V]          - 显示版本号
@<file>      - 从<file>读取选项
--target=BFDNAME - 将目标对象格式指定为BFDNAME

选项参数

--plugin <p> - 加载指定的插件

ar 支持的目标

elf64-x86-64
elf32-i386
elf32-x86-64
a.out-i386-linux
pei-i386
pei-x86-64
elf64-l1om
elf64-k1om
elf64-little
elf64-big
elf32-little
elf32-big
plugin
srec
symbolsrec
verilog
tekhex
binary
ihex

实例

1、打包文件

[root@localhost ~]# ls   //显示当前目录文件
a.c b.c d.c   install.log     qte
anaconda-ks.cfg c.c Desktop

[root@localhost ~]# ar rv one.bak a.c b.c //打包 a.c b.c文件
ar: 正在创建 one.bak
a - a.c
a - b.c

2、打包多个文件

[root@localhost ~]# ar rv two.bak *.c  //打包以.c结尾的文件
ar: 正在创建 two.bak
a - a.c
a - b.c
a - c.c
a - d.c

3、显示打包文件的内容

[root@localhost ~]# ar t two.bak
a.c
b.c
c.c
d.c

4、删除打包文件的成员文件

[root@localhost ~]# ar d two.bak a.c b.c c.c
[root@localhost ~]# ar t two.bak
d.c

arj 命令

说明

arj 命令.arj 格式的压缩文件的管理器,用于创建和管理 .arj 压缩包。

语法

arj [参数]

参数

  • 操作指令:对 .arj 压缩包执行的操作指令
  • 压缩包名称:指定要操作的 arj 压缩包名称

arp 命令

说明

arp 命令 用于操作主机的 arp 缓冲区,它可以显示 arp 缓冲区中的所有条目、删除指定的条目或者添加静态的 ip地址与 MAC 地址对应关系。

语法

arp [选项] [主机]

选项

-a<主机>:显示 arp 缓冲区的所有条目
-H<地址类型>:指定 arp 指令使用的地址类型
-d<主机>:从 arp 缓冲区中删除指定主机的 arp 条目
-D:使用指定接口的硬件地址
-e:以 Linux 的显示风格显示 arp 缓冲区中的条目
-i<接口>:指定要操作 arp 缓冲区的网络接口
-s<主机><MAC地址>:设置指定的主机的 IP 地址与 MAC 地址的静态映射
-n:以数字方式显示 arp 缓冲区中的条目
-v:显示详细的 arp 缓冲区条目,包括缓冲区条目的统计信息
-f<文件>:设置主机的 IP 地址与 MAC 地址的静态映射

参数

主机:查询 arp 缓冲区中指定主机的 arp 条目

实例

[root@localhost ~]# arp -v
Address                  HWtype  HWaddress           Flags Mask            Iface
192.168.0.134            ether   00:21:5E:C7:4D:88   C                     eth1
115.238.144.129          ether   38:22:D6:2F:B2:F1   C                     eth0
Entries: 2      Skipped: 0      Found: 2

as 命令

说明

as 命令GNU 组织推出的一款汇编语言编译器,它支持多种不同类型的处理器。

语法

as [选项] [汇编文件]

选项

-ac:忽略失败条件
-ad:忽略调试指令
-ah:包括高级源
-al:包括装配
-am:包括宏扩展
-an:忽略形式处理
-as:包括符号
=file:设置列出文件的名字
--alternate:以交互宏模式开始
-f:跳过空白和注释预处理
-g:产生调试信息
-J:对于有符号溢出不显示警告信息
-L:在符号表中保留本地符号
-o:指定要生成的目标文件
--statistics:打印汇编所用的最大空间和总时间

参数

汇编文件:指定要汇编的源文件

at 命令

说明

at 命令用于在指定时间执行命令。

它能够接受在当天的 hh:mm(小时:分钟)式的时间指定;也能够使用 midnight(深夜)、noon(中午)、teatime(饮茶时间 ,一般是下午 4 点)等比较模糊的词语来指定时间。at 命令还支持采用 12 小时计时制,即在时间后 面加上 AM(上午)或 PM(下午)来说明是上午还是下午;也能够指定命令执行的具体日期,指定格式为 month day(月 日)或 mm/dd/yy(月/日/年)或 dd.mm.yy(日.月.年)。指定的日期必须跟在指定时间的后面。

上面介绍的都是绝对计时法,我们还可以使用相对计时法,这对于安排不久就要执行的命令是很有用的。

相对计时法格式为:now + count time-units。其中,now 指当前时间,time-units 是时间单位,这里可以是 minutes(分钟)、hours(小时)、days(天)、weeks(星期)。count 表示时间的数量(几天?几小时?几分钟?)。

另外还有一种计时方法就是直接使用 today(今天)、tomorrow(明天)来 指定完成命令的时间。

语法

at [选项] [日期时间]

选项

-f:指定包含具体指令的任务文件
-q:指定新任务的队列名称
-l:显示待执行任务的列表
-d:删除指定的待执行任务
-m:任务执行完成后向用户发送 E-mail

参数

日期时间:指定任务执行的日期时间

实 例

1、三天后的下午 5 点钟执行 /bin/ls 命令:

[root@localhost ~]# at 5pm+3 days
at> /bin/ls
at> <EOT>
job 7 at 2013-01-08 17:00

2、明天 17 点钟,输出时间到指定文件内:

[root@localhost ~]# at 17:20 tomorrow
at> date >/root/2013.log
at> <EOT>
job 8 at 2013-01-06 17:20

计划任务设定后,在没有执行之前我们可以用 atq 命令来查看系统没有执行工作任务:

[root@localhost ~]# atq
8       2013-01-06 17:20 a root
7       2013-01-08 17:00 a root

3、删除已经设置的任务:

[root@localhost ~]# atq
8       2013-01-06 17:20 a root
7       2013-01-08 17:00 a root

[root@localhost ~]# atrm 7
[root@localhost ~]# atq
8       2013-01-06 17:20 a root

4、显示已经设置的任务内容:

[root@localhost ~]# at -c 8
#!/bin/sh
# atrun uid=0 gid=0
# mail     root 0
umask 22 此处省略 n 个字符
date >/root/2013.log

atq 命令

说明

atq 命令显示系统中待执行的任务列表,也就是列出当前用户的 at 任务列表。

语法

atq [选项]

选项

-V:显示版本号
-q:查询指定队列的任务

实例

at now + 10 minutes
at> echo 1111
at> <eot>
job 3 at Fri Apr 26 12:56:00 2020

atq
3       Fri Apr 26 12:56:00 2020 a root

awk 命令

说明

awk 是一种编程语言,用于在 Linux/Unix下对文本和数据进行处理。数据可以来自标准输入(stdin)、一个或多个文件,或其它命令的输出。它支持用户自定义函数和动态正则表达式等先进功能,是 Linux/Unix 下的一个强大编程工具。它在命令行中使用,但更多是作为脚本来使用。

有很多内建的功能,比如数组、函数等,这是它和 C 语言的相同之处,灵活性是 awk 最大的优势。

语法

awk [options] 'script' var=value file(s)
awk [options] -f scriptfile var=value file(s)

选项

  • -F fsfs 指定输入分隔符,fs 可以是字符串或正则表达式,如 -F:
  • -v var=value 赋值一个用户定义变量,将外部变量传递给 awk
  • -f scripfil 从脚本文件中读取 awk 命令
  • -m[fr] val 对 val 值设置内在限制,-mf 选项 限制分配给 val 的最大块数目;-mr 选项限制记录的最大数目。这两个功能是 Bell 实 验室版 awk 的扩展功能,在标准 awk 中不适用。

awk 模式

awk脚本是由模式和操作组成的。

模式可以是以下任意一个:

  • /正则表达式/:使用通配符的扩展集。
  • 关系表达式:使用运算符进行操作,可以是字符串或数字的比较测试。
  • 模式匹配表达式:用运算符~(匹配)和!~(不匹配)。
  • BEGIN语句块、pattern语句块、END语句块:参见awk的工作原理

awk 操作

操作由一个或多个命令、函数、表达式组成,之间由换行符或分号隔开,并位于大括号内,主要部 分是:

  • 变量或数组赋值
  • 输出命令
  • 内置函数
  • 控制流语句

脚本基本结构

awk 'BEGIN{ print "start" } pattern{ commands } END{ print "end" }' file

一 个awk脚本通常由:BEGIN语句块、能够使用模式匹配的通用语句块、END语句块3部分组成,这三个部分是可选的。任意一个部分都可以不出现在脚本中,脚本通常是被 单引号双引号 中,例如:

awk 'BEGIN{ i=0 } { i++ } END{ print i }' filename
awk "BEGIN{ i=0 } { i++ } END{ print i }" filename

awk 的工作原理

awk 'BEGIN{ commands } pattern{ commands } END{ commands }'
  • 第一步:执行BEGIN{ commands }语句块中 的语句;
  • 第二步:从文件或标准输入(stdin)读取一行,然后执行pattern{ commands }语句块,它逐行扫描文件,从第一行到最后一行重复这个过程,直到文件全部被读取完毕。
  • 第三步:当读至输入流 末尾时,执行END{ commands }语句块。

BEGIN 语句块 在awk开始从输入流中读取行 之前 被执行,这是一个可选的语句块,比如变量初始化、打印输出表格的表头等语 句通常可以写在BEGIN语句块中。

END 语句块 在awk从输入流中读取完所有的行 之后 即被执行,比如打印所有行的分析结果这类信息汇总都是在END语句块中完成,它也是一个可选语句块。

pattern 语句块 中的通用命令是最重要的部分,它也是可选的。如果没有提供pattern语句 块,则默认执行{ print },即打印每一个读取到的行,awk读取的每一行都会执行该语句块。

示例

echo -e "A line 1nA line 2" | awk 'BEGIN{ print "Start" } { print } END{ print "End" }'
Start
A line 1
A line 2
End

当使用不带参数的print时,它就打印当前行,当print的参数是以逗号进行分隔时,打印时则以空格作为定界符。在awk的print语句块中双引号是被当作拼接符使用,例如:

echo | awk '{ var1="v1"; var2="v2"; var3="v3"; print var1,var2,var3; }'
v1 v2 v3

双引号拼接使用:

echo | awk '{ var1="v1"; var2="v2"; var3="v3"; print var1"="var2"="var3; }'
v1=v2=v3

{ }类似一个循环体,会对文件中的每一行进行迭代,通常变量初始化语句(如:i=0)以及打印文 件头部的语句放入BEGIN语句块中,将打印的结果等语句放在END语句块中。

awk 内置变量(预定义变量)

说明:[A][N][P][G]表示第一个支持变量的工具,[A]=awk、[N]=nawk、[P]=POSIXawk、[G]=gawk

 **$n**  当前记录的第n个字段,比如n为1表示第一个字段,n为2表示第二个字段。
 **$0**  这个变量包含执行过程中当前行的文本内容。
[N]  **ARGC**  命令行参数的数目。
[G]  **ARGIND**  命令行中当前文件的位置(从0开始算)。
[N]  **ARGV**  包含命令行参数的数组。
[G]  **CONVFMT**  数字转换格式(默认值为%.6g)。
[P]  **ENVIRON**  环境变量关联数组。
[N]  **ERRNO**  最后一个系统错误的描述。
[G]  **FIELDWIDTHS**  字段宽度列表(用空格键分隔)。
[A]  **FILENAME**  当前输入文件的名。
[P]  **FNR**  同NR,但相对于当前文件。
[A]  **FS**  字段分隔符(默认是任何空格)。
[G]  **IGNORECASE**  如果为真,则进行忽略大小写的匹配。
[A]  **NF**  表示字段数,在执行过程中对应于当前的字段数。
[A]  **NR**  表示记录数,在执行过程中对应于当前的行号。
[A]  **OFMT**  数字的输出格式(默认值是%.6g)。
[A]  **OFS**  输出字段分隔符(默认值是一个空格)。
[A]  **ORS**  输出记录分隔符(默认值是一个换行符)。
[A]  **RS**  记录分隔符(默认是一个换行符)。
[N]  **RSTART**  由match函数所匹配的字符串的第一个位置。
[N]  **RLENGTH**  由match函数所匹配的字符串的长度。
[N]  **SUBSEP**  数组下标分隔符(默认值是34)。

示例

echo -e "line1 f2 f3\nline2 f4 f5\nline3 f6 f7" | awk '{print "Line No:"NR", No of fields:"NF, "$0="$0, "$1="$1, "$2="$2, "$3="$3}'
Line No:1, No of fields:3 $0=line1 f2 f3 $1=line1 $2=f2 $3=f3
Line No:2, No of fields:3 $0=line2 f4 f5 $1=line2 $2=f4 $3=f5
Line No:3, No of fields:3 $0=line3 f6 f7 $1=line3 $2=f6 $3=f7

使用print $NF可以打印出一行中的最后一个字段,使用$(NF-1)则是打印倒数第二个字段,其他以此类推:

echo -e "line1 f2 f3n line2 f4 f5" | awk '{print $NF}'
f3
f5
echo -e "line1 f2 f3n line2 f4 f5" | awk '{print $(NF-1)}'
f2
f4

打印每一行的第二和第三个字段:

awk '{ print $2,$3 }' filename

统计文件中的行数 :

awk 'END{ print NR }' filename

以上命令只使用了END语句块,在读入每一行的时,awk会将NR更新为对应的行号,当到达最后一行NR的值就是最后一行的行号,所以END语句块中的NR就是文件的行数。

一个每一行中第一个字段值累加的例子:

seq 5 | awk 'BEGIN{ sum=0; print "总和:" } { print $1"+"; sum+=$1 } END{ print "等于"; print sum }'
总和:
1+
2+
3+
4+
5+
等于
15

将外部变量值传递给 awk

借助 -v选项 ,可以将外部值(并非来自stdin)传递给awk:

VAR=10000
echo | awk -v VARIABLE=$VAR '{ print VARIABLE }'

另一种传递外部变量方法:

var1="aaa"
var2="bbb"
echo | awk '{ print v1,v2 }' v1=$var1 v2=$var2

当输入来自于文件时使用:

awk '{ print v1,v2 }' v1=$var1 v2=$var2 filename

以上方法中,变量之间用空格分隔作为awk的命令行参数跟随在BEGIN、{}和END语句块之后。

查找进程 pid

netstat -antup | grep 7770 | awk '{ print $NF NR}' | awk '{ print $1}'

awk 运算与判断

作为一种程序设计语言所应具有的特点之一,awk支持多种运算, 这些运算与C语言提供的基本相同。awk还提供了一系列内置的运算函数(如log、sqr、cos、sin等)和一些用于对字符串进行操作(运算)的函数(如length、substr等等)。这些函数的引用大大的提高了awk的运算功能。作为对条件转 移指令的一部分,关系判断是每种程序设计语言都具备的功能,awk也不例外,awk中允许进行多种测试,作为样式匹配,还提供了模式匹配表达式~(匹配)和!~(不匹配)。作为对测试的一种扩充,awk也支持用逻辑运算符。

算术运算符

运算符描述
+ -加, 减
* / &乘,除与求余
+ - !一元加,减和逻辑非
^ ***求幂
++ --增加或减少,作为前缀或后缀

例:

awk 'BEGIN{a="b";print a++,++a;}'
0 2

注意:所有用作算术运算符进行操作,操作数自动转为数值,所有非数值都变为0

赋值运算符

运算符描述
= += -= *= /= %= ^= **=赋值语句

例:

a+=5; 等价于:a=a+5; 其它同类

逻辑运算符

运算符描述
\|\|逻辑或
&&逻辑与

例:

awk 'BEGIN{a=1;b=2;print (a>5 && b<=2),(a>5 || b<=2);}'
0 1

正则运算符

运算符描述
~ !~匹配正则表达式和不匹配正则表达式

例:

awk 'BEGIN{a="100testa";if(a ~ /^100*/){print "ok";}}'
ok

关系运算符

运算符描述
< <= > >= != ==关系运算符

例:

awk 'BEGIN{a=11;if(a >= 9){print "ok";}}'
ok

注意:> < 可以作为字符串比较,也可以用作数值比较,关键看操作数如果是字符串就会转换为字 符串比较。两个都为数字才转为数值比较。字符串比较:按照ASCII码顺序比较。

其它运算符

运算符描述
$字段引用
空格字符串连接符
?:C条件表达式
in数组中是否存在某键值

例:

awk 'BEGIN{a="b";print a=="b"?"ok":"err";}'
ok
awk 'BEGIN{a="b";arr[0]="b";arr[1]="c";print (a in arr);}'
0
awk 'BEGIN{a="b";arr[0]="b";arr["b"]="c";print (a in arr);}'
1

运算级优先级表

级别越高越优先

awk 高级输入输出

读取下一条记录

awk中next语句使用:在循环逐行匹配,如果遇到next,就会跳过当前行,直接忽略下面语句。而进行下一行匹配。next语句一般用于多行合并:

cat text.txt
a
b
c
d
e

awk 'NR%2==1{next}{print NR,$0;}' text.txt
2 b
4 d

当记录行号除以2余1,就跳过当前行。下面的print NR,$0也不会执行。下一行开始,程序有开始判断NR%2值。这个时候记录行号是:2 ,就会执行下面语句块:'print NR,$0'

分析发现需要将包含有“web”行进行跳过,然后需要将内容与下面行合并为一行:

cat text.txt
web01[192.168.2.100]
httpd            ok
tomcat               ok
sendmail               ok
web02[192.168.2.101]
httpd            ok
postfix               ok
web03[192.168.2.102]
mysqld            ok
httpd               ok
0
awk '/^web/{T=$0;next;}{print T":t"$0;}' test.txt
web01[192.168.2.100]:   httpd            ok
web01[192.168.2.100]:   tomcat               ok
web01[192.168.2.100]:   sendmail               ok
web02[192.168.2.101]:   httpd            ok
web02[192.168.2.101]:   postfix               ok
web03[192.168.2.102]:   mysqld            ok
web03[192.168.2.102]:   httpd               ok

简单地读取一条记录

awk getline用法:输出重定向需用到getline函数。getline从标准输入、管道或者当前正在处理的文件之外的其 他输入文件获得输入。它负责从输入获得下一行的内容,并给NF,NR和FNR等内建变量赋值。如果得到一条记录,getline函数返回1,如果到达文件的末尾就返回0,如果出现错误,例如打开文件失败,就返回-1。

getline语法:getline var,变量var包含了特定行的内容。

awk getline从整体上来说,用法说明:

  • 当其 左右无重定向符|<时: getline作用于当前文件,读入当前文件的第一行给其后跟的变量var$0(无变量),应该注意到,由于awk在处理getline之前已经读入 了一行,所以getline得到的返回结果是隔行的。
  • 当其左右有重定向符|<时: getline则作用于定向输入文件,由于该文件是刚打开,并没有被awk读入一行,只是getline读入,那么getline返回的是该文件的第一行,而不是隔行。

示例:

执行 Linux 的date命令,并通过管道输出给getline,然后再把输出赋值给自定义变量out,并打印 它:

awk 'BEGIN{ "date" | getline out; print out }' test

执行shell的date命令,并通过管道输出给getline,然后getline从管道中读取并将输入赋值给out,split函数把变量out转化成数组mon,然后打印数组mon的第二个元素:

awk 'BEGIN{ "date" | getline out; split(out,mon); print mon[2] }' test

命令ls的输出传递给geline作为输入,循环使getline从ls的输出中读取一行,并把它打印到屏幕。这里没有输入文件 ,因为BEGIN块在打开输入文件前执行,所以可以忽略输入文件。

awk 'BEGIN{ while( "ls" | getline) print }'

关闭文件

awk 中允许在程序中关闭一个输入或输出文件,方法是使用 awk 的 close 语句。

close("filename")

filename可以是getline打开的文件,也可以是stdin,包含文件名的变量或者getline使用的确切命令。或一个输出文件,可以是stdout,包含文件名的变量或使用管道的确切命令。

输出到 一个文件

awk 中允许用如下方式将结果输出到一个文件:

echo | awk '{printf("hello word!n") > "datafile"}'
或
echo | awk '{printf("hello word!n") >> "datafile"}'

设置字段定界符

默认的字段定界 符是空格,可以使用-F "定界符" 明确指定一个定界符:

awk -F: '{ print $NF }' /etc/passwd
或
awk 'BEGIN{ FS=":" } { print $NF }' /etc/passwd

BEGIN语句块中则可以用OFS=“定界符”设置输出字段的定界符。

流程控制语句

在linux awk的while、do-while和for语句中允许使用break,continue语句来控制流程走向,也允许使用exit这样的语句来退出。break中断当前正在执行的循环并 跳到循环外执行下一条语句。if 是流程选择用法。awk中,流程控制语句,语法结构,与c语言类型。有了这些语句, 其实很多shell程序都可以交给awk,而且性能是非常快的。下面是各个语句用法。

条件判断语句

if(表达式)
  语句1
else
  语句2

格式中语句1可以是多个语句,为了方便判断和阅读,最好将多个语句用{}括起来。awk分枝结构允许嵌套,其格式为:

if(表达式)
  {语句1}
else if(表达式)
  {语句2}
else
  {语句3}

示例:

awk 'BEGIN{
test=100;
if(test>90){
  print "very good";
  }
  else if(test>60){
    print "good";
  }
  else{
    print "no pass";
  }
}'

very good

每条命令语句后面可以用;分号 结尾。

循环语句

while 语句

while(表达式)
  {语句}

示例:

awk 'BEGIN{
test=100;
total=0;
while(i<=test){
  total+=i;
  i++;
}
print total;
}'
5050

for 循环

for循环有两种格式:

格式1:

for(变量 in 数组)
  {语句}

示例:

awk 'BEGIN{
for(k in ENVIRON){
  print k"="ENVIRON[k];
}

}'
TERM=linux
G_BROKEN_FILENAMES=1
SHLVL=1
pwd=/root/text
...
logname=root
HOME=/root
SSH_CLIENT=192.168.1.21 53087 22

注:ENVIRON是awk常量,是子典型数组。

格式2:

for(变量;条件;表达式)
  {语句}

示例:

awk 'BEGIN{
total=0;
for(i=0;i<=100;i++){
  total+=i;
}
print total;
}'
5050

do 循环

do
{语句} while(条件)

例子:

awk 'BEGIN{
total=0;
i=0;
do {total+=i;i++;} while(i<=100)
  print total;
}'
5050

其他语句

  • break 当 break 语句用于 while 或 for 语句时,导致退出程序循环。
  • continue 当 continue 语句用于 while 或 for 语句时, 使程序循环移动到下一个迭代。
  • next 能能够导致读入下一个输入行,并返回到脚本的顶 部。这可以避免对当前输入行执行其他的操作过程。
  • exit 语句使主输入循环退出并将控 制转移到END,如果END存在的话。如果没有定义END规则,或在END中应用exit语句,则终止脚本的执行。

数组应用

数组是 awk 的灵魂,处理文本中最不能少的就是它的数组处理。因为数组索引(下标)可以是数字和字符串在awk中数组叫做关联数组(associative arrays)。awk 中的数组不必提前声明,也不必声明大小。数组元素 用0或空字符串来初始化,这根据上下文而定。

数组的定义

数字做数组索引(下标):

Array[1]="sun"
Array[2]="kai"

字符串做数组索引(下标):

Array["first"]="www"
Array"[last"]="name"
Array["birth"]="1987"

使用中print Array[1]会打印出sun;使用print Array[2]会打印出kai;使用print["birth"]会得到1987。

读取数组的值

{ for(item in array) {print array[item]}; }       #输出的顺序是随机的
{ for(i=1;i<=len;i++) {print array[i]}; }         #Len是数组的长度

数组相关函数

得到数组长度:

awk 'BEGIN{info="it is a test";lens=split(info,tA," ");print length(tA),lens;}'
4 4

length返回字符串以及数组长度,split进行分割字符串为数组,也会返回分割得到数组长度。

awk 'BEGIN{info="it is a test";split(info,tA," ");print asort(tA);}'
4

asort对数组进行排序,返回数组长度。

输出数组内容(无序,有序输出):

awk 'BEGIN{info="it is a test";split(info,tA," ");for(k in tA){print k,tA[k];}}'
4 test
1 it
2 is
3 a 

for…in输出,因为数组是关联数组,默认是无序的。所以通过for…in得 到是无序的数组。如果需要得到有序数组,需要通过下标获得。

awk 'BEGIN{info="it is a test";tlen=split(info,tA," ");for(k=1;k<=tlen;k++){print k,tA[k];}}'
1 it
2 is
3 a
4 test

注意:数组下标是从1开始,与C数组不一样。

判断键值存在以及删除键值:

#错误的判断方法:
awk 'BEGIN{tB["a"]="a1";tB["b"]="b1";if(tB["c"]!="1"){print "no found";};for(k in tB){print k,tB[k];}}'
no found
a a1
b b1
c

以上出现奇怪问题,tB[“c”]没有定义,但是循环时候,发现已经存在该键值,它的值为空,这里需要注意,awk数组是关联数组,只要通过数组引用它的key,就会自动创建改序列。

#正确判断方法:
awk 'BEGIN{tB["a"]="a1";tB["b"]="b1";if( "c" in tB){print "ok";};for(k in tB){print k,tB[k];}}'
a a1
b b1

if(key in array)通过这种方法判断数组中是否包含key键值。

#删除键值:
awk 'BEGIN{tB["a"]="a1";tB["b"]="b1";delete tB["a"];for(k in tB){print k,tB[k];}}'
b b1

delete array[key]可以删除,对应数组key的,序列值。

二维、 多维数组使用

awk 的多维数组在本质上是一维数组,更确切一点,awk在存储上并不支持多维数组。awk提供了逻辑上模拟二维数组的访问方式。例如,array[2,4]=1这样的访问是允许的。awk使用一个特殊的字符串SUBSEP(�34)作为分割字段,在上面的例子中,关联数组array存储的键值实际上是2�344。

类 似一维数组的成员测试,多维数组可以使用if ( (i,j) in array)这样的语法,但是下标必须放置在圆 括号中。类似一维数组的循环访问,多维数组使用for ( item in array )这样的语法遍历数组。与一维数组不同的是,多维数组必须使用split()函数来访问单独的下标分量。

awk 'BEGIN{
for(i=1;i<=9;i++){
  for(j=1;j<=9;j++){
    tarr[i,j]=i*j; print i,"*",j,"=",tarr[i,j];
  }
}
}'
1 * 1 = 1
1 * 2 = 2
1 * 3 = 3
1 * 4 = 4
1 * 5 = 5
1 * 6 = 6
...
9 * 6 = 54
9 * 7 = 63
9 * 8 = 72
9 * 9 = 81

可以通过array[k,k2]引用获得数组内容。

另一种方法:

awk 'BEGIN{
for(i=1;i<=9;i++){
  for(j=1;j<=9;j++){
    tarr[i,j]=i*j;
  }
}
for(m in tarr){
  split(m,tarr2,SUBSEP); print tarr2[1],"*",tarr2[2],"=",tarr[m];
}
}'

内置函数

awk 内置函数,主要分以下 3 种类似:算数函数、字符串函数、其它一般函数、时间 函数。

算术函数

格式描述
atan2( y, x )返回 y/x 的反正切。
cos( x )返回 x 的余弦;x 是弧度。
sin( x )返回 x 的正弦;x 是弧度。
exp( x )返回 x 幂函数。
log( x )返回 x 的自然对数。
sqrt( x )返回 x 平方根。
int( x )返回 x 的截断至整数的值。
rand( )返回任意数 字 n,其中 0 <= n < 1。
srand( [expr] )将 rand 函数的种子值设置为 Expr 参数的值,或如果省略 Expr 参数则使用某天的时间。返回先前的种子值。

举例说明 :

awk 'BEGIN{OFMT="%.3f";fs=sin(1);fe=exp(10);fl=log(10);fi=int(3.1415);print fs,fe,fl,fi;}'
0.841 22026.466 2.303 3

OFMT 设置输出数据格式是保留3位小数。

获得随机数:

awk 'BEGIN{srand();fr=int(100*rand());print fr;}'
78
awk 'BEGIN{srand();fr=int(100*rand());print fr;}'
31
awk 'BEGIN{srand();fr=int(100*rand());print fr;}'
41 

字符串函数

格式描述
gsub( Ere, Repl, [ In ] )除了正则表达式所有具体值被替代这点,它和 sub 函数完全一样地执行。
sub( Ere, Repl, [ In ] )用 Repl 参数指定的字符串替换 In 参数指定的字符串中的由 Ere 参 数指定的扩展正则表达式的第一个具体值。sub 函数返回替换的数量。出现在 Repl 参数指定的字符串中的 &(和符号)由 In 参数指定的与 Ere 参数的指定的扩展正则表达式匹配的字符串替换。如果未指定 In 参数,缺省值是整 个记录($0 记录变量)。
index( String1, String2 )在由 String1 参数指定的字符串(其中有出现 String2 指定的参数)中,返回位置,从 1 开始编号。如果 String2 参数不在 String1 参数中出现,则返回 0(零)。
length [(String)]返回 String 参数指定的字符串的长度(字符形式)。如果未给出 String 参数,则返回整个记录的长度($0 记录变量)。
blength [(String)]返回 String 参数指定的字符串的长度(以字节为单位)。如果未给出 String 参数,则返回整个记录的长度($0 记录变量)。
substr( String, M, [ N ] )返回具有 N 参数指定的字符数量子串。 子串从 String 参数指定的字符串取得,其字符以 M 参数指定的位置开始。M 参数指定为将 String 参数中的第一个 字符作为编号 1。如果未指定 N 参数,则子串的长度将是 M 参数指定的位置到 String 参数的末尾 的长度。
match( String, Ere )在 String 参数指定的字符串(Ere 参数指定的扩展正则表达式出现在其中)中返回位置(字符形式),从 1 开始编号,或如果 Ere 参数不出现,则返回 0(零)。RSTART 特殊变量设置为 返回值。RLENGTH 特殊变量设置为匹配的字符串的长度,或如果未找到任何匹配,则设置为 -1(负一)。
split( String, A, [Ere] )将 String 参数指定的参数分割为数组元素 A[1], A[2], . . ., A[n] ,并返回 n 变量的值。此分隔可以通过 Ere 参数指定的扩展正则表达式进行,或用当前字段分隔符(FS 特殊变量) 来进行(如果没有给出 Ere 参数)。除非上下文指明特定的元素还应具有一个数字值,否则 A 数组中的元素用字符串值来创建。
tolower( String )返回 String 参数指定的字符串,字符串中每个大写字符将更改为小写。大写和小写的映射由当前语言环境的 LC_CTYPE 范畴定义。
toupper( String )返回 String 参数指定的字符串,字符串中每个小写字符将更改为大写。大写和小写的映射由当前语言环境的 LC_CTYPE 范畴定义。
sprintf(Format, Expr, Expr, . . . )根据 Format 参数指定的 printf 子例程格式字符串来格式化 Expr 参数指定的表达式并返回最后生成的字符串。

注:Ere都可以是正则表达式。

gsub,sub使用

awk 'BEGIN{info="this is a test2010test!";gsub(/[0-9]+/,"!",info);print info}'
this is a test!test!

在 info中查找满足正则表达式,/[0-9]+/””替换 ,并且替换后的值,赋值给info 未给info值,默认是$0

查找字符串(index使用)

awk 'BEGIN{info="this is a test2010test!";print index(info,"test")?"ok":"no found";}'
ok

未找到,返回0

正则表达式匹配查找(match使用)

awk 'BEGIN{info="this is a test2010test!";print match(info,/[0-9]+/)?"ok":"no found";}'
ok

截取字符串(substr使用)

[wangsl@centos5 ~]$ awk 'BEGIN{info="this is a test2010test!";print substr(info,4,10);}'
s is a tes

从第 4个 字符开始,截取10个长度字符串

字符串分割(split使用)

awk 'BEGIN{info="this is a test";split(info,tA," ");print length(tA);for(k in tA){print k,tA[k];}}'
4
4 test
1 this
2 is
3 a

分割info,动态创建数组tA,这里比较有意思,awk for …in循环,是一个无序的循环。 并不是从数组下标1…n ,因此使用时候需要注意。

格式化字符串输出(sprintf使用)

格式化字符串格式:

其中格式化字符串包括两部分内容:一部分是正常字符,这些字符将按原样输出; 另一部分是格式化规定字符,以"%"开始,后跟一个或几个规定字符,用来确定输出内容格式。

格式描述格式描述
%d十进制有符号整数%u十进制无符号整数
%f浮点数%s 字符串
%c单个字符%p指针的值
%e指数形式的浮点数%x%X 无符号以十六进制表示的整数
%o无符号以八进制表示的整数%g自动选择合适的表示法
awk 'BEGIN{n1=124.113;n2=-1.224;n3=1.2345; printf("%.2f,%.2u,%.2g,%X,%on",n1,n2,n3,n1,n1);}'
124.11,18446744073709551615,1.2,7C,174

一般函数

格式描述
close( Expression )用同一个带字符串值的 Expression 参数来关闭由 print 或 printf 语句打开的或调用 getline 函数打开的文件或管道。如果文件或管道成功关闭,则返回 0;其它情况 下返回非零值。如果打算写一个文件,并稍后在同一个程序中读取文件,则 close 语句是必需的。
system(command )执行 Command 参数指定的命令,并返回退出状态。等同于 system 子例程。
Expression \| getline [ Variable ]从来自 Expression 参数指定的命令的输出中 通过管道传送的流中读取一个输入记录,并将该记录的值指定给 Variable 参数指定的变量。如果当前未打开将 Expression 参数的值作为其命令名称的流,则创建流。创建的流等同于调用 popen 子例程,此时 Command 参数取 Expression 参数的值且 Mode 参数设置为一个是 r 的值。只要流保留打开且 Expression 参数求得同一个字符串,则对 getline 函数的每次后续调用读取另一个记录。如果未指定 Variable 参数,则 $0 记录变量和 NF 特殊变量设置为从流读取的记录。
getline [ Variable ] < Expression从 Expression 参数指定的文件读 取输入的下一个记录,并将 Variable 参数指定的变量设置为该记录的值。只要流保留打开且 Expression 参数对同一个字符串求值,则对 getline 函数的每次后续调用读取另一个记录。如果未指定 Variable 参数,则 $0 记录变量和 NF 特殊变量设置为从流读取的记录。
getline [ Variable ]将 Variable 参数指定的变量设置为从当前输入文件读取的下一个输入记录。如果未指定 Variable 参数,则 $0 记录变量设置为该记录的值,还将设置 NF、NR 和 FNR 特殊变量。

打开外部文件(close用法)

awk 'BEGIN{while("cat /etc/passwd"|getline){print $0;};close("/etc/passwd");}'
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin

逐行读取外部文件(getline使用方法)

awk 'BEGIN{while(getline < "/etc/passwd"){print $0;};close("/etc/passwd");}'
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
awk 'BEGIN{print "Enter your name:";getline name;print name;}'
Enter your name:
chengmo
chengmo

调用外部应用程序(system使用方法)

awk 'BEGIN{b=system("ls -al");print b;}'
total 42092
drwxr-xr-x 14 chengmo chengmo     4096 09-30 17:47 .
drwxr-xr-x 95 root   root       4096 10-08 14:01 ..

b返回值,是执行结果。

时间函数

格式描述
函数名说明
mktime( YYYY MM dd HH MM ss[ DST])生成时间格式
strftime([format [, timestamp]])格式化时间输出,将时间戳转为时间字符串具体格式,见下表。
systime()得到时间戳,返回从1970年1月1日开始到当前时间(不计闰年)的整秒数

建指定时间(mktime使用)

awk 'BEGIN{tstamp=mktime("2001 01 01 12 12 12");print strftime("%c",tstamp);}'
2001年01月01日 星期一 12时12分12秒
awk 'BEGIN{tstamp1=mktime("2001 01 01 12 12 12");tstamp2=mktime("2001 02 01 0 0 0");print tstamp2-tstamp1;}'
2634468

求2个时间段中间时间差,介绍了strftime使用方法

awk 'BEGIN{tstamp1=mktime("2001 01 01 12 12 12");tstamp2=systime();print tstamp2-tstamp1;}'
308201392

strftime日期和时间格式说明符

格式描述
%a星期几的缩写(Sun)
%A星期几的完整写法(Sunday)
%b月名的缩写(Oct)
%B月名的完整写法(October)
%c本地日期和时间
%d十进制日期
%D日期 08/20/99
%e日期,如果只有一位会补上一个空格
%H用十进制表示24小时格式的小时
%I用十进制表示12小时格式的小时
%j从1月1日起一年中的第几天
%m十进制表示的月份
%M十进制表示的分钟
%p12小时表示法(AM/PM)
%S十进制表示的秒
%U十进制表示的一年中的第几个星期(星期天作为一个星期的开始)
%w十进制表示的星期几(星期天是0)
%W十进制表示的一年中 的第几个星期(星期一作为一个星期的开始)
%x重新设置本地日期(08/20/99)
%X重新设置本地时间(12:00:00)
%y两位数字表示的年(99)
%Y当前月份
%%百分号(%)

bc 命令

说明

bc 命令是一种支持任意 精度的交互执行的计算器语言。bash 内置了对整数四则运算的支持以及提供了进制转换的功能,但是并不支持浮点运算,而 bc 命令可以很方便的进行浮点运算( 当然也支持整数运算)。

语法

bc [选项] [文件]

选项

-i:强制进入交互式模式
-l:定义使用的标准数学库
-w:对 POSIX bc 的扩展给出警告信息
-q:不打印正常的 GNU bc 环境信息
-v:显示指令版本信息
-h:显示指令的帮助信息

参数

文件:指定包含计算任务的文件

实例

1、算术操作高级运算

bc 命令它可以执行浮点运算和一些高级函数:

echo "1.212*3" | bc
3.636

2、设定小数精度(数值范围)

echo "scale=2;3/8" | bc
0.37

参数 scale=2 是将 bc 输出结果的小数位设置为 2 位。

3、进制转换

#!/bin/bash
abc=192
echo "obase=2;$abc" | bc

执行结果为:11000000,这是用 bc 命令将十进制 转换成二进制(本站还提供了在线进制转换工具)。

#!/bin/bash
abc=11000000
echo "obase=10;ibase=2;$abc" | bc

执行结果为:192,这是用 bc 命令将二 进制转换为十进制。

4、计算平方和平方根

echo "10^10" | bc
echo "sqrt(100)" | bc

bg 命令

说明

bg 命令用于将任务放 到后台运行,使前台可以执行其他任务。该命令的运行效果与在指令后面添加符号 & 的效果一样,都是将其放到系统后台执行。

在 Linux 系统中执行某些操作时候,有时需要将当前任务暂停调至后台,或者有时需要将后台暂停的任务重启开启并调至前台,这一序列的操作将会使用到 jobsbg、 和 fg 三个命令以及两个快捷键来完成。

语法

bg [作业标识]

参数

作业标识:指定需要放到后台的作业标识号

实例

使用 bg 命令将任务号为 1 的任务放到后台继续执行,输入如下命令:

# 后台执行任务号为 1 的任务
[root@localhost ~]$ bg 1

如果系统中只有一个挂起的任务时,即使不为该命令设置参数 1,效果也是一样的。

补充说明

实际上,使用 bg 命令与在指令后面添加 & 符号的效果是一样的。例如,使用 &find / -name password 放到后台执 行,我们可以输入如下命令:

# 在后台执行 find 命令
[root@localhost ~]$ find / -name password &

bind 命令

说明

bind 命令用于显示和设置命令行的键盘序列绑定功能。通过这一命令,可以提高命令行中操作效率。您可以利用 bind 命令了解有哪些按键组合与其功能,也可以自行指定要用哪些按键组合。

语法

bind [选项]

选项

-d:显示按键配置的内容
-f<按键配置文件>:载入指定的按键配置文件
-l:列出所有的功能
-m<按键配置>:指定按键配置
-q<功能>:显示指定功能的按键
-v:列出目前的按键配置与其功能

实例

bind -x '"\C-l":ls -l'    # 直接按 CTRL+L 就列出目录

其中 keyseq 可以使用 showkey -a 命令来获取:

[root@localhost ~]# showkey -a

Press any keys - Ctrl-D will terminate this program

^[[A     27 0033 0x1b  上
         91 0133 0x5b
         65 0101 0x41
^[[B     27 0033 0x1b  下
         91 0133 0x5b
         66 0102 0x42
^[[D     27 0033 0x1b  左
         91 0133 0x5b
         68 0104 0x44
^[[C     27 0033 0x1b  右
         91 0133 0x5b
         67 0103 0x43
         32 0040 0x20
^M       13 0015 0x0d 字母 M
^C        3 0003 0x03 Ctrl-C
^D        4 0004 0x04 Ctrl-D 退出

bye 命令

说明

bye 命令 用于中断 FTP 连线并结束程序。。

bye命令 在 ftp 模式下,输入 bye 即可中断目前的连线作业,并结束 ftp 的执行。

语法

bye

实例

bye

cal 命令

说明

cal 命令用于显示当前日历,或者指定日期的日历。

语法

cal[选项][参数]

选项

-l:显示单月输出
-3:显示临近三个月的日历
-s:将星期日作为月的第一天
-m:将星期一作为月的第一天
-j:显示 julian 日期
-y:显示当前年的日历

参数

月:指定月份;
年:指定年份。

实例

单独执行cal命令会打印出日历:

[root@localhost ~]# cal
    十二月 2013
日 一 二 三 四 五 六
 1  2  3  4  5  6  7
 8  9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
[root@localhost ~]# cal -j
        十二月 2013
  日   一   二   三   四   五   六
335 336 337 338 339 340 341
342 343 344 345 346 347 348
349 350 351 352 353 354 355
356 357 358 359 360 361 362
363 364 365
[root@localhost ~]# cal -3
    十一月 2013           十二月 2013            一月 2014
日 一 二 三 四 五 六  日 一 二 三 四 五 六  日 一 二 三 四 五 六
                1  2   1  2  3  4  5  6  7            1  2  3  4
 3  4  5  6  7  8  9   8  9 10 11 12 13 14   5  6  7  8  9 10 11
10 11 12 13 14 15 16  15 16 17 18 19 20 21  12 13 14 15 16 17 18
17 18 19 20 21 22 23  22 23 24 25 26 27 28  19 20 21 22 23 24 25
24 25 26 27 28 29 30  29 30 31              26 27 28 29 30 31

cat 命令

说明

cat 命令,是把文件内容输出到标准输出设备上的命令,cat经常用来快速显示文件的内容(而不用打开文件)。

注意:当对体积较大的文件使用 cat 命令时,文本会在屏幕上迅速闪过(滚屏),用户往往看不清所显示的内容。因此,一般用 more 等命令让文件内容分屏显示。为了控制滚屏,可以按 Ctrl + S 组合键停止滚屏;按 Ctrl + Q 键恢复滚屏;按 Ctrl + C(中断)键可以终止该命令的执行,并且返回 Shell 提示符状态。

语法

cat [选项] [文件名...]

选项

-n或-number:由 1 开始对所有输出的行数编号
-b或--number-nonblank:和 -n 相似,只不过对于空白行不编号
-s或--squeeze-blank:当遇到有连续两行以上的空白行,就代换为一行的空白行
-A:显示不可打印字符,行尾显示 $
-e:等价于 -vE 选项
-t:等价于 -vT 选项

参数

文件名:指定要连接的文件名,可以列出多个

实例

假设 file1file2 是当前目录下的两个文件:

# 在屏幕上显示文件 file1 的内容
cat file1

# 同时显示文件 file1 和 file2 的内容
cat file1 file2

# 将文件 file1 和 file2 合并后放入文件 file 中
cat file1 file2 > file

cd 命令

说明

cd 命令用来切换工 作目录至 dirname。 其中 dirname 可以是绝对路径或相对路径。若目录名称省略,则切换至使用者的主目录(home directory),即用户刚登录时所在的目录。其中:

  • ~ 表示为 home directory
  • . 表示当前所在的目录
  • .. 表示当前目录的上一级目录
  • - 表示进入当前目录之前的目录

语法

cd [选项] [目录名]

选项

-p 如 果要切换到的目标目录是一个符号连接,直接切换到符号连接指向的目标目录
-L 如果要切换的目标目录是一个符号的连接,直接切换到字符连接名代表的目录,而非符号连接所指向的目标目录
- 当仅使用 - 选项时,当前工作目录将被切换到环境变量 OLDPWD 所表示的目录

参数

目录名:要进入的目录名称;也可以是 ~...- 等目录标识。

实例

# 进入用户主目录
cd

# 进入用户主目录
cd ~

# 返回进入此目录之前所在的目录
cd -

# 返回上级目录(若当前目录为 /,则执行完后仍然在 / 目录)
cd ..

# 返回上两级目录
cd ../..

# 把上个命令的参数作为 cd 参数使用
cd !$

chfn 命令

说明

chfn 命令 用来改变 finger 命令显示的信息。这些信息都存放在 /etc 目录里的 passwd 文件里。若不指定任何选项,则 chfn 命令会进入问答式界面。

语法

chfn [选项][参数]

选项

-f<真实姓名>或--full-name<真实姓名>:设置真实姓名
-h<家中电话>或--home-phone<家中电话>:设置家中的电话号码
-o<办公地址>或--office<办公地址>:设置办公室的地址
-p<办公电话>或--office-phone<办公电话>:设置办公室的电话号码
-u或--help:在线帮助
-v或-version:显示版本信息

参数

用户名:指定要改变finger信息的用户名。

实例

范例 1:改变 finger 信息:

[root@localhost Desktop]# chfn
Changing finger information for root.
Name [root]: jack
Office []: hn
Office Phone []: 888888
Home Phone []: 9999999

Finger information changed.

范例 2:改变账号真实姓名:

[root@localhost Desktop]# chfn -f jack
Changing finger information for root.
Finger information changed.

范例 3:

shell>> chfn
Changing finger information for user
Password: [del]
Name[]:linuxde ### 提供 finger 时的资料
Office[]:NCCU
Office Phone[]: [del]
Home Phone[]: [del]

cmp 命令

说明

cmp 命令用来比较两个文件是否有差异。当相互比较的两个文件完全一样时,则该指令不会显示任何信息。若发现有差异,预设会标示出第一个不通之处的字符和列数编号。若不指定任何文件名称或是所给予的文件名为 -,则 cmp 指令会从标准输入设备读取数据。

语法

cmp [选项][参数]

选项

-c或--print-chars:除了标明差异处的十进制字码之外,一并显示该字符所对应字符
-i<字符数目>或--ignore-initial=<字符数目>:指定一个数目
-l或——verbose:标示出所有不一样的地方
-s或--quiet或——silent:不显示错误信息
-v或——version:显示版本信息
--help:在线帮助

参数

目录:比较两个文件的差异。

实例

使用 cmp 命令比较文 件 testfile 和文件 testfile1 两个文件,则输入下面的命令:

#比较两个指 定的文件
cmp testfile testfile1

在上述指令执行之前,使用cat命令查看两个指定的文件内容,如下所示:

cat testfile                    #查看文件内容
Absncn 50                       #显示文件“testfile”
Asldssja 60
Jslkadjls 85

cat testfile1                   #查看文件内容
Absncn 50                       #显示文件“testfile1”
AsldssjE 62
Jslkadjls 85  

然后,再执行 cmp 命令,并返回比较结果,具体如下所示:

cmp testfile testfile1       #比较两个文件
testfile testfile1           #有差异:第8字节,第2行  

注意:在比较结果中,只能够显示第一比较结 果。

col 命令

说明

col 命令是一个标准输入文 本过滤器,它从标注输入设备读取文本内容,并把内容显示到标注输出设备。在许多UNIX说明文件里,都有RLF控制字 符。当我们运用shell特殊字符>>>,把说明文件的内容输出成纯文本文件时 ,控制字符会变成乱码,col命令则能有效滤除这些控制字符。

语法

col [选项]

选项

-b:过滤掉所有的控制字符,包括RLF和HRLF
-f:滤掉RLF字符,但允许将HRLF字符呈现出来
-x:以多个空格字符来表示跳格字符
-l<缓冲区列数>:预设的内存缓冲区有128列,用户可以自行指定缓冲区的大小

cp 命令

说明

cp 命 令用来将一个或多个源文件或者目录复制到指定的目的文件或目录。它可以将单个源文件复制成一个指定文件名的具体的文件或一个已经存在的目录下。cp 命令还支持同时复制多个文件,当一次复制多个文件时,目标文件参数必须是一个已经存在的目录,否则将出现错误。

语法

cp [选项] [参数]

选项

-a:此参数的效果和同时指定 -dpR 参数相同
-d:当复制符号连接时,把目标文件或目录也建立为符号连接,并指向与源文件或目录连接的原始文件或目录
-f:强行复制文件或目录,不论目标文件或目录是否已存在
-i:覆盖既有文件之前先询问用户
-l:对源文件建立硬连接,而非复制文件
-p:保留源文件或目录的属性
-R/r:递归处理,将指定目录下的所有文件与子目录一并处理
-s:对源文件建立符号连接,而非复制文件
-u:使用这项参数后只会在源文件的更改时间较目标文件更新时或是名称相互对应的目标文件并不存在时,才复制文件
-S:在备份文件时,用指定的后缀 SUFFIX 代替文件的默认后缀
-b:覆盖已存在的文件目标前将目标文件备份
-v:详细显示命令执行的操作

参数

  • 源文件:制定源文件列表。默认情况下,cp 命令不能复制目录,如果要复制目录,则必须使用 -R 选项;
  • 目标文件:指定目标文件。当“源文件”为 多个文件时,要求“目标文件”为指定的目录。

实例

下面的第一行中是 cp 命令和具体的参数(-r 是“递归”, -u 是“更新”,-v 是“详细”)。接下来的三行显 示被复制文件的信息,最后一行显示命令行提示符。这样,只拷贝新的文件到我的存储设备上,我就使用 cp 的“更新”和“详细”选项。

通常来说,参数 -r 也可用更详细的风格 --recursive。但 是以简短的方式,也可以这么连用 -ruv

cp -r -u -v /usr/men/tmp ~/men/tmp

版本备份 --backup=numbered 参数意思为“我要做个备份,而且是带编号的连续备份”。所以一个备份就是 1 号,第二个就是 2 号,等等。

$ cp --force --backup=numbered test1.py test1.py
$ ls
test1.py test1.py.~1~ test1.py.~2~

如果把一个文件复制到一个目标文件中,而目标文件已经存在,那么 ,该目标文件的内容将被破坏。此命令中所有参数既可以是绝对路径名,也可以是相对路径名。通常会用到点.或点点..的形式。例如,下面的命令将指定文件复制到当前目录下:

cp ../mary/homework/assign .

所有目标文件指定的目录必须是己经存在的,cp命令不能创建目录。如果没有文件复制的权限 ,则系统会显示出错信息。

将文件file复制到目录/usr/men/tmp下,并改名为file1

cp file /usr/men/tmp/file1

将目录 /usr/men 下的所有文件及其子目录复制到目录 /usr/zh

cp -r /usr/men /usr/zh

交互式地将目录 /usr/men 中的以 m 打头的所有 .c 文件复制到目录 /usr/zh

cp -i /usr/men m*.c /usr/zh

我们在 Linux 下使用 cp 命令复制文件时候,有时候会需要覆盖一些同名文件,覆盖文件的时候都会有提示:需要不停的按 Y 来确定执行覆盖。文件数量不多还好,但是要是几百个估计按 Y 都要吐血了,于是折腾来半天总结了一个方法:

# 复制目录 aaa 下所有到 /bbb 目录下
# 如果 /bbb 目录下有和 aaa 同名的文件,需要按 Y 来确认并且会略过 aaa 目录下的子目录。
cp aaa/* /bbb

# 这次依然需要按Y来确认操作,但是没有忽略子目录。
cp -r aaa/* /bbb

# 依然需要按 Y 来确认操作,并且把 aaa 目录以及子目录和文件属性也传递到了 /bbb。
cp -r -a aaa/* /bbb

# 成功,没有提示按Y、传递了目录属性、没有略过目录。
\cp -r -a aaa/* /bbb

递归强制复制目录到指定目录中覆盖已存在文件

# 将当前目录下所有文件,复制到当前目录的兄弟目录 backup 文件夹中
cp -rfb ./* ../backup

拷贝目录下的隐藏文件如 .babelrc

# 将 aaa 目录下的,所有`.`开头的文件,复制到 bbb 目录中。
cp -r aaa/.* ./bbb

# 记住后面目录最好的'/' 带上 -a 参数
cp -a aaa ./bbb/

cu 命令

说明

cu 命令用于连接 另一个系统主机。cu (call up) 指令可连接另一台主机,并采用类似拨号终端机的接口工作,也可执行简易的文件传输作业。

语法

cu [dehnotv][-a<通信端口>][-c<电话号码>][-E<脱离字符>][-I<设置文件>][-l<外围设备代号>]
[-s<连线速率>][-x<排错模式>][-z<系统主机>][--help][-nostop][--parity=none][<系统主 机>/<电话号码>]

选项

-a<通信端口> 使用指定的通信端口进行连线
-p<通信端口>或--port<通信端口> 同上,使用指定的通信端口进行连线
-c<电话号码>或--phone<电话号码> 拨打该电话号码
-d 进入排错模式
-e 使用双同位检查
--parity=even 等价于选项 -e,使用双同位检查
-o 使用单同位检查
--parity=odd 等价于选项 -o,使用单同位检查
--parity=none 不使用同位检查
-E<脱离字符>或--escape<脱离字符> 设置脱离字符
-h或--halfduple 使用半双工模式
-I<配置文件>或--config<配置文件> 指定要使用的配置文件
-l<外围设备代号>或--line<外围设备代号> 指定某项外围设备,作为连接的设备
-n或--prompt 拨号时等待用户输入电话号码
-s<连线速率>或--speed<连线速率> 设置连线的速率,单位以鲍率计算
--baud<连线速率>或-<连线速率> 同上,设置连线的速率,单位以鲍率计算
-t或--maper 把 CR 字符置换成 LF+CR 字符
-v或--version 显示版本信息
-x<排错模式>或--debug<排错模式> 使用排错模式
-z<系统主机>或--system<系统主机> 连接该系统主机
--help 在线帮助
--nostop 关闭 Xon/Xoff 软件流量控制

实例

# 拨打电话号码 0102377765
cu -c 0102377765

cut 命令

说明

cut 命令用来读取文件中指定行(范围)中的内容,并显示在标准输出设备上;cut 命令可以合并多个文件内容并汇总到一个文件中。如果不指定 File 参数,cut 命令将读取标准输入,必须指定 -b-c-f 选项之一。

说明:该命令有两项功能,其一是用来显示文件的内容,它依次读取由参数 file 所指的文件,将它们的内容输出到标准输出上;其二是连接两个或多个文件,如cut f1 f2 > f3将把文件 f1f2 的内容合并起来,然后通过输出重定向符 >将它们放入文件 f3 中。

当对体 积较大的文件使用 cut 命令时,文本会在屏幕上迅速闪过(滚屏),用户往往看不清所显示的内容。因此,一般用 more 等命令让文件内容分屏显示。为了控制滚屏,可以按 Ctrl + S 组合键停止滚屏;按 Ctrl + Q 键恢复滚屏;按 Ctrl + C(中断)键可以终止该命令的执行,并且返回 Shell 提示符状态。

语法

cut [选项] [文件名]

选项

-b:仅显示行中指定直接范围的内容
-c:仅显示行中指定范围的字符
-d:指定字段的分隔符,默认的字段分隔符为 TAB
-f:显示指定字段的内容
-n:与 -b 选项连用,不分割多字节字符
--complement:补足被选择的字节、字符或字段
--out-delimiter=<字段分隔符>:指定输出内容是的字段分割符
--help:显示指令的帮助信息
--version:显示指令的版本信息

参数

文件名:指定要进行内容过滤的文件

实例

例如有一个学生报表信息,包含 No、Name、Mark、Percent 这 4 个字段:

[root@localhost text]# cat test.txt
No Name Mark Percent
01 tom 69 91
02 jack 71 87
03 alex 68 98

使用 -f 选项提取指定字段:

[root@localhost text]# cut -f 1 test.txt
No
01
02
03
[root@localhost text]# cut -f2,3 test.txt
Name Mark
tom 69
jack 71
alex 68

--complement 选项提取指定字段之外的列(打印除了第二列之外的列):

[root@localhost text]# cut -f2 --complement test.txt
No Mark Percent
01 69 91
02 71 87
03 68 98

使用 -d 选项指定字段分隔符:

[root@localhost text]# cat test2.txt
No;Name;Mark;Percent
01;tom;69;91
02;jack;71;87
[root@localhost text]# cut -f2 -d";" test2.txt
Name
tom
jack
alex

指定字段的字符或者字节范围

cut 命令可以将一串字符作为列来显示,字符字段的记法:

  • N- :从第N个字节、字符、字段到结尾;
  • N-M :从第N个字节、字符、字段到第M个(包括M在内)字节、字符、字段;
  • -M :从第1个字节、字符、字段到第M个(包括M在内)字节、字符、字段。

上面是记法,结合下面选 项将摸个范围的字节、字符指定为字段:

  • -b 表示字节;
  • -c 表示字符;
  • -f 表示定义字段。

比如,有一个 test.txt 文件,一共 5 行,每一行的内容为字母 a-z,如下所示:

[root@localhost text]# cat test.txt
abcdefghijklmnopqrstuvwxyz
abcdefghijklmnopqrstuvwxyz
abcdefghijklmnopqrstuvwxyz
abcdefghijklmnopqrstuvwxyz
abcdefghijklmnopqrstuvwxyz

打印第 1 个到第 3 个字符

[root@localhost text]# cut -c1-3 test.txt
abc
abc
abc
abc
abc

打印前面 4 个字符

[root@localhost text]# cut -c-4 test.txt
abcd
abcd
abcd
abcd
abcd

从第 5 个字符开始打印一直到结尾

[root@localhost text]# cut -c5- test.txt
efghijklmnopqrstuvwxyz
efghijklmnopqrstuvwxyz
efghijklmnopqrstuvwxyz
efghijklmnopqrstuvwxyz
efghijklmnopqrstuvwxyz

dd 命令

说明

dd 命令用于复制文件并对原文件的内容进行转换和格式化处理。dd 命令功能很强大的,对于一 些比较底层的问题,使用 dd 命令往往可以得到出人意料的效果。其中一个场景是使用 dd 命令来备份裸设备,但是不推荐这么做。如果需要备份 oracle 裸设备,可以使用 rman 命令备份, 或使用第三方软件备份。使用 dd 的话,管理起来不太方便。

建议在有需要的时候使用 dd 对物理磁盘操作,如果是文件系统的话,建议使用 tarbackup 或者 cpio 等命令会更加方便。另外,使用 dd 对磁盘操作时,最好使用块设备文件。

语法

dd [选项]

选项

bs=<字节数>:将 ibs(输入)与 obs(输出)设成指定的字节数
cbs=<字节数>:转换时,每次只转换指定的字节数
conv=<关键字>:指定文件转换的方式
count=<区块数>:仅读取指定的区块数
files=<n>:在终止前,复制指定数量的文件
ibs=<字节数>:每次读取的字节数
if=<文件>:从文件中读取输入数据,来代替标准输入
obs=<字节数>:每次输出的字节数
of=<文件>:输出到文件
seek=<区块数>:一开始输出时,跳过指定的区块数
skip=<区块数>:一开始读取时,跳过指定的区块数
--help:帮助
--version:显示版本信息

实例

[root@localhost text]# dd if=/dev/zero of=sun.txt bs=1M count=1
1+0 records in
1+0 records out
1048576 bytes (1.0 MB) copied, 0.006107 seconds, 172 MB/s

[root@localhost text]# du -sh sun.txt
1.1M    sun.txt

上述命令创建了一个 1M 大小的文件 sun.txt,其中参数的含义是:

  • if 代表输入文件。如果不指定 if,默认就会从 stdin 中读取输入
  • of 代表输出文件。如果不指定 of,默认就会将 stdout 作为默认输出
  • bs 代表字节为单位的块大小
  • count 代表被复制的块数
  • /dev/zero 是一个字符设备,会不断返回 0 值字节(\0

下表列出了块大 小(bs 选项)可以使用的计量单位:

单元大小单位代码
字节(1B)c
字节(2B)w
块(512B)b
千字节(1024B)k
兆字节(1024KB)M
吉字节(1024MB)G

从上面命令的输出结果也可以看出 dd 命令的操 作速度:

1048576 bytes (1.0 MB) copied, 0.006107 seconds, 172 MB/s

生成随机字符 串

我们甚至可以使用 /dev/urandom 设备配合 dd 命令 来获取随机字 符串,如下所示:

[root@localhost ~]# dd if=/dev/urandom bs=1 count=15|base64 -w 0
15+0 records in
15+0 records out
15 bytes (15 B) copied, 0.000111993 s, 133 kB/s
sWbeDlkKxcCmL5At6NgI

提示:本站提供了在线的随机字符串生成工具:

上面几款工具都提供了生成随机字符串的功能,能够方便地生成需要的随机字符串,可根据需要使用不同的工具。

df 命令

说明

df 命令用于 显示磁盘分区上的可使用的磁盘空间。默认显示的单位为 KB。可以利用该命令来获取硬盘被占用了多少空间,目前还剩下多少空间等信息。

语法

df [选项] [文件]

选项

-a或--all :包含全部的文件系统
--block-size=<区块大小>:以指定的区块大小来显示区块数目
-h或--human-readable:以可读性较高的方式来显示信息
-H或--si:与 -h 参数相同,但在计算时是以 1000 Bytes 为换算单位而非 1024 Bytes
-i或--inodes:显示 inode 的信息
-k或--kilobytes:指定区块大小为 1024 字节
-l或--local:仅显示本地端的文件系统
-m或--megabytes:指定区块大小为 1048576 字节
--no-sync:在取得磁盘使用信息前,不要执行 sync 指令,此为预设值
-P或--portability:使用 POSIX 的输出格式
--sync:在取得磁盘使用信息前,先执行 sync 指令
-t<文件系统类型>或--type=<文件系统类型>:仅显示指定文件系统类型的磁盘信息
-T或--print-type:显示文件系统的类型
-x<文件系统类型>或--exclude-type=<文件系统类型>:不要显示指定文件系统类型的磁盘信息
--help:显示帮助
--version:显示版本信息

参数

文件:指定文件系统上的文件

实例

查看系统 磁盘设备,默认是 KB 为单位:

[root@LinServ-1 ~]# df
文件系统               1K-块        已用     可用 已用% 挂载点
/dev/sda2            146294492  28244432 110498708  21% /
/dev/sda1              1019208     62360    904240   7% /boot
tmpfs                  1032204         0   1032204   0% /dev/shm
/dev/sdb1            2884284108 218826068 2518944764   8% /data1

使用-h选项以 KB 以上的单位来显示,可读性高:

[root@LinServ-1 ~]# df -h
文件系统                容量     已用    可用   已用%     挂载点
/dev/sda2              140G     38G    102G     27%     /
/dev/sda1              996M     61M    884M      7%     /boot
tmpfs                 1009M       0   1009M      0%     /dev/shm
/dev/sdb1              2.7T    209G    2.4T      8%     /data1

查看全部文件系统:

[root@LinServ-1 ~]# df -a
文件系统               1K-块        已用     可用 已用% 挂载点
/dev/sda2            146294492  28244432 110498708  21% /
proc                         0         0         0   -  /proc
sysfs                        0         0         0   -  /sys
devpts                       0         0         0   -  /dev/pts
/dev/sda1              1019208     62360    904240   7% /boot
tmpfs                  1032204         0   1032204   0% /dev/shm
/dev/sdb1            2884284108 218826068 2518944764   8% /data1
none                         0         0         0   -  /proc/sys/fs/binfmt_misc

dig 命令

说明

dig 命令(domain information groper)是一款常用的 DNS 域名服务器查询工具,输出的结果直观 、明了,可以用来测试域名服务器系统工作是否正常。因其灵活性,并易于使用,服务管理员通常使用 dig 命令来定位 DNS 相关的问题。

语法

dig [选项] [主机名|查询类型|查询类|查询选项]

选项

@<服务器地址>:指定进行域名解析的域名服务器
-b<ip地址>:当主机具有多个 IP 地址,指定使用本机的哪个 IP 地址向域名服务器发送域名查询请求
-f<文件名称>:指定 dig 以批处理的方式运行,指定的文件中保存着需要批处理查询的 DNS 任务信息
-i:使用 IP6.INT 进行 IPv6 反向查询
-k<keyfile>:指定 tsig key file
-m:启用内存使用调试
-p<端口号>:指定域名服务器所使用端口号
-q<名称>:指定要查询的 DNS 数据名称
-t<类型>:指定要查询的 DNS 数据类型
-u:以微秒而不是毫秒来显式时间
-x<IP地址>:执行逆向域名查询
-4:使用IPv4
-6:使用IPv6
-h:显示指令帮助信息

参数

  • 主机名:指定要查询域名主机
  • 查询类型:指定 DNS 查询的类型
  • 查询类:指定查询 DNS 的 class
  • 查询选项:指定查询选项

实例

1、使用 dig 命令查询百度的域名系统:

[root@localhost ~]# dig baidu.com

; <>> DiG 9.10.6 <>> baidu.com
;; global options: +cmd
;; Got answer:
;; ->>HEADER<- opcode: QUERY, status: NOERROR, id: 42530
;; flags: qr rd ra; QUERY: 1, ANSWER: 2, AUTHORITY: 0, ADDITIONAL: 0

;; QUESTION SECTION:
;baidu.com.                     IN      A

;; ANSWER SECTION:
baidu.com.              332     IN      A       220.181.38.148
baidu.com.              332     IN      A       39.156.69.79

;; Query time: 28 msec
;; SERVER: 192.168.0.1#53(192.168.0.1)
;; WHEN: Tue Jan 14 06:25:35 CST 2020
;; MSG SIZE  rcvd: 59

使用 -t 选项,查询阿里云的 MX 记录:

[root@localhost ~]# dig aliyun.com -t MX

; <<>> DiG 9.10.6 <<>> aliyun.com -t MX
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 29395
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 0

;; QUESTION SECTION:
;aliyun.com.                    IN      MX

;; ANSWER SECTION:
aliyun.com.             1       IN      MX      10 mx2.mail.aliyun.com.

;; Query time: 7 msec
;; SERVER: 192.168.0.1#53(192.168.0.1)
;; WHEN: Tue Jan 14 06:38:42 CST 2020
;; MSG SIZE  rcvd: 53

dirs 命令

说明

dirs 命令显示当前目录 栈中的所有记录(不带参数的 dirs 命令显示当前目录栈中的记录)。dirs 始终显示当然目录, 再是堆栈中的内容; 即使目录堆栈为空, dirs 命令仍然只显示当然目录。

语法

dirs [选项] [参数]

选项

-c:删除目录栈中的所有记录
-l:以完整格式显示
-p:一个目录一行的方式显示
-v:每行一个目录来显示目录栈的内容,每个目录前加上的编号
+N:显示从左到右的第 n 个目录,数字从 0 开始
-N:显示从右到左的第 n 个日录,数字从 0 开始

参数

目录:显示目录堆叠中的记录。

实例

[root@localhost var]# dirs
/var

dnf 命令

说明

dnf 是新一代的 rpm 软件包管理器。他首先出现在 Fedora 18 这个发行版中。而最近,它取代了 yum,成为 Fedora 22 的包管理器。

DNF 包管理器克服了 yum 包管理器的一些瓶颈,提升了包括用户体验,内存占用,依赖分析,运行速度等多方面的内容。DNF 使用 RPM, libsolv 和 hawkey 库进行包管理操作。尽管它没有预装在 CentOS 和 RHEL 7 中,但你可以在使用 YUM 的同时使用 DNF。

DNF 的最新稳定发行版版本号是 1.0,发行日期是2015年5月11日。 这一版本的额 DNF 包管理器(包括在他之 前的所有版本) 都大部分采用 Python 编写,发行许可为GPL v2.

安装 DNF 包管理器

DNF 并未默认 安装在 RHEL 或 CentOS 7系统中,但是 Fedora 22 已经默认使用 DNF .

1、为了安装 DNF ,您必须先安装并 启用 epel-release 依赖。

在系统中执行以下命令:

# yum install epel-release

或者

# yum install epel-release -y

其实这里并没有强制使用 y 的理由,相反的,在不使用 y 的情况下,用户可以在安装过程中查看到底有哪些东西被安装进了系统。但对于没有这个需求的用户,您可以在 YUM 中使用 y 参数来自动安装所有东西。

2、使用 epel-release 依赖中的 YUM 命令来安装 DNF 包。在系统中执行以下命令:

# yum install dnf

然后,DNF 包管理器就被成功的安装到你的系统中了。有若干用于 DNF 包管理器的命令,可以方便有效的管理您系统中的 RPM 软件包。下面是一些命令的用法。

查看 DNF 包管理器版本

用处:该命令用于查看安装在您系统中的 DNF 包管理器的版本

# dnf –version

查看系统中可用的 DNF 软件库

用处:该命令用于显示系统中可用的 DNF 软件库

# dnf repolist

查看系统中可用和不可用的所 有的 DNF 软件库

用处:该命令用于显示系统中可用和不可用的所有的 DNF 软件库

# dnf repolist all

列出所有 RPM 包

用处:该命令用于列出用户系统上的所有来自软件 库的可用软件包和所有已经安装在系统上的软件包

# dnf list

列出所有安装了的 RPM 包

用处:该命令用于列出所有安装了的 RPM 包

# dnf list installed

列出所有可供安装的 RPM 包

用处:该命令用于列出来自所有可用软件库的可供安装的软件包

# dnf list available

搜索软件库中的 RPM 包

用处:当你不知道你想要安装的软件的准确名称时,你可以用该命令来搜索软件包。你需要在”search”参数后面键入软件的部分名称来搜索。(在本例中我们使用 nano

# dnf search nano

查找某一文件的提供者

用处:当你想要查看是哪个软件包提供了系统中的某一文件时,你可以使用这条命令(在本例中,我们将查找 /bin/bash 这个文件的提供者)。

# dnf provides /bin/bash

查看软件包详情

用处:当你想在安装某一个软件包之前查看它的详细信息时,这条命令可以帮到你(在本例中,我们将查看 nano 这一软件包的详细信息)。

# dnf info nano

安装软件包

用处:使用该命令,系统将会自动安装对应的软件及其所需的所有依赖(在本例中,我们将用该命令安装 nano 软件)

# dnf install nano

升级软件包

用处:该 命令用于升级制定软件包(在本例中,我们将用命令升级 systemd 这一软件包)

# dnf update systemd

检查系统软件包的更新

用处:该命令用于检查系统中所有软件包的更新

# dnf check-update

升级所有系统软件包

用处:该命令用于升级系统中所有有可用升级的软件包

# dnf update 或 # dnf upgrade

删除软件包

用处:删除系统中指定的软件包(在本例中我们将使用命令删除 nano 这一软件包)

# dnf remove nano 或 # dnf erase nano

删除无用孤立的软件包

用处:当没有软件再依赖它们时,某一些用于解决特定软件依赖的软件包将会变得没有存在的意义,该命令就是用来自动移除这些没用的孤立软件包。

# dnf autoremove

删除缓存的无用软件包

用处:在使用 DNF 的 过程中,会因为各种原因在系统中残留各种过时的文件和未完成的编译工程。我们可以使用该命令来删除这些没用的垃圾文件。

# dnf clean all

获取有关某条命令的使用帮助

用处:该命令 用于获取有关某条命令的使用帮助(包括可用于该命令的参数和该命令的用途说明)(本例中我们将使用命令获取有关命令”clean”的使用帮助)

# dnf help clean

查看所有的 DNF 命令及其用途

用处:该命令用于列出所有的 DNF 命令及其用途

# dnf help

查看 DNF 命令的执行历史

用处:您可以使用该命令来查看您系统上 DNF 命令的执行历史。通过这个手段您可以知道在自 您使用 DNF 开始有什么软件被安装和卸载。

# dnf history

查看所有的软件包组

用处:该命令用于列出所有的软件包组

# dnf grouplist

安装一个软件包组

用处:该命令用于安装一个软件包组(本例中,我们将用命令安装 Educational Software 这个软件包组)

# dnf groupinstall ‘Educational Software’

升级一个软件包组中的 软件包

用处:该命令用于升级一个软件包组中的软件包(本例中,我们将用命令升级 Educational Software 这个软件包组中的软件)

# dnf groupupdate ‘Educational Software’

删除一个软件包组

用处:该命令用于删除一个软件包组(本例中,我们将用命令删除 Educational Software 这个软件包组)

# dnf groupremove ‘Educational Software’

从特定的软件包库安装特定的软件

用处:该命令用于从特定的软件包库安装特定的软件(本例中我们将使用命令从软件包库 epel 中安装 phpmyadmin 软件包)

# dnf –enablerepo=epel install phpmyadmin

更新软件包到最新的稳定发行版

用处:该命令可以通过所有 可用的软件源将已经安装的所有软件包更新到最新的稳定发行版

# dnf distro-sync

重新 安装特定软件包

用处:该命令用于重新安装特定软件包(本例中,我们将使用命令重新安装 nano 这个软件包)

# dnf reinstall nano

回滚某个特定软件的版本

用处:该命令用于降低特定软件包的版本(如果可能的话)(本例中,我们将使用命令降低 acpid 这个软件包的版本)

# dnf downgrade acpid

样例输出:

Using metadata from Wed May 20 12:44:59 2015
No match for available package: acpid-2.0.19-5.el7.x86_64
Error: Nothing to do.

总结

DNF 包管理器作为 YUM 包管理器的升级替代品,它能自动完成更多的操作。但在我看来,正因如此,所以 DNF 包管理器不会太受那些经验老道的 Linux 系统管理者的欢迎。举例如下:

  1. 在 DNF 中没有 –skip-broken 命令,并且没有替代命令供选择。
  2. 在 DNF 中没有判断哪个包提供了指定依赖的 resolvedep 命令。
  3. 在 DNF 中没有用来列出某个软件依赖包的 deplist 命令。
  4. 当你在 DNF 中排除了某个软件库,那么该操作将会影响到你之后所有的操 作,不像在 YUM 下那样,你的排除操作只会咋升级和安装软件时才起作用。

du 命令

说明

du 命 令是查看文件目录使用空间的命令。与 df 命令不同的是,du 命令查看的是指定文件或文件夹的磁盘空间的使用情况,而 df 命令查看的是磁盘分区的使用情况。du 命令查看的对象粒度更细。

语法

du [选项] [文件]

选项

-a或-all:显示目录中个别文件的大小
-b或-bytes:显示目录或文件大小时,以 byte 为单位
-c或--total:除了显示个别目录或文件的大小外,同时也显示所有目录或文件的总和
-k或--kilobytes:以 KB 为单位输出,即 1024bytes
-m或--megabytes:以 MB 为单位输出
-s或--summarize:仅显示总大小,只列出最后加总的值
-h或--human-readable:以 KMG 为单位,提高信息的可读性
-x或--one-file-xystem:以一开始处理时的文件系统为准,若遇上其它不同的文件系统目录则略过
-L<符号链接>或--dereference<符号链接>:显示选项中所指定符号链接的源文件大小
-S或--separate-dirs:显示个别目录的大小时,并不含其子目录的大小
-X<文件>或--exclude-from=<文件>:在<文件>指定目录或文件
--exclude=<目录或文件>:略过指定的目录或文件
-D或--dereference-args:显示指定符号链接的源文件大小
-H或--si:与 -h 参数相同,但是 KMG 是以 1000 为换算单位
-l或--count-links:重复计算硬件链接的文件

实例

1、显示当前目录或者文件所占空间

[root@localhost temp]# du
608 ./temp6
308 ./temp4
4 ./scf/lib
4 ./scf/service/deploy/product
4 ./scf/service/deploy/info
12 ./scf/service/deploy
16 ./scf/service
4 ./scf/doc
4 ./scf/bin
32 ./scf
8 ./temp3
1575 .

上面 du 命令执行的结果,显示了当前目录下面的子目录的目录大小和当前目录的总的大小,最下面的 1575 为当前目录的总大小。

2、显示指定文件所占空间

[root@localhost temp]# du log2012.log
680 log2012.log

3、查看指定目录的所占空间

[root@localhost temp]# du scf
4 scf/lib
4 scf/service/deploy/product
4 scf/service/deploy/info
12 scf/service/deploy
16 scf/service
4 scf/doc
4 scf/bin
32 scf

4、显示多个文件所占空间

[root@localhost temp]# du log30.tar.gz log31.tar.gz
4 log30.tar.gz
4 log31.tar.gz

5、只显示总和的大小

# 显示当前目录的总大小
[root@localhost temp]# du -s
1575 .

# 显示指定目录的总大小
[root@localhost temp]# du -s scf
32 scf

# 切换到上级目录
[root@localhost temp]# cd ..

# 然后显示 temp 目录的总大小
[root@localhost soft]# du -s temp
1575 temp

ed 命令

说明

ed 命令是单行纯文本编 辑器,它有命令模式(command mode)和输入模式(input mode)两种工作模式。ed 命令支持多个内置命令,常见内 置命令如下:

A:切换到输入模式,在文件的最后一行之后输入新的内容;
C:切换到输入模式,用输入的内容替换掉最后一行的内容;
i:切换到输入模式,在当前行之前加入一个新的空行来输入内容;
d:用于删除最后一行文本内容;
n:用于显示最后一行的行号和内容;
w:<文件名>:一给定的文件名保存当前正在编辑的文件;
q:退出ed编辑器。

语法

ed [选项] [参数]

选项

-G或--traditional:提供兼容的功能
-p<字符串>:指定 ed 在 command mode 的提示字符
-s,-,--quiet或--silent:不执行开启文件时的检查功能
--help:显示帮助
--version:显示版本信息

参数

文件:待编辑的文件

elm 命令

说明

elm 命令 是 一个电子邮件客户端管理程序,它提供了以纯文本的方式进行交互的全屏幕界面。

语法

elm [选项]

选项

-s<邮件主题>:指定新邮件的邮件主题
-f<目录>:开启程序时,读取指定的目录
-h:显示帮助
-i<文件名>:将文件内容插入送出的邮件中
-m:进入 elm 后,不显示指令说明
-v:显示 elm 的版本信息
-z:若收件信箱没有邮件,则不启动 elm 程序

env 命令

说明

env 命令用于显示系统中已存在的环境变量,以及在定义的环境中执行指令。该命令只使用 - 作为参数选项时,隐藏了选项 -i 的功能。若没有设置任何选项和参数时,则直接显示当前的环境变量。

说明:如果使用 env 命令在新环境中执行指令时,会因为没有定义环境变量 PATH 而报错:No such file or directory。此时,用户可以重新定义一个新的 PATH 或者使用绝对路径。

语法

env [选项] [参数]

选项

-i:开始一个新的空的环境
-u<变量名>:从当前环境中删除指定的变量

参数

  • 变量定义:定义在新的环境中变量, 定义多个变量定义用空格隔开。格式为 变量名=值
  • 指令:指定要执行的指令和参数

实例

[root@localhost ~]# env
hostname=MiamServ-1
TERM=linux
SHELL=/bin/bash
HISTSIZE=1000
SSH_CLIENT=192.168.2.111 2705 22
SSH_TTY=/dev/pts/0
USER=root
LS_COLORS=no=00:fi=00:di=01;34:ln=01;36:pi=40;33:so=01;35:bd=40;33;01:cd=40;33;01:or=01;05;37;41:mi=01;05;37;41:ex=01;32:*.cmd=01;32:*.exe=01;32:*.com=01;32:*.btm=01;32:*.bat=01;32:*.sh=01;32:*.csh=01;32:*.tar=01;31:*.tgz=01;31:*.arj=01;31:*.taz=01;31:*.lzh=01;31:*.zip=01;31:*.z=01;31:*.Z=01;31:*.gz=01;31:*.bz2=01;31:*.bz=01;31:*.tz=01;31:*.rpm=01;31:*.cpio=01;31:*.jpg=01;35:*.gif=01;35:*.bmp=01;35:*.xbm=01;35:*.xpm=01;35:*.png=01;35:*.tif=01;35:
mail=/var/spool/mail/root
PATH=/usr/kerberos/sbin:/usr/kerberos/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin
INPUTRC=/etc/inputrc
pwd=/root
LANG=zh_CN.UTF-8
SHLVL=1
HOME=/root
logname=root
SSH_CONNECTION=192.168.2.111 2705 192.168.2.2 22
LESSOPEN=|/usr/bin/lesspipe.sh %s
G_BROKEN_FILENAMES=1
_=/bin/env

ex 命令

说明

ex 模式下启动vim文本编辑器。ex 执行效果如同 vi -E,适用于法及参数可参照vi指令,如要从Ex模式回到普通模 式,则在vim中输入 :vi:visual 即可。

语法

ex [参数]

参数

文件:指定待编辑的文件。

fc 命令

说明

fc 命令可以编辑 在终端中执行过的历史命令。编辑时,输入 fc 命令将调用 vi 编辑器来修改已有历史命令;当保存时,会立即执行修改后的命令。除此以外,fc 命令也可以列出使用过的历史命令。

语法

fc [-e 编辑器名] [-lnr] [起始] [终结]
fc -s [模式=替换串] [命令]

选项

-l:显示历史命令
-n:显示历史命令时,不显示编号
-r:反序显示历史命令

参数

  • 起始指令编号:指定要编辑的起始指令编号
  • 结尾指令 编号:指定要编辑的结尾指令编号

实例

使用 fc -l 命令显示最近使用的 10 条历史命令:

# 显示10条历史命令
[root@localhost ~] fc -l -10
10128     ls -a
10129     export
10130     history 10
10131     ulimit -a
10132     shopt
10133     type -a grep
10134     echo $a
10135     help dig
10136     dig baike.baidu.com
10137     showkey -a

上述结果中的第一列是历史命令的编号;第二列是使用过的历史命令。若用户需要编 辑第 10136 条历史命令时,则输入如下命令:

# 编辑第 10136 条历史命令
[root@localhost ~] fc 10136

命令执行成功后,将自动调用 vi 编辑器编辑指定的命令(这里是第 10136 条命令:dig baike.baidu.com),编辑完成之后,保存并退出 vi 编辑器,此时会自动执行修改后的命令。

fg 命令

说明

fg 命令用于 将后台作业(在后台运行的或者在后台挂起的作业)放到前台终端运行。与 bg 命令一样,若后台任务中只有一个,则使用该命令时,可以省略任务号。

在 Linux 系统中执行某些操作时候,有时需要将当前任务暂停调至后台,或有时须将后台暂停的任务重启开启并调至前台,这一序列的操作将会使用到 jobsbg、和 fg 三个命令来完成。

语法

fg [作业标识]

参数

作业标识:指定要放到前台的作业标识号

实例

使用 fg 命令将任务号为 5 的任务从后台执行转换到前台执行,输入如下 命令:

# 将任务转换到前台执行
[root@localhost ~]$ fg 5

执行上面的命令后,命令行窗口将显示如下信息:

[root@localhost ~]$ find / -name password

fmt 命令

说明

fmt 命令用于对文件进行格式化处理。使用 fmt 命令时,该命令将读取指定文件的内容,然后,根据命令选项对该文件的格式进行简单的优化处理,并将处理结果发送到标准输出设备。

语法

fmt [选项] [文件名]

选项

-c或--crown-margin:每段前两列缩排
-p<列起始字符串>或-prefix=<列起始字符串>:仅合并含有指定字符串的列,通常运用在程序语言的注解方面
-s或--split-only:只拆开字数超出每列字符数的列,但不合并字数不足每列字符数的列
-t或--tagged-paragraph:每列前两列缩排,但第 1 列和第 2 列的缩排格式不同
-u或--uniform-spacing:每列字符之间都以一个空格字符间隔,每个句子之间则两个空格字符分隔
-w<每列字符数>或--width=<每列字符数>或-<每列字符数>:设置每列的最大字符数

参 数

文件名:指定要格式化的文件

ftp 命令

说明

ftp 命令用来设置文件系统相关功能。ftp 服务器在网上较为常见,Linux ftp 命令的功能是用命令的方式来控制在本地机和远程机之间传送文件,这里详细介绍 Linux ftp 命令的一些经常使用的命令,相信掌握了这些使用 Linux 进行 ftp 操作将会非 常容易。

语法

ftp [选项] [参数]

选项

-d:详细显示指令执行过程,便于排 错或分析程序执行的情况
-i:关闭互动模式,不询问任何问题
-g:关闭本地主机文件名称支持特殊字符的扩充特性
-n:不使用自动登录
-v:显示指令执行过程

参数

主机:指定要连接的 FTP 服务器的主机名或 ip 地址。

实例

ftp> ascii  # 设定以ASCII方式传送文件(缺省值)
ftp> bell   # 每完成一次文件传送,报警提示.
ftp> binary # 设定以二进制方式传送文件.
ftp> bye    # 终止主机FTP进程,并退出FTP管理方式.
ftp> case   # 当为ON时,用MGET命令拷贝的文件名到本地机器中,全部转换为小写字母.
ftp> cd     # 同UNIX的CD命令.
ftp> cdup   # 返回上一级目录.
ftp> chmod  # 改变远端主机的文件权限.
ftp> close  # 终止远端的FTP进程,返回到FTP命令状态, 所有的宏定义都被删除.
ftp> delete # 删除远端主机中的文件.
ftp> dir [remote-directory] [local-file] # 列出当前远端主机目录中的文件.如果有本地文件,就将结果写至本地文件.
ftp> get [remote-file] [local-file] # 从远端主机中传送至本地主机中.
ftp> help [command] # 输出命令的解释.
ftp> lcd # 改变当前本地主机的工作目录,如果缺省,就转到当前用户的HOME目录.
ftp> ls [remote-directory] [local-file] # 同DIR.
ftp> macdef                 # 定义宏命令.
ftp> mdelete [remote-files] # 删除一批文件.
ftp> mget [remote-files]    # 从远端主机接收一批文件至本地主机.
ftp> mkdir directory-name   # 在远端主机中建立目录.
ftp> mput local-files # 将本地主机中一批文件传送至远端主机.
ftp> open host [port] # 重新建立一个新的连接.
ftp> prompt           # 交互提示模式.
ftp> put local-file [remote-file] # 将本地一个文件传送至远端主机中.
ftp> pwd  # 列出当前远端主机目录.
ftp> quit # 同BYE.
ftp> recv remote-file [local-file] # 同GET.
ftp> rename [from] [to]     # 改变远端主机中的文件名.
ftp> rmdir directory-name   # 删除远端主机中的目录.
ftp> send local-file [remote-file] # 同PUT.
ftp> status   # 显示当前FTP的状态.
ftp> system   # 显示远端主机系统类型.
ftp> user user-name [password] [account] # 重新以别的用户名登录远端主机.
ftp> ? [command] # 同HELP. [command]指定需要帮助的命令名称。如果没有指定 command,ftp 将显示全部命令 的列表。
ftp> ! # 从 ftp 子系统退出到外壳。

关闭FTP连接

bye
exit
quit

下载文件

ftp> get readme.txt # 下载 readme.txt 文件
ftp> mget *.txt     # 下载 

上传文件

ftp> put /path/readme.txt # 上传 readme.txt  文件
ftp> mput *.txt           # 可以上传多个文件

gcc 命令

说明

gcc 命令使用GNU推出的基于 C/C++ 的编译器,是开放源代码领域应用最广泛的编译器,具有功能强大,编译代码支持性能优化等特点。现 在很多程序员都应用 GCC,怎样才能更好的应用 GCC。目前,GCC 可以用来编译 C/C++、FORTRAN、JAVA、OBJC、ADA 等语言的程序,可根据需要选择安装支持的语言。

语法

gcc [选项] [参数]

选项

-o:指定生成的输出文件
-E:仅执行编译预处理
-S:将 C 代码转换为汇编代码
-wall:显示警告信息
-c:仅执行编译操作,不进行连接操作

参数

C 源文件:指定 C 语言源代码文件。

实例

常用编译命令选项

假设源程序文件名为 test.c

无选项编译链接

gcc test.c

test.c 预处理、汇编、编译并链接形成可执行文件。这里未指定输出文件,默认输出为 a.out

选项 -o

gcc test.c -o test

test.c 预处理、汇编、编译并链接形成可执行文件 test-o 选项用来指定输出文件的文件名。

选项 -E

gcc -E test.c -o test.i

test.c 预处理输出 test.i 文件。

选项 -S

gcc -S test.i

将预处理输出文件 test.i 汇编成 test.s 文件。

选项 -c

gcc -c test.s

将汇编输出文件 test.s 编译输出 test.o 文件。

无选项链接

gcc test.o -o test

将编译输出文件 test.o 链接成最终可执行文件 test

选项 -O

gcc -O1 test.c -o test

使用编译 优化级别 1 编译程序。级别为 1~3,级别越大优化效果越好,但编译时间越长。

多源文件的编译方法

如果有多个源文件,基本上有两种编译方法:

假设有两个源文件为 test.ctestfun.c

多个文件一起编译

gcc testfun.c test.c -o test

testfun.ctest.c 分别编译后链接成 test 可执行文件。

分别编译各个源文件,之后对编译后输出的目标文件链接。

# 将 testfun.c 编译成 testfun.o
gcc -c testfun.c

# 将 test.c 编译成test.o
gcc -c test.c

# 将 testfun.o 和 test.o 链接成 test
gcc -o testfun.o test.o -o test

以上两种方法相比较,第一中方法编译时需要所有文件重新编译,而第二种方法可以只重新编译修改的文件,未修改的文件不用重新编译。

gdb 命令

说明

gdb 命令包含在 GNUgcc 开发套件中,是一款功能强大的程序调试器。GDB 中的命令很多,但我们只需掌握其中部分常用的命令,就大致可以完成日常的程序调试工作。

命令解释示例
file <文件名>加载被调试的可执行程序 文件。 因为一般都在被调试程序所在目录下执行 GDB,因而文本名不需要带路径。(gdb) file gdb-sample
rRun 的简写,运行被调试的程序。 如果此前没有下过断点,则执行完整个程序;如果有断点,则程序暂停在第一个可用断点处。(gdb) r
cContinue 的简写,表示继续执行被调试程序,直至下一个断点或程序结束。(gdb) c
b <行号>
b <函数名称>
b *<函数名称>
b *<代码地址>
d [编号]
b: Breakpoint 的简写,设置断点。可以使用行号、函数名称、执行地址等方式指定断点位置。其中在函数名称 前面加 * 符号表示将断点设置在「由编译器生成的 prolog 代码处」。如果不了解汇编,可以不予理会此用法。d: Delete breakpoint 的简写,删除指定编号的某个断点,或删除所有断点。断点编号从 1 开始递增。(gdb) b 8 (gdb) b main (gdb) b *main (gdb) b *0x804835c (gdb) d
s, ns: 执行一行源程序代码,如果此行代码中有函数调用,则进入该函数;n: 执行一行源程序代码,此行代码中的函数调用也一并执行。 s 相当于其它调试器中的“Step Into (单步跟踪进入)”;n 相当于其它调试器中的“Step Over (单步跟踪)”。 这两个命令必须在有源代码调试信息的情况下才可以使用(GCC 编译时使用 -g 参数)。(gdb) s (gdb) n
si, nisi 命令类似于 s 命令,ni 命令类似于 n 命令。所不同的是,这两个命令(si/ni)所针对的是汇编 指令,而s/n 针对的是源代码。(gdb) si (gdb) ni
pPrint 的简写,显示指定变量(临时变量或全局变量)的值。(gdb) p i (gdb) p nGlobalVar
display, undisplaydisplay 设置程序中断后欲显示的数据及其格式。例如,如果希望每次程序中断后可以看到即将被执行的下一条汇编指令,可以使用命令 display /i $pc。其中 $pc 代表当前汇编指令,/i 表示以十六进行显示。当需要关心汇编代码时,此命令相当有用。 undispaly,取消先前的 display 设置,编号从 1 开始递增。(gdb) display /i $pc (gdb) undisplay 1
iinfo 的简写,用于显示各类信息,详情请查阅 help i(gdb) i r
qQuit 的简写,即退出 GDB 调试环境。(gdb) q
help [命令名称]GDB 帮助命令,提供对 GDB 名种命令的解释说明。如果指定了 命令名 称 参数,则显示该命令的详细说明;如果没有指定参数,则分类显示所有 GDB 命令,供用户进一步浏览和查 询。(gdb) help

语法

gdb [选项] [参数]

选项

-cd:设置工作目录
-q:安静模式,不打印介绍信息和版本信息
-d:添加文件查找路径
-x:从指定文件中执行GDB指令
-s:设置读取的符号表文件

参数

文件:二进制可执行程序。

实例

以下是 Linux 下 gdb 调试的一个实例,先给出一个示例用的小程序,C 语言代码:

#include <stdio.h>
int nGlobalVar = 0;

int tempFunction(int a, int b)
{
    printf("tempFunction is called, a = %d, b = %d /n", a, b);
    return (a + b);
}

int main()
{
    int n;
        n = 1;
        n++;
        n--;

        nGlobalVar += 100;
        nGlobalVar -= 12;

    printf("n = %d, nGlobalVar = %d /n", n, nGlobalVar);

        n = tempFunction(1, 2);
    printf("n = %d", n);

    return 0;
}

请将此代码复制出来并保存到文件 gdb-sample.c 中,然后切换到此文件所在目录,用 GCC 编译:

gcc gdb-sample.c -o gdb-sample -g

在上面的命令行中,使用 -o 参数指定了编译生成的可执行文件名为 gdb-sample,使用参数 -g 表示将源代码信息编译到可执 行文件中。如果不使用参数 -g,会给后面的GDB调试造成不便。当然,如果我们没有程序的源代码,自 然也无从使用 -g 参数,调试/跟踪时也只能是汇编代码级别的调试/跟踪。

下面 gdb 命令启动 GDB,将首先显示 GDB 说明:

GNU gdb Red Hat Linux (5.3post-0.20021129.18rh)
Copyright 2003 free Software Foundation, Inc.
GDB is free software, covered by the GNU General Public License, and you are
welcome to change it and/or distribute copies of it under certain conditions.
type "show copying" to see the conditions.
There is absolutely no warranty for GDB. Type "show warranty" for details.
This GDB was configured as "i386-redhat-linux-gnu".
(gdb)

上面最后一行 (gdb) 为 GDB 内部命令引导符,等待用户输入 GDB 命令。

下面 使用 file 命令载入被调试程序 gdb-sample(这里的 gdb-sample 即前面 GCC 编译输出的可执行文件):

(gdb) file gdb-sample
Reading symbols from gdb-sample...done.

上面最后一行提示已经加载成功。

下面使用 r 命令执行(Run)被调试文件,因为尚未设置任何断点,将直接执行到程序结束:

(gdb) r
Starting program: /home/liigo/temp/test_jmp/test_jmp/gdb-sample
n = 1, nGlobalVar = 88
tempFunction is called, a = 1, b = 2
n = 3
Program exited normally.

下面使用 b 命令在 main 函数开头设置一个断点(Breakpoint):

(gdb) b main
Breakpoint 1 at 0x804835c: file gdb-sample.c, line 19.

上面最后一行提示已经成功设置断点,并给出 了该断点信息:在源文件 gdb-sample.c 第 19 行处设置断点;这是本程序的第一个断点(序号为1);断点处的代码地址为 0x804835c(此值可能仅在本次调试过程中有效)。回过头去看源代码,第 19 行 中的代码为n = 1,恰好是 main 函数中的第一个可执行语句(前面的 int n; 为变量定义语句,并非可执行语句)。

再次使用 r 命令执行(Run)被调试程序:

(gdb) r
Starting program: /home/liigo/temp/gdb-sample

Breakpoint 1, main () at gdb-sample.c:19
19 n = 1;

程序中断在 gdb-sample.c 第 19 行处,即 main 函数是第一个可执行语句处。

上面最后一行信息为:下一条将要执行的源代码为 n = 1;,它是源代码文件 gdb-sample.c 中的第 19 行。

下面使用 s 命令(Step)执行下一行代码(即第19行 n = 1;):

(gdb) s
20 n++;

上面的信息表示已经执行完 n = 1;,并显示下一条要执行的代码为第 20 行的 n++;

既然已经执行了 n = 1;,即给变量 n 赋值为 1,那我们用 p 命令(Print)看一下变量 n 的值是不是 1

(gdb) p n
$1 = 1

果然是 1。($1 大致是表示这是第一次使用 p 命令——再次执行 p n 将显示 $2 = 1 ——此信息应该没有什么用处。)

下面我们分别在第 26 行 tempFunction 函数开头各设置一个断点(分别使用命令 b 26b tempFunction):

(gdb) b 26
Breakpoint 2 at 0x804837b: file gdb-sample.c, line 26.
(gdb) b tempFunction
Breakpoint 3 at 0x804832e: file gdb-sample.c, line 12.

使用 c 命令继续(Continue) 执行被调试程序,程序将中断在第二 个断点(26 行),此时全局变量 nGlobalVar 的值应该是 88;再一次执行 c 命令,程序将中断于第三个断点(12 行,tempFunction 函数开头处),此时 tempFunction 函数的两个参数 ab 的值应分别是 12

(gdb) c
Continuing.

Breakpoint 2, main () at gdb-sample.c:26
26 printf("n = %d, nGlobalVar = %d /n", n, nGlobalVar);
(gdb) p nGlobalVar
$2 = 88
(gdb) c
Continuing.
n = 1, nGlobalVar = 88

Breakpoint 3, tempFunction (a=1, b=2) at gdb-sample.c:12
12 printf("tempFunction is called, a = %d, b = %d /n", a, b);
(gdb) p a
$3 = 1
(gdb) p b
$4 = 2

上面反馈的信息一切都在我们预料之中。

再一次执行 c 命令(Continue),因为后面再也没有其它断点,程序将一直执行到结束:

(gdb) c
Continuing.
tempFunction is called, a = 1, b = 2
n = 3
Program exited normally.

有时候需要看到编译器生成的汇编代码,以进行汇编级的调试或跟踪,又该如何 操作呢?

这就要用到 display 命令 display /i $pc 了(此命令前面已有详细解释):

(gdb) display /i $pc
(gdb)

此后程序再中断时,就可以显示出汇编代码了:

(gdb) r
Starting program: /home/liigo/temp/test_jmp/test_jmp/gdb-sample

Breakpoint 1, main () at gdb-sample.c:19
19 n = 1;
1: x/i $pc 0x804835c <main+16>: movl $0x1,0xfffffffc(%ebp)

看到了汇编代码,n = 1; 对应的汇编代码是 movl $0x1,0xfffffffc(%ebp)

并且以后程序每次中断都将显示下一条汇编指定(si 命令用于执行一条汇编代码——区别于 s 执行一行 C 代码):

(gdb) si
20 n++;
1: x/i $pc 0x8048363 <main+23>: lea 0xfffffffc(%ebp),%eax
(gdb) si
0x08048366 20 n++;
1: x/i $pc 0x8048366 <main+26>: incl (%eax)
(gdb) si
21 n--;
1: x/i $pc 0x8048368 <main+28>: lea 0xfffffffc(%ebp),%eax
(gdb) si
0x0804836b 21 n--;
1: x/i $pc 0x804836b <main+31>: decl (%eax)
(gdb) si
23 nGlobalVar += 100;
1: x/i $pc 0x804836d <main+33>: addl $0x64,0x80494fc

接下来我们试一下命令 b *<函 数名称>

为了更简明,有必要先删除目前所有断点(使用 d 命令 —— Delete breakpoint):

(gdb) d
Delete all breakpoints? (y or n) y
(gdb)

当被询问是否删除所有断点时,输入 y 并按回车键即可。

下面使用命令 b *mainmain 函数的 prolog 代码处设置断点(prolog、epilog,分别表示编译器在每个函数的开头和结尾自行插入的代码):

(gdb) b *main
Breakpoint 4 at 0x804834c: file gdb-sample.c, line 17.
(gdb) r
The program being debugged has been started already.
Start it from the beginning? (y or n) y
Starting program: /home/liigo/temp/test_jmp/test_jmp/gdb-sample

Breakpoint 4, main () at gdb-sample.c:17
17 {
1: x/i $pc 0x804834c <main>: push %ebp
(gdb) si
0x0804834d 17 {
1: x/i $pc 0x804834d <main+1>: mov %esp,%ebp
(gdb) si
0x0804834f in main () at gdb-sample.c:17
17 {
1: x/i $pc 0x804834f <main+3>: sub $0x8,%esp
(gdb) si
0x08048352 17 {
1: x/i $pc 0x8048352 <main+6>: and $0xfffffff0,%esp
(gdb) si
0x08048355 17 {
1: x/i $pc 0x8048355 <main+9>: mov $0x0,%eax
(gdb) si
0x0804835a 17 {
1: x/i $pc 0x804835a <main+14>: sub %eax,%esp
(gdb) si
19 n = 1;
1: x/i $pc 0x804835c <main+16>: movl $0x1,0xfffffffc(%ebp)

此时可以使用 i r 命令显示寄存器中的当前值 —— i r 即 Infomation Register:

(gdb) i r
eax 0xbffff6a4 -1073744220
ecx 0x42015554 1107383636
edx 0x40016bc8 1073834952
ebx 0x42130a14 1108544020
esp 0xbffff6a0 0xbffff6a0
ebp 0xbffff6a8 0xbffff6a8
esi 0x40015360 1073828704
edi 0x80483f0 134513648
eip 0x8048366 0x8048366
eflags 0x386 902
cs 0x23 35
ss 0x2b 43
ds 0x2b 43
es 0x2b 43
fs 0x0 0
gs 0x33 51

当然也可以显示任意一个指定的寄存器值:

(gdb) i r eax
eax 0xbffff6a4 -1073744220

最后一个要介绍的命令是q,退出(Quit)GDB 调试环境:

(gdb) q
The program is running. exit anyway? (y or n)

git 命令

Git 的诞生

Git 是流行的开源分布式版本控制系统,用于快速高效地处理任何大小的 项目。Git 是 Linus Torvalds 为了帮助管理 Linux 内核开发于 2005 年开发的一个开放源码的版本控制软件,和 SVN 的最大区别在于:Git 没有中央仓库的概念,是一个分布式的版本控制系统。

Git:分 布式版本控制系统
Git:分布式版本控制系统

Linus 虽然创建了 Linux,但 Linux 的壮大是靠全世界热心的志愿者参与的,这么多人在世界各地为 Linux 编写代码 ,那 Linux 的代码是如何管理的呢?

事实是,在 2002 年以前,世界各地的志愿者把源代码文件通过 diff 的方式发给 Linus,然后由 Linus 本人通过手工方式合并代码!

为什么 Linus 不把 Linux 代码放到版本控制系统里呢?不是有 CVS、SVN 这些免费的版本控制系统吗?因为 Linus 坚定地反对 CVS 和 SVN,这些集中式的版本控制系统不但速度慢,而且必须联网才能使用。有一些商用的版本控制系统,虽然比 CVS、SVN 好用,但那是付费的,和 Linux 的开源精神不符。

不过,到了 2002 年,Linux 系统已经发展了十年了,代码库之大让 Linus 很难继续 通过手工方式管理了,社区的弟兄们也对这种方式表达了强烈不满,于是 Linus 选择了一个商业的版本控制系统 BitKeeper,BitKeeper 的东家 BitMover 公司出于人道主义精神,授权 Linux 社区免费使用这个版本控制系统。

安定团结的大好局面在 2005 年就被打破了,原因是 Linux 社区牛人聚集,不免沾染了一些梁山好汉的江湖习气。开 发 Samba 的 Andrew 试图破解 BitKeeper 的协议,被 BitMover 公司发现了,于是,BitMover 要收回 Linux 社区的免费使用权。

Linus 可以向 BitMover 公司道个歉,保证以后严格管教弟兄们,嗯,这是不可能的。实际情况 是这样的:

Linus 花了两周时间自己用 C 写了一个分布式版本控制系统,这就是 Git!一个月之内,Linux 系统的源码已经由 Git 管理了!牛是怎么定义的呢?大家可以体会一下。

Git 迅速成为最流行的分布式版本控制系统,尤其是 2008 年,GitHub 网站上线了,它为开源项目免费提供 Git 存储,无数开源项目开始迁移至 GitHub, 包括 jQuery,PHP,Ruby 等等。

历史就是这么偶然,如果不是当年 BitMover 公司威胁 Linux 社区,可能现 在我们就没有免费而超级好用的 Git 了。

git 语法

git [--version] [--help] [-C <path>] [-c name=value]
   [--exec-path[=<path>]] [--html-path] [--man-path] [--info-path]
   [-p | --paginate | --no-pager] [--no-replace-objects] [--bare]
   [--git-dir=<path>] [--work-tree=<path>] [--namespace=<name>]
   <command> [<args>]

git 选项

add              将文件内容添加到索引
bisect           通过二进制查找引入错误的更改
branch           列出,创建或删除分支
checkout         检查分支或路径到工作树
clone            将存储库克隆到新目录中
commit           将更改记录到存储库
diff             显示提交,提交和工作树等之间的更改
fetch            从另一个存储库下载对象和引用
grep             打印匹配图案的行
init             创建一个空的Git仓库或重新初始化一个现有的
log              显示提交日志
merge            加入两个或更多的开发历史
mv               移动或重命名文件,目录或符号链接
pull             从另一个存储库或本地分支获取并合并
push             更新远程引用以及相关对象
rebase           转发端口本地提交到更新的上游头
reset            将当前HEAD复位到指定状态
rm               从工作树和索引中删除文件
show             显示各种类型的对象
status           显示工作树状态
tag              创建,列出,删除或验证使用GPG签名的标签对象

使用例子

init

git init #初始化

status

git status #获取状态

add

git add file # .或*代表全部添加
git rm --cached <added_file_to_undo> # 在commit之前撤销git add操作
git reset head # 好像比上面git rm --cached更方便

commit

git commit -m "message" #此处注意乱码

remote

git remote add origin git@github.com:JSLite/test.git #添加源

push

git push -u origin master # push同事设置默认跟踪分支
git push origin master
git push -f origin master # 强制推送文件,缩写 -f(全写--force)

clone

git clone git://github.com/JSLite/JSLite.js.git
git clone git://github.com/JSLite/JSLite.js.git mypro #克隆到自定义文件夹
git clone [user@]example.com:path/to/repo.git/ #SSH协议还有 另一种写法。

git clone支持多种协议,除了HTTP(s)以外,还支持SSH、Git、本地文件协议等,下面是一些例 子。git clone <版本库的网址> <本地目录名>

$ git clone http[s]://example.com/path/to/repo.git/
$ git clone ssh://example.com/path/to/repo.git/
$ git clone git://example.com/path/to/repo.git/
$ git clone /opt/git/project.git
$ git clone file:///opt/git/project.git
$ git clone ftp[s]://example.com/path/to/repo.git/
$ git clone rsync://example.com/path/to/repo.git/

git 配置

首先是配置帐号信息 ssh -T git@github.com 测试。

修改项目中的个人信息

git help config # 获取帮助信息,查 看修改个人信息的参数
git config --global user.name "独特工具箱"        # 修改全局名字
git config --global user.email "example@qq.com"  # 修改全局邮箱
git config --list         # 查看配置的信息

配置自动换行

自动转换坑太大,提交到 git 是自 动将换行符转换为 lf

git config --global core.autocrlf input

常见使用场景

创建 SSH 密钥

这个密钥用来跟 github 通信,在本地终端里生成然后上传到 github

ssh-keygen -t rsa -C 'example@qq.com' # 生成密钥
ssh-keygen -t rsa -C "example@qq.com" -f ~/.ssh/ww_rsa # 指定生成目录文件名字
ssh -T git@github.com # 测试是否成功

多账号 ssh 配置

1、生成指定名字的密钥

ssh-keygen -t rsa -C "邮箱地址" -f ~/.ssh/jslite_rsa
会生成 jslite_rsajslite_rsa.pub 这两个文件

2、密钥复制到托管平台上

vim ~/.ssh/jslite_rsa.pub
打开公钥文件 jslite_rsa.pub ,并把内容复制至代码托管平台上

3、修改config文件

vim ~/.ssh/config #修改config文件, 如果没有创建 config

Host jslite.github.com
  HostName github.com
  User git
  IdentityFile ~/.ssh/jslite_rsa

Host work.github.com
  HostName github.com
  # Port 服务器open-ssh端口(默认:22,默认时一般不写此行)
  # PreferredAuthentications 配置登录时用什么权限认证
  # publickey|password publickey|keyboard-interactive 等
  User git
  IdentityFile ~/.ssh/work_rsa
  • Host 这里是个别名可以随便命名
  • HostName 一般是网站如:git@ss.github.com:username/repo.git 填写 github.com
  • User 通常填写git
  • IdentityFile 使用的公钥文件地址

4、测试

ssh -T git@jslite.github.com  # @ 后面跟上定义的Host
ssh -T work.github.com        # 通过别名测试
ssh -i ~/公钥文件地址 Host别名  # 如 ssh -i ~/.ssh/work_rsa work.github.com

5、使用

# 原来的写法
git clone git@github.com:<jslite的用户名>/learngit.git
# 现在的写法
git clone git@jslite.github.com:<jslite的用户名>/learngit.git
git clone git@work.github.com:<work的用户名>/learngit.git

6、注意事项

如果你修改了 id_rsa 的名字,你需要将 ssh key 添加到 SSH agent 中,如:

ssh-add ~/.ssh/jslite_rsa
ssh-add -l  # 查看所有的key
ssh-add -D  # 删除所有的key
ssh-add -d  ~/.ssh/jslite_rsa # 删除指定的key

密码登录远程服务器

$ ssh-keygen -t rsa -P '' -f ~/.ssh/aliyunserver.key
$ ssh-copy-id -i ~/.ssh/aliyunserver.key.pub root@192.168.182.112 # 这里需要输入密码一次

编辑 ~/.ssh/config

Host aliyun1
  HostName 192.168.182.112
  User root
  PreferredAuthentications publickey
  IdentityFile ~/.ssh/aliyunserver.key

上面配置完了,可以通过命令登录,不需要输入IP地址和密码 ssh HotSvr

https 协议下提交代码免密码

git clone https://github.com/username/rep.git

通过上面方式克隆可能需要密码,解决办法:进入当前克隆的项目 vi rep/.git/config 编辑 config, 按照下面方式修改,你就可以提交代码不用输入密码了。

[core]
    repositoryformatversion = 0
    filemode = true
    bare = false
    logallrefupdates = true
    ignorecase = true
    precomposeunicode = true
[remote "origin"]
-   url = https://github.com/username/rep.git
+   url = https://用户名:密码@github.com/username/rep.git
    fetch = +refs/heads/*:refs/remotes/origin/*
[branch "master"]
    remote = origin
    merge = refs/heads/master

文件推向 3 个 git 库

1、增加 3 个远程库地址

git remote add origin https://github.com/JSLite/JSLite.git
git remote set-url --add origin https://gitlab.com/wang/JSLite.js.git
git remote set-url --add origin https://oschina.net/wang/JSLite.js.git

2、删除其中一个 set-url 地址

usage: git remote set-url [--push] <name> <newurl> [<oldurl>]
   or: git remote set-url --add <name> <newurl>
   or: git remote set-url --delete <name> <url>

git remote set-url --delete origin https://oschina.net/wang/JSLite.js.git

3、推送代码

git push origin master
git push -f origin master  # 强制推送

4、拉取代码

只能拉取 origin 里的一个 url 地址,这个 fetch-url 默认为你添加的到 origin的第一个地址。

git pull origin master
git pull --all # 获取远程所有内容包括tag
git pull origin next:master # 取回origin主机的next分支,与本地的master分支合并
git pull origin next # 远程分支是与当前分支合并

# 上面一条命令等同于下面两条命令
git fetch origin
git merge origin/next

如果远程主机删除了某个分支,默认情况下,git pull 不会在拉取远程分支的时候 ,删除对应的本地分支。这是为了防止,由于其他人操作了远程主机,导致 git pull 不知不觉删除了本地分支。

但是,你可以改变这个行为,加上参数 -p 就会在本地删除远程已经删除的分支。

$ git pull -p
# 等同于下面的命令
$ git fetch --prune origin
$ git fetch -p

5、更改 pull

只需要更改config文件里,那三个url的顺序即可,fetch-url会直接对应排行第一的那个utl连接。

修改远程仓库地址

git remote remove origin  # 删除该远程路径
git remote add origin git@jslite.github.com:JSLite/JSLite.git  # 添加远程路径

撤销远程记录

git reset --hard HEAD~1 # 撤销一条记录
git push -f origin HEAD:master # 同步到远程仓库

放弃本地的文件修改

# FETCH_HEAD 表示上一次成功 git pull 之后形成的 commit,然后 git pull
git reset --hard FETCH_HEAD

git reset --hard FETCH_HEAD 出现错误

git pull
You are not currently on a branch, so I cannot use any
'branch.<branchname>.merge' in your configuration file.
Please specify which remote branch you want to use on the command
line and try again (e.g. 'git pull <repository> <refspec>').
See git-pull(1) FOR details.

解决方法:

git checkout -b temp # 新建+切换到temp分支
git checkout master

最简单放弃本地修改内容

# 如果有的修改以及加入暂存区的话
git reset --hard
# 还原所有修改,不会删除新增的文件
git checkout .
# 下面命令会删除新增的文件
git clean -xdf

通过存储暂存区 stash,在删除暂存区的方法放弃本地修改。

git stash && git stash drop

回滚到某个 commit 提交

git revert HEAD~1 # 撤销一条记录 会弹出 commit 编辑
git push # 提交回滚

回退到某一个版本

git reset --hard <hash>
# 例如 git reset --hard a3hd73r
# --hard代表丢弃工作区的修改,让工作区与版本代码一模一样,与之对应,
# --soft参数代表保留工作区的修改。

去掉某个 commit

# 实质是新建了一个与原来完全相反的 commit,抵消了原来 commit 的效果
git revert <commit-hash>

新建一个空分支

# 这种方式新建的分支(gh-pages)是没有 commit 记录的
git checkout --orphan gh-pages

# 删除新建的 gh-pages 分支原本的内容,如果不删除,提交将作为当前分支的第一个 commit
git rm -rf .

# 查看一下状态 有可能上面一条命令,没有删除还没有提交的的文件
git state

合并多个 commit

# 这个命令,将最近4个commit合并为1个,HEAD代表当前版本。
# 将进入VIM界面,你可以修改提交信息。
git rebase -i HEAD~4

# 可以看到其中分为两个部分,上方未注释的部分是填写要执行的指令,
# 而下方注释的部分则是指令的提示说明。指令部分中由前方的命令名称、commit hash 和 commit message 组成
# 当前我们只要知道 pick 和 squash 这两个命令即可。
# --> pick 的意思是要会执行这个 commit
# --> squash 的意思是这个 commit 会被合并到前一个commit

# 我们将需要保留的 这个 commit 前方的命令改成 squash 或 s,然后输入 :wq 以保存并退出
# 这是我们会看到 commit message 的编辑界面

# 其中, 非注释部分就是两次的 commit message, 你要做的就是将这两个修改成新的 commit message。
#
# 输入 wq 保存并推出, 再次输入 git log 查看 commit 历史信息,你会发现这两个 commit 已经合并了。
# 将修改强制推送到前端
git push -f origin master

修改远程 Commit 记录

git commit --amend
# amend只能修改没有提交到线上的,最后一次 commit 记录
git rebase -i HEAD~3
# 表示要修改当前版本的倒数第三次状态
# 将要更改的记录行首单词 pick 改为 edit
pick 96dc3f9 doc: Update quick-start.md
pick f1cce8a test(Transition):Add transition test (#47)
pick 6293516 feat(Divider): Add Divider component.
# Rebase eeb03a4..6293516 onto eeb03a4 (3 commands)
#
# Commands:
# p, pick = use commit
# r, reword = use commit, but edit the commit message
# e, edit = use commit, but stop for amending
# s, squash = use commit, but meld into previous commit
# f, fixup = like "squash", but discard this commit's log message
# x, exec = run command (the rest of the line) using shell
# d, drop = remove commit

保存并退出,会弹出下面提示

# You can amend the commit now, with
#
#   git commit --amend
#
# Once you are satisfied with your changes, run
#
#   git rebase --continue

# 通过这条命令进入编辑页面更改commit,保存退出
git commit --amend

# 保存退出确认修改,继续执行 rebase,
git rebase --continue

# 如果修改多条记录反复执行上面两条命令直到完成所有修改

# 最后,确保别人没有提交进行push,最好不要加 -f 强制推送
git push -f origin master

添加忽略文件

echo node_modules/ >> .gitignore

提示:编写常见项目、开发语言、IDE 编辑器的 .gitignore 文件,推荐使用 .gitignore 生成工具

利用 commit 关闭一个 issue

这 个功能在 Github 上可以用,Gitlab 上特别老的版本不能用。那么如何跟随着 commit 关闭一个 issue 呢?

在 confirm merge 的时候可以使用一下命令来关闭相关 issue:

fixes #xxxfixed #xxxfix #xxxcloses #xxxclose #xxxclosed #xxx

同步 fork 的上游仓库

设置添加多个远程仓库地址。

在同步 之前,需要创建一个远程点指向上游仓库(repo)。如果你已经派生了一个原始仓库,可以按照如下方法做。

$ git remote -v
# List the current remotes (列出当前远程仓库)
# origin  https://github.com/user/repo.git (fetch)
# origin  https://github.com/user/repo.git (push)
$ git remote add upstream https://github.com/otheruser/repo.git
# Set a new remote (设置一个新的远程仓库)
$ git remote -v
# Verify new remote (验证新的原唱仓库)
# origin    https://github.com/user/repo.git (fetch)
# origin    https://github.com/user/repo.git (push)
# upstream  https://github.com/otheruser/repo.git (fetch)
# upstream  https://github.com/otheruser/repo.git (push)

同步更新仓库内容

同步上游仓库到你的仓库需要执行两步:首先你需要从远程拉去,之后你需要合并你希望的分支到你的本地副本分支 。从上游的存储库中提取分支以及各自的提交内容。 master 将被存储在本地分支机构 upstream/master

git fetch upstream
# remote: Counting objects: 75, done.
# remote: Compressing objects: 100% (53/53), done.
# remote: Total 62 (delta 27), reused 44 (delta 9)
# Unpacking objects: 100% (62/62), done.
# From https://github.com/ORIGINAL_OWNER/ORIGINAL_REPOSITORY
#  * [new branch]      master     -> upstream/master

检查你的 fork's 本地 master 分支

git checkout master
# Switched to branch 'master'

合并来自 upstream/master 的更改到本地 master 分支上。 这使你的前 fork's master 分支与上游资源库同步,而不会丢失你本地修改。

git merge upstream/master
# Updating a422352..5fdff0f
# Fast-forward
#  README                    |    9 -------
#  README.md                 |    7 ++++++
#  2 files changed, 7 insertions(+), 9 deletions(-)
#  delete mode 100644 README
#  create mode 100644 README.md

批量修改历史 commit 中的名字和邮箱

1、克隆仓库

注意参数,这个不是普通的 clone,clone 下来的仓库并不能参与开发

git clone --bare https://github.com/user/repo.git
cd repo.git

2、命令行中运行代码

OLD_EMAIL 原来的邮箱
CORRECT_NAME 更正的名字
CORRECT_EMAIL 更正的邮箱

将下面代码复制放到命令行中执行

git filter-branch -f --env-filter '
OLD_EMAIL="example@qq.com"
CORRECT_NAME="王晓东"
CORRECT_EMAIL="xiaodong.wang@qq.com"
if [ "$GIT_COMMITTER_EMAIL" = "$OLD_EMAIL" ]
then
    export GIT_COMMITTER_NAME="$CORRECT_NAME"
    export GIT_COMMITTER_EMAIL="$CORRECT_EMAIL"
fi
if [ "$GIT_AUTHOR_EMAIL" = "$OLD_EMAIL" ]
then
    export GIT_AUTHOR_NAME="$CORRECT_NAME"
    export GIT_AUTHOR_EMAIL="$CORRECT_EMAIL"
fi
' --tag-name-filter cat -- --branches --tags

执行过程

Rewrite 485d2f9910e6f6df3820563bfd13b5f1fb9ba832 (479/508) (16 seconds passed, remaining 0 predicted)
Ref 'refs/heads/dev' was rewritten
Ref 'refs/heads/master' was rewritten

3、同步到远程仓库

同步到 push 远程 git 仓库

git push --force --tags origin 'refs/heads/*'

我还遇到了如下面错误,lab 默认给 master 分支加了保护,不允许强制覆盖。Project(项目)->Setting->Repository 菜单下面的Protected branches把 master 的保护去掉就可以了。修改完之后,建议把 master 的保护再加回来,毕竟强推不是件好事。

remote: GitLab: You are not allowed to force push code to a protected branch on this project.

当上面的 push 不上去的时候,先 git pull 确保最新代码

git pull  --allow-unrelated-histories
# 或者指定分枝
git pull origin master --allow-unrelated-histories

查看某个文件历史

git log --pretty=oneline 文件名  # 列出文件的所有改动历史
git show c178bf49   # 某次的改动的修改记录
git log -p c178bf49 # 某次的改动的修改记录
git blame 文件名     # 显示文件的每一行是在那个版本最后修改。
git whatchanged 文件名  # 显示某个文件的每个版本提交信息:提交日期,提交人员,版本号,提交备注(没有修改细节)

打造自己的 git 命令

git config --global alias.st status
git config --global alias.br branch
git config --global alias.co checkout
git config --global alias.ci commit

配置好后再输入 git 命令的时候就不用再输入一大段了,例如我们 要查看状态,只需:

git st

中文乱码的解决方案

git config --global core.quotepath false

新建仓库

init

git init # 初始化

status

git status # 获取状态

add

git add file # . 或 * 代表全部添加
git rm --cached <added_file_to_undo> # 在 commit 之前撤销 git add 操作
git reset head # 好像比上面git rm --cached更方便

commit

git commit -m "message" # 此处注意乱码

remote

git remote add origin git@github.com:JSLite/test.git # 添加源

push

git push -u origin master # push同事设置默认跟踪分支
git push origin master
git push -f origin master # 强制推送文件,缩写 -f(全写--force)

clone

git clone git://github.com/JSLite/JSLite.js.git
git clone git://github.com/JSLite/JSLite.js.git mypro # 克隆到自定义文件夹
git clone [user@]example.com:path/to/repo.git/ # SSH协议 还有另一种写法。

git clone 支持多种协议,除了 HTTP(s) 以外,还支持 SSH、Git、本地文件协议等,下面 是一些例子。git clone <版本库的网址> <本地目录名>

$ git clone http[s]://example.com/path/to/repo.git/
$ git clone ssh://example.com/path/to/repo.git/
$ git clone git://example.com/path/to/repo.git/
$ git clone /opt/git/project.git
$ git clone file:///opt/git/project.git
$ git clone ftp[s]://example.com/path/to/repo.git/
$ git clone rsync://example.com/path/to/repo.git/

本地

help

git help config # 获取帮助信息

add

git add *   # 跟踪新文件
git add -u [path]   # 添加[指定路径下]已跟踪文件

rm

rm *&git rm *          # 移除 文件
git rm -f *            # 移除文件
git rm --cached *      # 取消跟踪
git mv file_from file_to  # 重命名跟踪文件
git log   # 查看提交记录

commit

git commit # 提交更新
git commit -m 'message' # 提交说明
git commit -a # 跳过使用暂存区域,把所有已经跟踪过的文件暂存起来一并提交
git commit --amend # 修改最后一次提交
git commit log # 查看所有提交,包括没有 push 的 commit
git commit -m "#133" # 关联 issue 任意位置带上 # 符号加上 issue 号码
git commit -m "fix #133" # commit 关闭 issue
git commit -m '概要描述'$'\n\n''1.详细描述'$'\n''2.详细描述' # 提交简要描述和详细描述

reset

git reset HEAD *  # 取消已经暂存的文件
git reset --mixed HEAD * # 同上
git reset --soft HEAD *  # 重置到指定状态,不会修改索引区和工作树
git reset --hard HEAD *  # 重置到指定状态,会修改索引区和工作树
git reset -- files *     # 重置index区文件

revert

git revert HEAD   # 撤销前一次操作
git revert HEAD~  # 撤销前前一次操作
git revert commit # 撤销指定操作

checkout

git checkout -- file  # 取消对文件的修改(从暂存区——覆盖 worktree file)
git checkout branch|tag|commit -- file_name  # 从仓库取出 file 覆盖当前分支
git checkout HEAD~1 [文件]  # 将会更新 working directory 去匹配某次 commit
git checkout -- .          # 从暂存区取出文件覆盖工作区
git checkout -b gh-pages  0c304c9  # 这个表示 从当前分支 commit 哈希值为 0c304c9 的节点,分一个新的分支 gh-pages 出来,并切换到 gh-pages

diff

git diff file     # 查看指定文件的差异
git diff --stat   # 查看简单的 diff 结果
git diff  # 比较 Worktree 和 Index 之间的差异
git diff --cached   # 比较 Index 和 HEAD 之间的差异
git diff HEAD       # 比较 Worktree 和 HEAD 之间的差异
git diff branch     # 比较 Worktree 和 branch 之间的差异
git diff branch1 branch2  # 比较两次分支之间的差异
git diff commit commit    # 比较两次提交之间的差异
git diff master..test   # 上面这条命令只显示两个分支间的差异
git diff master...test    # 你想找出 master, test 的共有父分支和 test 分支之间的差异,你用3个 . 来取代前面的两个 .

stash

git stash # 将工作区现场(已跟踪文件)储藏起来,等以后恢复后继续工作 。
git stash list  # 查看保存的工作现场
git stash apply # 恢复工作现场
git stash drop  # 删除 stash 内容
git stash pop   # 恢复的同时直接删除 stash 内容
git stash apply stash@{0} # 恢复指定的工作现场,当你保存了不只一份工作现场时。

merge

git merge --squash test # 合并压缩,将 test 上的 commit 压缩为一条

cherry-pick

git cherry-pick commit    # 拣选合并,将 commit 合并到当前分支
git cherry-pick -n commit # 拣选多个提交,合并完后可以继续拣选下一个提交

rebase

git rebase master   # 将 master 分之上超前的提交,变基到当前分支
git rebase --onto master 169a6  # 限制回滚范围,rebase 当前分支从 169a6 以后的提交
git rebase --interactive # 交互模式,修改 commit
git rebase --continue    # 处理完冲突继续合并
git rebase --skip        # 跳过
git rebase --abort       # 取消合并 

分支branch

删除

git push origin :branchName  # 删除远程分支
git push origin --delete new # 删除远程分支 new
git branch -d branchName     # 删除本地分支,强制删除用 -D
git branch -d test      # 删除本地 test 分支
git branch -D test      # 强制删除本地 test 分支
git remote prune origin # 远程删除了,本地还能看到远程存在,这条命令删除远程不存在的分支

提交

git push -u origin branchName # 提交分支到远程 origin 主机中

拉取

git fetch -p #拉取远程分支时,自动清理 远程分支已删除,本地还存在的对应同名分支。

分支合并

git merge branchName      # 合并分支 - 将分支 branchName 和当前所在分支合并
git merge origin/master   # 在本地分支上合并远程分支。
git rebase origin/master  # 在本地分支上合并远程分支。
git merge test            # 将 test 分支合并到当前分支

重命名

git branch -m old new #重命名分支

查看

git branch      # 列出本地分支
git branch -r   # 列出远端分支
git branch -a   # 列出所有分支
git branch -v   # 查看各个分支最后一个提交对象的信息
git branch --merge      # 查看已经合并到当前分支的分支
git branch --no-merge   # 查看为合并到当前分支的分支
git remote show origin  # 可以查看 remote 地址,远程分支

新建

git branch test # 新建test分支
git branch newBrach 3defc69 # 指定哈希 3defc69,新建分支名字为 newBrach
git checkout -b newBrach origin/master # 取回远程主机的更新以后,在它的基础上创建一个新的分支
git checkout -b newBrach 3defc69 # 以哈希值3defc69,新建 newBrach 分支,并切换到该分支

连接

git branch --set-upstream dev origin/dev     # 将本地 dev 分支与远程 dev 分支之间建立链接
git branch --set-upstream master origin/next # 手动建立追踪关系

分支切换

git checkout test     # 切换到 test 分支
git checkout -b test  # 新建+切换到 test 分支
git checkout -b test dev # 基于 dev 新建 test 分支,并切换

远端

git fetch <远程主机名> <分支名>   # fetch 取回所有分支(branch)的更新
git fetch origin remotebranch[:localbranch]   #  从远端拉去分支[到本地指定分支]
git merge origin/branch   # 合并远端上指定分支
git pull origin remotebranch:localbranch  #  拉去远端分支到本地分支
git push origin branch    # 将当前分支,推送到远端上指定分支
git push origin localbranch:remotebranch  # 推送本地指定分支,到远端上指定分支
git push origin :remotebranch   # 删除远端指定分支
git checkout -b [--track] test origin/dev # 基于远端 dev 分支,新建本地 test 分支[同时设置跟踪]

submodule

克隆项目同时克隆 submodule

git clone https://github.com/jaywcjlove/handbook.git --depth=1 --recurse-submodules

克隆项目,之后再手动克隆 submodule 子项目

git submodule add --force '仓库地址' '路径'
# 其中,仓库地址是指子模块仓库地址,路径指将子模块放置在当前工程下的路径。
# 注意:路径不能以 / 结尾(会造成修改不生效)、不能是现有工程已有的目录(不能顺利的 Clone)
git submodule init # 初始化 submodule
git submodule update # 更新 submodule(必须在根目录执行命令)
git submodule update --init --recursive  # 下载的工程带有 submodule

当使用git clone下来的工程中带有 submodule 时,初始的时候,submodule 的内容并不会自动下载下来的,此时,只需执行如下命令 :

git submodule foreach git pull  # submodule 里有其他的 submodule 一次更新
git submodule foreach git pull origin master # submodule 更新

git submodule foreach --recursive git submodule init
git submodule foreach --recursive git submodule update

删除文件

git rm -rf node_modules/

remote

git 是一个分布式代码管理工具,所以可以支持多个仓库,在 git 里,服务器上的仓库 在本地称之为 remote。个人开发时,多源用的可能不多,但多源其实非常有用。

git remote add origin1 git@github.com:yanhaijing/data.js.git
git remote    # 显示全部源
git remote -v # 显示全部源+详细信息
git remote rename origin1 origin2 # 重命名
git remote rm origin    # 删除
git remote show origin  # 查看指定源的全部信息

标签tag

当开发到一定阶段时,给程序打标签 是非常棒的功能。

git tag -a v0.1 -m 'my version 1.4' # 新建带注释标签
git push origin --tags              # 一次性推送所有分支
git push origin v1.5                # 推送单个tag到orgin源上
git tag -v v1.4.2.1                 # 验证标签,验证已经签署的标签
git show v1.5                       # 看到对应的 GPG 签

git tag        # 列出现有标签
git tag v0gi.1 # 新建标签
git checkout tagname   # 切换到标签
git tag -d v0.1 # 删除标签
git push origin :refs/tags/v0.1 # 删除远程标签
git pull --all # 获取远程所有内容包括tag
git --git-dir='<绝对地址>/.git' describe --tags HEAD # 查看本地版本信息

日志log

git config format.pretty oneline  #显示历史记录时,每个提交的信息只显示一行
git config color.ui true #彩色的 git 输出
git log #查看最近的提交日志
git log --pretty=oneline #单行显示提交日志
git log --graph --pretty=oneline --abbrev-commit
git log -num #显示第几条log(倒数)
git reflog #查看所有分支的所有操作记录
git log --since=1.day #一天内的提交;你可以给出各种时间格式,比如说具体的某一天(“2008-01-15”),或者 是多久以前(“2 years 1 day 3 minutes ago”)。
git log --pretty="%h - %s" --author=自己的名字 #查看自己的日志
git log -p -2 #展开两次更新显示每次提交的内容差异
git log --stat #要快速浏览其他协作者提交的更新都作了哪些改动
git log --pretty=format:"%h - %an, %ar : %s"#定制要显示的记录格式
git log --pretty=format:'%h : %s' --date-order --graph # 拓扑顺序展示
git log --pretty=format:'%h : %s - %ad' --date=short #日期YYYY-MM-DD显示
git log <last tag> HEAD --pretty=format:%s # 只显示commit
git config --global format.pretty '%h : %s - %ad' --date=short #日期YYYY-MM-DD显示 写入全局配置
选项说明选项说明
%H提交对象(commit)的完整哈希字串%ad作者修订日期(可以用 -date= 选项定制格式)
%h提交对象的简短哈希字串%ar作者修订日期,按多久以前的方式显示
%T树对象(tree)的完整哈希字串%cn提交者(committer)的名字
%t树对象的简短哈希字串%ce提交者的电子邮件地址
%P父对象(parent)的完整哈希字串%cd提交日期
%p父对象的 简短哈希字串%cr提交日期,按多久以前的方式显示
%an作者(author)的名字%s提交说明
%ae作者的电子邮件地址--

重写历史

git commit --amend    # 改变最近一次提交
git rebase -i HEAD~3  # 修改最近三次的提交说明,或者其中任意一次
git commit --amend    # 保存好了,这些指示很明确地告诉了你该干什么
git rebase --continue # 修改提交说明,退出编辑器。
pick f7f3f6d changed my name a bit
pick 310154e updated README formatting and added blame
pick a5f4a0d added cat-file

改成

pick 310154e updated README formatting and added blame
pick f7f3f6d changed my name a bit

删除仓库

cd ..
rm -rf repo.git

其它

git help *  # 获取命令的帮助信息
git status  # 获取当前的状态,非常有用,因为git会提示接下来的能做的操作

报错问题解决

1、git fatal: protocol error: bad line length character: No s

解决办法 :更换remote地址为 http/https

2、The requested URL returned error: 403 Forbidden while accessing

解决 github push 错误的办法:

#vim 编辑器打开 当前项目中的config文件
vim .git/config

#修改
[remote "origin"]
    url = https://github.com/jaywcjlove/example.git

#为下面代码
[remote "origin"]
    url = https://jaywcjlove@github.com/jaywcjlove/example.git

3、git status 显示中文问题

在查看状态的时候 git status 如果是中文就显示下面的情况

\344\272\247\345\223\201\351\234\200\346\261\202

解决这个问题方法是:

git config --global core.quotepath false

gpm 命令

说明

gpm 命令是 Linux 的虚拟控制台下的鼠标服务器,用于在虚拟控制台下实现鼠标复制和粘贴文本的功能。

语法

gpm [选项]

选项

-a:设置加速值
-b:设置波特率
-B:设置鼠标按键次序
-m:指定鼠标设备文件
-t:设置鼠标类型

id 命令

说明

id 命令可以显示真实有效的用户ID(UID)和组ID(GID)。UID 是对一个用户的单一身份标识。组ID(GID)则对应多个UID。id 命令已经默认预装在大多数Linux系统中。要使用它,只需要在你的控制台输入 id 即可。

当我们想知道某个用户的 UID 和 GID 时,id 命令是非常有用的。一些程序可能需要 UID/GID 来运行。id 使我们更加容易地找出用户的 UID 以 GID 而不必在 /etc/group 文件中搜寻。如往常一样,你可以 在控制台输入 man id 进入 id 的手册页来获取更多的详情。

语法

id [-gGnru]--[help][--version][用户名称]

选项

-g或--group   显示用户所属群组的ID。
-G或--groups   显示用户所属附加群组的ID。
-n或--name    显示用户,所属群组或附加群组的名称。
-r或--real    显示实际ID。
-u或--user    显示用户ID。
-help         显示帮助。
-version      显示版本信息。

实例

[root@localhost ~]# id
uid=0(root) gid=0(root) groups=0(root),1(bin),2(daemon),3(sys),4(adm),6(disk),10(wheel)

解释:用户 root 的 UID 号码等于 0,GID 号码等于0。用户 root 是下面组的成员:

  • root 组 GID 号是:0
  • bin 组 GID 号是:1
  • daemon 组 GID 号是:2
  • sys 组 GID 号是:3
  • adm 组 GID 号是:4
  • disk 组 GID 号是:6
  • wheel 组 GID 号是:10

打印用户名、UID 和该用户所属的所有组,要这么做,我们可以使用 -a 选项:

[root@localhost ~]# id -a
uid=0(root) gid=0(root) groups=0(root),1(bin),2(daemon),3(sys),4(adm),6(disk),10(wheel)

输出所有不同的组 ID ,有效的,真实的和补充的,我们可以使用 -G 选项来实现:

[root@localhost ~]# id -G
0 1 2 3 4 6 10

结果只会显示 GID 号。你可以和/etc/group文件比较。下面是/etc/group文件的示例内容:

只输出有效的组 ID,通过使用 -g 选项来只输出有效组ID:

[root@localhost ~]# id -g
0

输出特定用户信息,我们可以输出特定的用户信息相关的UID和GID。只需要在 id 命令后跟上用户名:

[root@localhost ~]# id www
uid=500(www) gid=500(www) groups=500(www)

ip 命令

说明

ip 命令用来显示或操纵 Linux 主机的路由、网络设备、策略路由和隧道,是 Linux 下功能强大的网络配置工具。除此以外,还可以使用本站提供 的 IP 查询工具 来查看指定 IP 地址的具体信息。

语法

ip [选项] [参数]
Usage: ip [ OPTIONS ] OBJECT { COMMAND | help }
       ip [ -force ] -batch filename

选项

OBJECT := { link | address | addrlabel | route | rule | neigh | ntable |
       tunnel | tuntap | maddress | mroute | mrule | monitor | xfrm |
       netns | l2tp | macsec | tcp_metrics | token }

-V:显示指令版本信息
-s:输出更详细的信息
-f:强制使用指定的协议族
-4:指定使用的网络层协议是 IPv4 协议
-6:指定使用的网络层协议是 IPv6 协议
-0:输出信息每条记录输出一行,即使内容较多也不换行显示
-r:显示主机时,不使用IP地址,而使用主机的域名

参数

OPTIONS := { -V[ersion] | -s[tatistics] | -d[etails] | -r[esolve] |
        -h[uman-readable] | -iec |
        -f[amily] { inet | inet6 | ipx | dnet | bridge | link } |
        -4 | -6 | -I | -D | -B | -0 |
        -l[oops] { maximum-addr-flush-attempts } |
        -o[neline] | -t[imestamp] | -ts[hort] | -b[atch] [filename] |
        -rc[vbuf] [size] | -n[etns] name | -a[ll] }

网络对象:指定要管理的网络对象;
具体操作:对指定的网络对象完成具体操作;
help:显示网络对象支持的操作命令的帮助信息。

实例

ip link show                     #  显示网络接口信息
ip link set eth0 upi             # 开启网卡
ip link set eth0 down            # 关闭网卡
ip link set eth0 promisc on      # 开启网卡的混合模式
ip link set eth0 promisc offi    # 关闭网卡的混个模式
ip link set eth0 txqueuelen 1200 # 设置网卡队列长度
ip link set eth0 mtu 1400        # 设置网卡最大传输单元
ip addr show     # 显示网卡IP信息
ip addr add 192.168.0.1/24 dev eth0 # 设置eth0网卡IP地址192.168.0.1
ip addr del 192.168.0.1/24 dev eth0 # 删除eth0网卡IP地址

ip route show # 显示系统路由
ip route add default via 192.168.1.254   # 设置系统默认路由
ip route list                 # 查看路由信息
ip route add 192.168.4.0/24  via  192.168.0.254 dev eth0 # 设置192.168.4.0网段的网关为192.168.0.254,数据走eth0接口
ip route add default via  192.168.0.254  dev eth0        # 设置默认网关为192.168.0.254
ip route del 192.168.4.0/24   # 删除192.168.4.0网段的网关
ip route del default          # 删除默认路由
ip route delete 192.168.1.0/24 dev eth0 # 删除路由

1、用 ip 命令显示网络设备的运行状态

[root@localhost ~]# ip link list
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436 qdisc noqueue
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast qlen 1000
    link/ether 00:16:3e:00:1e:51 brd ff:ff:ff:ff:ff:ff
3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast qlen 1000
    link/ether 00:16:3e:00:1e:52 brd ff:ff:ff:ff:ff:ff

2、显示更加详细的设备信息

[root@localhost ~]# ip -s link list
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436 qdisc noqueue
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    RX: bytes  packets  errors  dropped overrun mcast
    5082831    56145    0       0       0       0
    TX: bytes  packets  errors  dropped carrier collsns
    5082831    56145    0       0       0       0
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast qlen 1000
    link/ether 00:16:3e:00:1e:51 brd ff:ff:ff:ff:ff:ff
    RX: bytes  packets  errors  dropped overrun mcast
    3641655380 62027099 0       0       0       0
    TX: bytes  packets  errors  dropped carrier collsns
    6155236    89160    0       0       0       0
3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast qlen 1000
    link/ether 00:16:3e:00:1e:52 brd ff:ff:ff:ff:ff:ff
    RX: bytes  packets  errors  dropped overrun mcast
    2562136822 488237847 0       0       0       0
    TX: bytes  packets  errors  dropped carrier collsns
    3486617396 9691081  0       0       0       0     

3、显示核心路由表

[root@localhost ~]# ip route list
112.124.12.0/22 dev eth1  proto kernel  scope link  src 112.124.15.130
10.160.0.0/20 dev eth0  proto kernel  scope link  src 10.160.7.81
192.168.0.0/16 via 10.160.15.247 dev eth0
172.16.0.0/12 via 10.160.15.247 dev eth0
10.0.0.0/8 via 10.160.15.247 dev eth0
default via 112.124.15.247 dev eth1

4、显示邻居表

[root@localhost ~]# ip neigh list
112.124.15.247 dev eth1 lladdr 00:00:0c:9f:f3:88 REACHABLE
10.160.15.247 dev eth0 lladdr 00:00:0c:9f:f2:c0 STALE

5、获取主机所有网络接口

ip link | grep ^[0-9] | awk -F: '{print $2}'

jed 命令

说明

jed命令 是由 Slang 开发,其主要用用途是编辑程序的源代码。它支持彩色语法加亮显示,可以模拟 Emacs,EDT,wordstar 和 Brief 编 辑器。

语法

jed [选项] [文件...]

选项

-2:显示上下两个编辑区;
-batch:以批处理模式来执行;
-f<函数>:执行 Slang 函数;
-g<行数>:移到缓冲区中指定的行数;
-i<文件>:将指定的文件载入缓冲区;
-n:不要载入 jed.rc 配置文件;
-s<字符串>:查找并移到指定的字符串。

参数

文件:指定待编辑的文件列表

实例

以上下两个编辑区的方式,开启 mysource.c 原始代码文件。若要切换编辑区,可利用稍后 介绍的命令,开启操作命令,开启功能表后,按 3 ,再按 2 ,即可切换编辑区:

jed -2 mysource.c

操作

有些 Emacs 的组合键和 jed 菜单组合键冲突例如 Alt + f 在 Emacs 中应该是“前进一个单词”,而在 jed 中则是“文件菜单”。如果要使用 Emacs 风格的组合键,打开 /usr/share/jed/lib/menus.slc 文件,并找到如下段落:

unsetsetkey ("selectmenubar", "\em");
unsetsetkey ("@\emF", "\ef");
unsetsetkey ("@\emE", "\ee");
unsetsetkey ("@\emo", "\eo");
% Mode menu unsetsetkey ("@\emS", "\es");
unsetsetkey ("@\emB", "\eb");
unsetsetkey ("@\emi", "\ei");
unsetsetkey ("@\emH", "\eh");
unset_setkey ("@\emy", "\ey");

可以根据自己的需要修改,也可以简单的注释掉;使用菜单可以用 F10 键。

由于 Jed 可模拟多种编辑器,其各自按键指令也有所不同。这里以模拟 Emacs 为例,说明在编辑器中的操作方法。

jed 相关的重要文件

# 这是默认的运行 jed slang 的文件
/usr/share/jed/lib/*.sl

# 这是默认的启动文件
/usr/share/jed/lib/site.sl

# 这是全局系统配置文件
/etc/jed.rc

# 这是用户配置文件
~/.jedrc

joe 命令

说明

joe 命令是一款功能强大的纯文本编辑器,拥有众多编写程序和文本的优良特性。

语法

joe [选项] [参数]

选项

-force:强制在最后一行的结尾处加上换行符号
-lines<行数>:设置行数
-lightoff:选取的区块在执行完区块命令后,就会恢复成原来的状态
-autoindent:自动缩排
-backpath:<目录>:指定备份文件的目录
-beep:编辑时,若有错误即发出哔声
-columns<栏位>:设置栏数
-csmode:可执行连续查找模式
-dopadding:是程序跟tty间存在缓冲区
-exask:在程序中,执行 Ctrl+K+X 时,会先确认是否要保存文件
-force:强制在最后一行的结尾处加上换行符号
-help:执行程序时一并显示帮助
-keepup:在进入程序后,画面上方为状态列
-marking:在选取区块时,反白区块会随着光标移动
-mid:当光标移出画面时,即自动卷页,使光标回到中央
-nobackups:不建立备份文件
-nonotice:程序执行时,不显示版本信息
-nosta:程序执行时,不显示状态列
-noxon:尝试取消 Ctrl+SCtrl+Q 键的功能
-orphan:若同时开启一个以上的文件,则其他文件会置于独立的缓冲区,而不会另外开启编辑区
-pg<行数>:按 PageUpPageDown 换页时,所要保留前一页的行数
-skiptop<行数>:不使用屏幕上方指定的行数

参数

文件:指定要编辑的文件。

ld 命令

说明

ld 命令是二 进制工具集 GNU Binutils 的一员,是 GNU 链接器,用于将目标文件与库链 接为可执行程序或库文件。

语法

ld [选项] [目标文件...]

选项

-b:
                指定目标代码输入文件的格式
-Bstatic:                       只使用静态库
-Bdynamic:                      只使用动态库
-Bsymbolic:                     把引用捆绑到共享库中的全局符号
-c:                             从指定的命令文件读取命令
--cref:                         创建跨引用表
-d:                             设置空格给通用符号,即使指定了可重定位输出
-defsym:                        在输出文件中创建指定的全局符号
-demangle:                      在错误消息中还原符号名称
-e:                             使用指定的符号作为程序的初始执行点
-E:                             对于 ELF 格式文件,把所有符号添加到动态符号表
-f:                             对于 ELF 格式共享对象,设置 DT_AUXILIARY 名称
-F:                             对于 ELF 格式共享对象,设置 DT_FILTER 名称
-format:                        指定目标代码输入文件的格式 (和 -b 相同)
-g:                             被忽略。用于提供和其他工具的兼容性
-h:                             对于 ELF 格式共享对象,设置 DT_SONAME 名称
-i:                             执行增量连接
-l:                             把指定的存档文件添加到要连接的文件清单
-L:                             把指定的路径添加添加到搜索库的目录清单
-M:                             显示连接映射,用于诊断目的
-Map:                           创建指定的文件来包含连接映射
-m:                             模拟指定的连接器
-N:                             指定读取/写入文本和数据段
-n:                             设置文本段为只读
-noinhibit-exec:                生成输出文件,即使出现非致命连接错误
-no-keep-memory:                为内存使用优化连接
-no-warn-mismatch:              允许连接不匹配的目标文件
-O:                             生成优化了的输出文件
-o:                             指定输出文件的名称
-oformat:                       指定输出文件的二进制格式
-R:                             从指定的文件读取符号名称和地址
-r:                             生成可重定位的输出(称为部分连接)
-rpath:                         把指定的目录添加到运行时库搜索路径
-rpath-link:                    指定搜索运行时共享库的目录
-S:                             忽略来自输出文件的调试器符号信息
-s:                             忽略来自输出文件的所有符号信息
-shared:                        创建共享库
-sort-common:                   在输出文件中不按照长度对符号进行排序
-split-by-reloc:                按照指定的长度在输出文件中创建额外的段
-split-by-file:                 为每个目标文件在输出文件中创建额外的段
--section-start:                在输出文件中指定的地址定位指定的段
-T:                             指定命令文件 (和 -c 相同)
-Ttext:                         使用指定的地址作为文本段的起始点
-Tdata:                         使用指定的地址作为数据段的起始点
-Tbss:                          使用指定的地址作为 bss 段的起始点
-t:                             在处理输入文件时显示它们的名称
-u:                             强制指定符号在输出文件中作为未定义符号
-warn-common:                   当一个通用符号和另一个通用符号结合时发出警告
-warn-constructors:             如果没有使用任何全局构造器,则发出警告
-warn-once:                     对于每个未定义的符号只发出一次警告
-warn-section-align:            如果为了对齐而改动了输出段地址,则发出警告
--whole-archive:                对于指定的存档文件,在存档中包含所有文件
-X:                             删除所有本地临时符号
-x:                             删除所有本地符号

参数

目标文件:指定需要连接的目标文件

实例

链接目标文件生成可执行文件。给定 C++ 目标文件 test.omain.o,生成可执行文件 mylib.out

ld /usr/lib64/crt1.o /usr/lib64/crti.o /usr/lib64/crtn.o /usr/lib/gcc/x86_64-redhat-linux/4.8.5/crtbegin.o /usr/lib/gcc/x86_64-redhat-linux/4.8.5/crtend.o -L/usr/lib/gcc/x86_64-redhat-linux/4.8.5 -L/usr/lib64 -L/usr/lib -lstdc++ -lm -lgcc_s -lc -lgcc  main.o mylib.o -o test.out

ldd 命令

说明

ldd 命令用于打印程序或者库文件所依赖的共享库列表。

语法

ldd [选项] [参数]

选项

--version:打印指令版本号
-v:详细信息模式,打印所有相关信息
-u:打印未使用的直接依赖
-d:执行重定位和报告任何丢失的对象
-r:执行数据对象和函数的重定位,并且报告任何丢失的对象和函数
--help:显示帮助信息

参数

文件:指定可执行程序或者文库。

补充说明

首先 ldd 不是一个可执行 程序,而只是一个 shell 脚本

ldd 能够显示可执行模块的 dependency,其原理是通过设置一系列的环境变量 ,如下:LD_TRACE_LOADED_OBJECTSLD_WARN、LD_BIND_NOWLD_LIBRARY_VERSIONLD_VERBOSE 等。当 LD_TRACE_LOADED_OBJECTS 环境变量不为空时,任何可执行程序在运行时,它都会只显示模块的 dependency,而程序并不真正执行。要不你可以在 shell 终端测试一下,如下:

export LD_TRACE_LOADED_OBJECTS=1

再执行任何的程序,如 ls 命令 等,看看程序的运行结果。

ldd 显示可执行模块的 dependency 的工作原理,其实质是通过 ld-linux.so(elf 动态库的装载器)来实现的。我们知道,ld-linux.so 模块会先于 executable 模块程序工作,并获得控制权,因此当上述的那些环境变量被设置时,ld-linux.so 选择了显示可执行模块的 dependency。

实际上可以直接执行 ld-linux.so 模块,如:/lib/ld-linux.so.2 --list program(这相当于 ldd program

let 命令

说明

let命令 是 bash 中用于计算的工具,提供常用运算符还提供了方幂 ** 运算符。在变量的房屋计算中不需要加上 $ 来表示变量,如果表达式的值是非 0 ,那么返回的状态值是 0;否则,返回的状态值是 1

语法

let arg [arg ...]    #arg 代表运算式

用法

  • 自加操作 let no++
  • 自减操作let no--
  • 简写形式let no+=10let no-=20,分别等同于let no=no+10let no=no-20

注意:let 算数表达式中的运算符号,其前后均不能添加空格。比如:

错误:let a = 5+3
正确:let a=5+3

实例

#!/bin/bash
let a=5+4 b=9-3
echo $a $b
#!/bin/bash
let "t1 = ((a = 5 + 3, b = 7 - 1, c = 15 - 4))"
echo "t1 = $t1, a = $a, b = $b"

lha 命令

说明

lha 命令是 从 lharc 演变而来的压缩程序,文件经它压缩后,会另外产生具有 .lzh 扩展名的压缩 文件。

选项

-a或a:压缩文件,并加入到压缩文件内
-a<0/1/2>/u</0/1/2>   压缩文件时,采用不同的文件头
-c或c:压缩文件,重新建构新的压缩文件后,再将其加入
-d或d:从压缩文件内删除指定的文件
-<a/c/u>d或<a/c/u>d:压缩文件,然后将其加入,重新建构,更新压缩文件或,删除原始文件,也就是 把文件移到压缩文件中
-e或e:解开压缩文件
-f或f:强制执行lha命令,在解压时会直接覆盖已有的文件而不加以询问
-g或g:使用通用的压缩格式,便于解决兼容性的问题
-<e/x>i或<e/x>i:解开压缩文件时,忽略保存在压缩文件内的文件路径,直接将其解压后存放在现行目 录下或是指定的目录中
-l或l:列出压缩文件的相关信息
-m或m:此选项的效果和同时指定"-ad"选项相同
-n或n:不执行指令,仅列出实际执行会进行的动作
-<a/u>o或<a/u>o:采用 lharc 兼容格式,将压缩后的文件加入,更新压缩文件
-p或p:从压缩文件内输出到标准输出设备
-q或q:不显示指令执行过程
-t或t:检查备份文件内的每个文件是否正确无误
-u或u:更换较新的文件到压缩文件内
-u</0/1/2>或u</0/1/2>:在文件压缩时采用不同的文件头,然后更新到压缩文件内
-v或v:详细列出压缩文件的相关信息
-<e/x>w=<目的目录>或<e/x>w=<目的目录>:指定解压缩的目录
-x或x:解开压缩文件
-<a/u>z或<a/u>z:不压缩文件,直接把它加入,更新压缩文件

实例

lha -a abc.lhz a.b         # 压缩a.b文件,压缩后生成 abc.lhz 文件
lha -a abc2 /home/hnlinux  # 压缩目录
lha -xiw=agis abc          # 解压文件abc,到当前目录

ln 命令

说明

ln 命令用来为文件创 件连接,连接类型分为硬连接和符号连接两种,默认的连接类型是硬连接。如果要创建符号连接必须使用 -s 选项。

注意:符号链接文件不是一个独立的文件,它的许多属性依赖于源文件,所以给符号链接文件设置存取权限是没有意义的。

语法

ln [选项]... [-T] 目标 链接名  (第一种格式)

或者:
ln [选项]... 目标        (第二种格式)

或者:
ln [选项]... 目标... 目录  (第三种格式)

或者:
ln [选项]... -t 目录 目标...   (第四种格式)

选项

--backup[=CONTROL]          为每个已 存在的目标文件创建备份文件
-b                          类似 --backup,但不接受任何参数
-d, -F, --directory         创建指向目录的硬链接(只适用于超级用户)
-f, --force                 强行删除任何已存在的目标文件
-i, --interactive           覆盖既有文件之前先询问用户;
-L, --logical               取消引用作为符号链接的目标
-n, --no-dereference        把符号连接的目的目录视为一般文件;
-P, --physical              直接将硬链接到符号链接
-r, --relative              创建相对于链接位置的符号链接
-s, --symbolic              对源文件建立符号连接,而非硬连接;
-S, --suffix=SUFFIX         用 -b 参数备份目标文件后,备份文件的字尾会被加上一个备份字符串 ,
                            预设的备份字符串是符号 ~,用户可通过 -S 参数来改变它;
-t, --target-directory=DIRECTORY  指定要在其中创建链接的 DIRECTORY
-T, --no-target-directory   将 LINK_NAME 视为常规文件
-v, --verbose               打印每个链接文件的名称
--help                      显示此帮助信息并退出
--version                   显示版本信息并退出

参数

  • 源文件:指定连接的源文件。如果 使用 -s 选项创建符号连接,则“源文件”可以是文件或者目录。创建硬连接时,则“源文件”参数只 能是文件;
  • 目标文件:指定源文件的目标连接文件。
none, off       # 不进行备份(即使 使用了--backup 选项)
numbered, t     # 备份文件加上数字进行排序
existing, nil   # 若有数字的备份文件已经存在则使用数字,否则使用普通方式备份
simple, never   # 永远使用普通方式备份

实例

将目录 /usr/mengqc/mub1 下的文 件 m2.c 链接到目录 /usr/liu 下的文件 a2.c

cd /usr/mengqc
ln /mub1/m2.c /usr/liu/a2.c

在执行ln命令之前,目录 /usr/liu 中不存在 a2.c 文件。执行 ln 之后,在 /usr/liu 目录中才有 a2.c 这一项,表明 m2.ca2.c 链接起来(注意,二者在物理上是同一文件),利用ls -l命令可以看到链接数的变化。

在目录 /usr/liu 下建立一个符号链接文件 abc,使它指向目录 /usr/mengqc/mub1

ln -s /usr/mengqc/mub1 /usr/liu/abc

执行该命令后,/usr/mengqc/mub1 代表的路径将存放在名为 /usr/liu/abc 的文件中。

扩展阅读

Linux 具有为一个文件起多个名字的功能,称为链接。被链接的文件可以存放在相同的目录下,但是必须有不同的文件 名,而不用在硬盘上为同样的数据重复备份。另外,被链接的文件也可以有相同的文件名,但是存放在不同的目录下,这样只要对一个目录下的该文件进行修改,就可以完成对所有目录下同名链接文件的修改。对于某个文件的各链接文件,我们可以给它们指定不同的存取权限,以控制对信息的共享和增强安全性。

文件链接有两种形式,即硬链接符号链接

硬链接

建立硬链接时,在另外的目录或本目录中 增加目标文件的一个目录项,这样,一个文件就登记在多个目录中。如图所示的 m2.c 文件就在目录 mub1liu 中都建立了目录项。

创建硬链接后,己经存在的文件的 I 节点号(Inode)会被多个目录文件项使用。一个文件的硬链接数可以在目录的长列表格式的第二列中看到,无额外链接的文件的 链接数为 l

在默认情况下,ln 命令创建硬链接。ln 命令会增加链接数,rm 命令会减少链接数。一个文件除非链接数为 0,否则不会 从文件系统中被物理地删除。

对硬链接有如下限制:

  • 不能对目录文件做硬链接。
  • 不能 在不同的文件系统之间做硬链接。就是说,链接文件和被链接文件必须位于同一个文件系统中。

符号链接

符号链接也称为软链接,是将一个路径名链接到一个文件。这些文件是一种特别类型的文件。事实上,它只是一个文本文件,其中包含它提供链接的另一个文件的路径名,如图中虚线箭头所示。另一个文件是实际包含所有数据的文件。所有读、写文件内容的命令被用于符号链接时,将沿着链接方向前进来访问实际的文件。

与硬链接不 同的是,符号链接确实是一个新文件,当然它具有不同的 I 节点号;而硬链接并没有建立新文件。

符号链接没有硬链接的限制,可以对目录文件做符号链接,也可以在不同文件系统之间做符号链接。

ln -s 命令建立符号链接时,源文件最好用绝对路径名。这样可以在任何工作目录下进行符号链接。而当源文件用相对路 径时,如果当前的工作路径与要创建的符号链接文件所在路径不同,就不能进行链接。

符号链接保持了链接与 源文件或目录之间的区别:

  • 删除源文件或目录,只删除了数据,不会删除链接。一旦以同样文件名创建了源文件,链接将继续指向该文件的新数据。
  • 在目录长列表中,符号链接作为一种特殊的文件类型显示出来,其第一个字母是 l
  • 符号链接的大小是其链接文件的路径名中的字节数。
  • 当用ln -s命令列出文件时,可以看到符号链接名后有一个箭头指向源文件或目录,例如:lrwxrwxrwx … 14 jun 20 10:20 /etc/motd->/original_file。其中,表示“文件大小”的数字“14”恰好说明源文件名 original_file 由 14 个字符构成。

lp 命令

说明

lp 命令用 于打印文件,或者修改排队的打印任务。与 lpr 命令类似,lp 命令既支持文件输入也支持标准输入。它与 lpr 的不同之处在于它有一个不同(稍微复杂点)的参数选项设置。

语法

lp [选项] [参数]

选项

-E:与打印服务器连接时强制使用加密
-U:指定连接打印服务器时使用的用户名
-d:指定接收打印任务的目标打印机
-i:指定一个存在的打印任务号
-m:打印完成时发送E-mail
-n:指定打印的份数
-t:指定打印任务的名称
-H:指定打印任务开始的时间
-P:指定需要打印的页码

参数

文件:需打印的文件。

实例

要在连接在设备 dlp0 上的打印机 lp0 上打印文件 /etc/motd,请输入:

lp /etc/motd

要使用文件的一个副本打印 /etc/motd 文件的 30 个副本,并且要用邮件通知用户作业完成,请输入:

lp -c -m -n30 -dlp0:lpd0 /etc/motd

要使用后端标志 -f-a 并带上作业标题 blah 打印/etc/motd文件,请输入:

lp -t "blah" -o -f -o -a /etc/motd

要排队 MyFile 文件并返回作业编号,请输入:

lp myfile

要排队 MyFile 文件并禁止作业编号,请输入:

lp -s myfile

lpc 命令

说明

lpc 命令,是一种命令行方式打印机控制程序,有5个内置命令。

语法

lpc [参数]

常用参数

  • ?/help:显示帮助信息
  • exitquit:退出打印机命令行
  • status:显示打印机状态

实例

进入 lpc 命令:

[root@localhost ~]# lpc

显示打印机状态:

[root@localhost ~]# lpc --status

退出 lpc 命令:

[root@localhost ~]# lpc --exit

lpq 命令

说明

lpq 命令用于查看一个打印队列的状态,该程序可以查看打印机队列状态及其所包含的打印任务。如果命令选项事先未指定打印机,系统便会显示默认的打印机。

语法

lpq 选项

选项

-E:强制使用加密方式与服务器连接
-P:指定一个打印机名称或环境变量 PRINTER 指定的打印机
-U:指定一个用户名
-a:报告所有打印机目前的任务
-h:指定一个打印服务器
-l:使用长格式输出
+:指定显示状态的间隔时间

lpr 命令

说明

lpr 命令用于将文件发送给指定打印机进行打印,如果不指定目标打印机,则使用默认打印机。

语法

lpr [选项] [参数]

选项

-E:与打印服务器连接时强制使用加密
-H:指定可选的打印服务器
-C:指定打印任务的名称
-P:指定接受打印任务的目标打印机
-U:指定可选的用户名
-#:指定打印的份数
-h:关闭banner打印
-m:打印完成后发送E-mail
-r:打印完成后删除文件

参数

文件:需打印的文件。

实例

man1man2 送到打印机 lp 进行打印:

lpr -P lp man1 man2

ls 命令

说明

ls 命令用来显示指定目 录下的文件列表,在 Linux 各个发行版中,ls 命令是一个高频使用的命令,需要熟练掌握。ls 命令根据传入的选项可以显示不同的输出格式,并且可以对输出结果进行彩色加亮显示,以分区不同类型的文 件。

语法

ls [选项] [目录或文件名]

选项

-a, --all     不隐藏任何以. 开始的项目
-A, --almost-all    列出除. 及.. 以外的任何项目
    --author      与-l 同时使用时列出每个文件的作者
-b, --escape      以八进制溢出序列表示不可打印的字符
    --block-size=SIZE      scale sizes by SIZE before printing them; e.g.,
                           '--block-size=M' prints sizes in units of
                           1,048,576 bytes; see SIZE format below
-B, --ignore-backups       do not list implied entries ending with ~
-c                         with -lt: sort by, and show, ctime (time of last
                           modification of file status information);
                           with -l: show ctime and sort by name;
                           otherwise: sort by ctime, newest first
-C                         list entries by columns
    --color[=WHEN]         colorize the output; WHEN can be 'never', 'auto',
                           or 'always' (the default); more info below
-d, --directory            list directories themselves, not their contents
-D, --dired                generate output designed for Emacs' dired mode
-f                         do not sort, enable -aU, disable -ls --color
-F, --classify             append indicator (one of */=>@|) to entries
    --file-type            likewise, except do not append '*'
    --format=WORD          across -x, commas -m, horizontal -x, long -l,
                           single-column -1, verbose -l, vertical -C
    --full-time            like -l --time-style=full-iso
-g  类似-l,但不列出所有者
    --group-directories-first
                           group directories before files;
                           can be augmented with a --sort option, but any
                           use of --sort=none (-U) disables grouping
-G, --no-group    以一个长列表的形式,不输出组名
-h, --human-readable    与-l 一起,以易于阅读的格式输出文件大小
      (例如 1K 234M 2G)
    --si      同上面类似,但是使用1000 为基底而非1024
-H, --dereference-command-line
                           follow symbolic links listed on the command line
    --dereference-command-line-symlink-to-dir
                           follow each command line symbolic link
                           that points to a directory
    --hide=PATTERN         do not list implied entries matching shell PATTERN
                           (overridden by -a or -A)
    --indicator-style=WORD append indicator with style WORD to entry names:
                           none (default), slash (-p),
                           file-type (--file-type), classify (-F)
-i, --inode                print the index number of each file
-I, --ignore=PATTERN       do not list implied entries matching shell PATTERN
-k, --kibibytes            default to 1024-byte blocks for disk usage
-l        使用较长格式列出信息
-L, --dereference   当显示符号链接的文件信息时,显示符号链接所指示
      的对象而并非符号链接本身的信息
-m        所有项目以逗号分隔,并填满整行行宽
-n, --numeric-uid-gid   类似 -l,但列出UID 及GID 号
-N, --literal     输出未经处理的项目名称 (如不特别处理控制字符)
-o        类似 -l,但不列出有关组的信息
-p,  --indicator-style=slash  对目录加上表示符号"/"
-q, --hide-control-chars   print ? instead of nongraphic characters
    --show-control-chars   show nongraphic characters as-is (the default,
                             unless program is 'ls' and output is a terminal)
-Q, --quote-name           enclose entry names in double quotes
    --quoting-style=WORD   use quoting style WORD for entry names:
                             literal, locale, shell, shell-always, c, escape
-r, --reverse     逆序排列
-R, --recursive   递归显示子目录
-s, --size      以块数形式显示每个文件分配的尺寸
-S                         sort by file size
    --sort=WORD            sort by WORD instead of name: none (-U), size (-S),
                           time (-t), version (-v), extension (-X)
    --time=WORD            with -l, show time as WORD instead of default
                           modification time: atime or access or use (-u)
                           ctime or status (-c); also use specified time
                           as sort key if --sort=time
    --time-style=STYLE     with -l, show times using style STYLE:
                           full-iso, long-iso, iso, locale, or +FORMAT;
                           FORMAT is interpreted like in 'date'; if FORMAT
                           is FORMAT1<newline>FORMAT2, then FORMAT1 applies
                           to non-recent files and FORMAT2 to recent files;
                           if STYLE is prefixed with 'posix-', STYLE
                           takes effect only outside the POSIX locale
-t                         sort by modification time, newest first
-T, --tabsize=COLS         assume tab stops at each COLS instead of 8
-u                         with -lt: sort by, and show, access time;
                           with -l: show access time and sort by name;
                           otherwise: sort by access time
-U                         do not sort; list entries in directory order
-v                         natural sort of (version) numbers within text
-w, --width=COLS           assume screen width instead of current value
-x                         list entries by lines instead of by columns
-X                         sort alphabetically by entry extension
-1                         list one file per line

SELinux options:

--lcontext                 Display security context.   Enable -l. Lines
                           will probably be too wide for most displays.
-Z, --context              Display security context so it fits on most
                           displays.  Displays only mode, user, group,
                           security context and file name.
--scontext                 Display only security context and file name.
--help                     显示此帮助信息并退出
--version                  显示版本信息并退出

参数

目录:指定要显示列表的目录,也可以 是具体的文件

实例

$ ls       # 仅列出当前目录可见文件
$ ls -l    # 列出当前目录可见文件详细信息
$ ls -hl   # 列出详细信息并以可读大小显示文件大小
$ ls -al   # 列出所有文件(包括隐藏)的详细信息

1、显示当前目录下包括隐藏文件在内的所有 文件列表

[root@localhost ~]# ls -a
.   anaconda-ks.cfg  .bash_logout   .bashrc  install.log         .mysql_history  satools  .tcshrc   .vimrc
..  .bash_history    .bash_profile  .cshrc   install.log.syslog  .rnd            .ssh     .viminfo

2、输出长格式列表

[root@localhost ~]# ls -1

anaconda-ks.cfg
install.log
install.log.syslog
satools

3、显示文件的 inode 信息

索引节点(index inode 简称为 inode)是 Linux 中一个特殊的概念,具有相同的索引节点号的两个文本本质上是同一个文件(除文件名不同外)。

[root@localhost ~]# ls -i -l anaconda-ks.cfg install.log
2345481 -rw------- 1 root root   859 Jun 11 22:49 anaconda-ks.cfg
2345474 -rw-r--r-- 1 root root 13837 Jun 11 22:49 install.log

4、水平输出文件列表

[root@localhost /]# ls -m

bin, boot, data, dev, etc, home, lib, lost+found, media, misc, mnt, opt, proc, root, sbin, selinux, srv, sys, tmp, usr, var

4、修改最后一次编辑的文件(最近修改的文件显示在最上面)

[root@localhost /]# ls -t

tmp  root  etc  dev  lib  boot  sys  proc  data  home  bin  sbin  usr  var  lost+found  media  mnt  opt  selinux  srv  misc

5、显示递归文件

[root@localhost ~]# ls -R
.:
anaconda-ks.cfg  install.log  install.log.syslog  satools

./satools:
black.txt  freemem.sh  iptables.sh  lnmp.sh  mysql  php502_check.sh  ssh_safe.sh

6、打印文件的 UID 和 GID

[root@localhost /]# ls -n

total 254
drwxr-xr-x   2 0 0  4096 Jun 12 04:03 bin
drwxr-xr-x   4 0 0  1024 Jun 15 14:45 boot
drwxr-xr-x   6 0 0  4096 Jun 12 10:26 data
drwxr-xr-x  10 0 0  3520 Sep 26 15:38 dev
drwxr-xr-x  75 0 0  4096 Oct 16 04:02 etc
drwxr-xr-x   4 0 0  4096 Jun 12 10:26 home
drwxr-xr-x  14 0 0 12288 Jun 16 04:02 lib
drwx------   2 0 0 16384 Jun 11 22:46 lost+found
drwxr-xr-x   2 0 0  4096 May 11  2011 media
drwxr-xr-x   2 0 0  4096 Nov  8  2010 misc
drwxr-xr-x   2 0 0  4096 May 11  2011 mnt
drwxr-xr-x   2 0 0  4096 May 11  2011 opt
dr-xr-xr-x 232 0 0     0 Jun 15 11:04 proc
drwxr-x---   4 0 0  4096 Oct 15 14:43 root
drwxr-xr-x   2 0 0 12288 Jun 12 04:03 sbin
drwxr-xr-x   2 0 0  4096 May 11  2011 selinux
drwxr-xr-x   2 0 0  4096 May 11  2011 srv
drwxr-xr-x  11 0 0     0 Jun 15 11:04 sys
drwxrwxrwt   3 0 0 98304 Oct 16 08:45 tmp
drwxr-xr-x  13 0 0  4096 Jun 11 23:38 usr
drwxr-xr-x  19 0 0  4096 Jun 11 23:38 var

7、列出文件和文件夹的详细信息

[root@localhost /]# ls -l

total 254
drwxr-xr-x   2 root root  4096 Jun 12 04:03 bin
drwxr-xr-x   4 root root  1024 Jun 15 14:45 boot
drwxr-xr-x   6 root root  4096 Jun 12 10:26 data
drwxr-xr-x  10 root root  3520 Sep 26 15:38 dev
drwxr-xr-x  75 root root  4096 Oct 16 04:02 etc
drwxr-xr-x   4 root root  4096 Jun 12 10:26 home
drwxr-xr-x  14 root root 12288 Jun 16 04:02 lib
drwx------   2 root root 16384 Jun 11 22:46 lost+found
drwxr-xr-x   2 root root  4096 May 11  2011 media
drwxr-xr-x   2 root root  4096 Nov  8  2010 misc
drwxr-xr-x   2 root root  4096 May 11  2011 mnt
drwxr-xr-x   2 root root  4096 May 11  2011 opt
dr-xr-xr-x 232 root root     0 Jun 15 11:04 proc
drwxr-x---   4 root root  4096 Oct 15 14:43 root
drwxr-xr-x   2 root root 12288 Jun 12 04:03 sbin
drwxr-xr-x   2 root root  4096 May 11  2011 selinux
drwxr-xr-x   2 root root  4096 May 11  2011 srv
drwxr-xr-x  11 root root     0 Jun 15 11:04 sys
drwxrwxrwt   3 root root 98304 Oct 16 08:48 tmp
drwxr-xr-x  13 root root  4096 Jun 11 23:38 usr
drwxr-xr-x  19 root root  4096 Jun 11 23:38 var

8、列出可读文件和文件夹详细信息

[root@localhost /]# ls -lh

total 254K
drwxr-xr-x   2 root root 4.0K Jun 12 04:03 bin
drwxr-xr-x   4 root root 1.0K Jun 15 14:45 boot
drwxr-xr-x   6 root root 4.0K Jun 12 10:26 data
drwxr-xr-x  10 root root 3.5K Sep 26 15:38 dev
drwxr-xr-x  75 root root 4.0K Oct 16 04:02 etc
drwxr-xr-x   4 root root 4.0K Jun 12 10:26 home
drwxr-xr-x  14 root root  12K Jun 16 04:02 lib
drwx------   2 root root  16K Jun 11 22:46 lost+found
drwxr-xr-x   2 root root 4.0K May 11  2011 media
drwxr-xr-x   2 root root 4.0K Nov  8  2010 misc
drwxr-xr-x   2 root root 4.0K May 11  2011 mnt
drwxr-xr-x   2 root root 4.0K May 11  2011 opt
dr-xr-xr-x 235 root root    0 Jun 15 11:04 proc
drwxr-x---   4 root root 4.0K Oct 15 14:43 root
drwxr-xr-x   2 root root  12K Jun 12 04:03 sbin
drwxr-xr-x   2 root root 4.0K May 11  2011 selinux
drwxr-xr-x   2 root root 4.0K May 11  2011 srv
drwxr-xr-x  11 root root    0 Jun 15 11:04 sys
drwxrwxrwt   3 root root  96K Oct 16 08:49 tmp
drwxr-xr-x  13 root root 4.0K Jun 11 23:38 usr
drwxr-xr-x  19 root root 4.0K Jun 11 23:38 var

9、显示文件夹信息

[root@localhost /]# ls -ld /etc/

drwxr-xr-x 75 root root 4096 Oct 16 04:02 /etc/

10、按时间列出文件和文件夹详细信息

[root@localhost /]# ls -lt

total 254
drwxrwxrwt   3 root root 98304 Oct 16 08:53 tmp
drwxr-xr-x  75 root root  4096 Oct 16 04:02 etc
drwxr-x---   4 root root  4096 Oct 15 14:43 root
drwxr-xr-x  10 root root  3520 Sep 26 15:38 dev
drwxr-xr-x  14 root root 12288 Jun 16 04:02 lib
drwxr-xr-x   4 root root  1024 Jun 15 14:45 boot
drwxr-xr-x  11 root root     0 Jun 15 11:04 sys
dr-xr-xr-x 232 root root     0 Jun 15 11:04 proc
drwxr-xr-x   6 root root  4096 Jun 12 10:26 data
drwxr-xr-x   4 root root  4096 Jun 12 10:26 home
drwxr-xr-x   2 root root  4096 Jun 12 04:03 bin
drwxr-xr-x   2 root root 12288 Jun 12 04:03 sbin
drwxr-xr-x  13 root root  4096 Jun 11 23:38 usr
drwxr-xr-x  19 root root  4096 Jun 11 23:38 var
drwx------   2 root root 16384 Jun 11 22:46 lost+found
drwxr-xr-x   2 root root  4096 May 11  2011 media
drwxr-xr-x   2 root root  4096 May 11  2011 mnt
drwxr-xr-x   2 root root  4096 May 11  2011 opt
drwxr-xr-x   2 root root  4096 May 11  2011 selinux
drwxr-xr-x   2 root root  4096 May 11  2011 srv
drwxr-xr-x   2 root root  4096 Nov  8  2010 misc

11、按修改时间列出文件和文件夹详细信息

[root@localhost /]# ls -ltr

total 254
drwxr-xr-x   2 root root  4096 Nov  8  2010 misc
drwxr-xr-x   2 root root  4096 May 11  2011 srv
drwxr-xr-x   2 root root  4096 May 11  2011 selinux
drwxr-xr-x   2 root root  4096 May 11  2011 opt
drwxr-xr-x   2 root root  4096 May 11  2011 mnt
drwxr-xr-x   2 root root  4096 May 11  2011 media
drwx------   2 root root 16384 Jun 11 22:46 lost+found
drwxr-xr-x  19 root root  4096 Jun 11 23:38 var
drwxr-xr-x  13 root root  4096 Jun 11 23:38 usr
drwxr-xr-x   2 root root 12288 Jun 12 04:03 sbin
drwxr-xr-x   2 root root  4096 Jun 12 04:03 bin
drwxr-xr-x   4 root root  4096 Jun 12 10:26 home
drwxr-xr-x   6 root root  4096 Jun 12 10:26 data
dr-xr-xr-x 232 root root     0 Jun 15 11:04 proc
drwxr-xr-x  11 root root     0 Jun 15 11:04 sys
drwxr-xr-x   4 root root  1024 Jun 15 14:45 boot
drwxr-xr-x  14 root root 12288 Jun 16 04:02 lib
drwxr-xr-x  10 root root  3520 Sep 26 15:38 dev
drwxr-x---   4 root root  4096 Oct 15 14:43 root
drwxr-xr-x  75 root root  4096 Oct 16 04:02 etc
drwxrwxrwt   3 root root 98304 Oct 16 08:54 tmp

12、按照特殊字符对文件进行分类

[root@localhost nginx-1.2.1]# ls -F

auto/  CHANGES  CHANGES.ru  conf/  configure*  contrib/  html/  LICENSE  Makefile  man/  objs/  README  src/

13、列出文件并标记颜色分类

[root@localhost nginx-1.2.1]# ls --color=auto

auto  CHANGES  CHANGES.ru  conf  configure  contrib  html  LICENSE  Makefile  man  objs  README  src

man 命令

说明

man 命令 是 Linux 下的帮助指令,通过 man 指令可以查看 Linux 中的某个指令的帮助信息,包括命令的基本介绍、使用方法 、支持的选项和参数等,对了解一个命令的具体用法非常有帮助。

语法

man [选项] [数字|关键字]

选项

-a:在所有的man帮助手册中搜索
-f:等价于 whatis 指令,显示给定关键字的简短描述信息
-P:指定内容时使用分页程序
-M:指定 man 手册搜索的路径

参数

  • 数字:指定从哪本 man 手册中搜索帮助
  • 关键 字:指定要搜索帮助的关键字

数字代表内容

1:用户在 shell 环境可操作的命令或执行文件
2:系统内核可调用的函数与工具等
3:一些常用的函数(function)与函数库(library),大部分为 C 的函数库(libc)
4:设备文件说明,通常在 /dev 下的文件
5:配置文件或某些文件格式
6:游戏(games)
7:惯例与协议等,如 Linux 文件系统,网络协议,ASCII code 等说明
8:系统管理员可用的管理命令
9:跟 kernel 有关的文件

实例

在终端命令行输入 man ls,它会在最左上角显示 LS (1),在这里,LS 表示手册名称,而 (1) 表示该手册位于第一节章;同样,当输 man ifconfig 它会 在最左上角显示 IFCONFIG (8)。当然,还可以这样输入命令:man [章节号] 手册名称

man 是按照手册的章节号的顺序进行搜索的,比如:

man sleep

只会显示 sleep 命令的手册,如果想查看库函数 sleep,就要输入:

man 3 sleep

mv 命令

说明

mv 命令 用来对文件或目录重新命名,或者将文件从一个目录移到另一个目录中。常见的用法为 mv [options] source target,其中,source 参数表示源文件或目录,target 参数表示目标文件或目录。如果将一个文件移到一个已经存在的目标文件中,则目标文件的内容将被覆盖。

mv 命令可以用来将源文件移至一个目标文件中,或将一组文件移至一个目标目录中。源文件被移至目标文件有两种不同的结果:

  1. 如果目标文件是到某一目录文件的路径,源文件会被移到此目录下,且文件名不变。
  2. 如果目标文件不是目录文件,则源文件名 (只能有一个)会变为此目标文件名,并覆盖己存在的同名文件。如果源文件和目标文件在同一个目录下,mv 的作用 就是改文件名。当目标文件是目录文件时,源文件或目录参数可以有多个,则所有的源文件都会被移至目标文件中。所有移到该目录下的文件都将保留以前的文件名。

注意事项:mv 命令与 cp 命令的结果不同,mv 类似于文件 “搬家”,文件个数并未增加。而 cp 则是对文件进行复制,文件个数增加了。

语法

mv [选项] [参数]

选项

  • --backup=<备份模式>:若需覆盖文件,则覆盖前先行备份;
  • -b:当文件存在时,覆盖前,为其创建一个备份;
  • -f:若目标文件或目录与现有的文件或目录重复,则直接覆盖现有的文件或目录;
  • -i:交互式 操作,覆盖前先行询问用户,如果源文件与目标文件或目标目录中的文件同名,则询问用户是否覆盖目标文件。用户输入”y”,表示将覆盖目标文件;输入”n”,表示取消对源文件的移动。这样可以避免误将文件覆盖。
  • --strip-trailing-slashes:删除源文件中的斜杠“/”;
  • -S<后缀>:为备 份文件指定后缀,而不使用默认的后缀;
  • --target-directory=<目录>:指定源文件要移动到目标目录;
  • -u:当源文件比目标文件新或者目标文件不存在时,才执行移动操作
  • -v:在移动过程中,显示移动过程的详细信息(通常用于移动大批量文件时,通过该参数,可以实时了解文件移动的过程)

参数

  • 源文件:源文件列表。
  • 目标文件:如果“目标文件”是文件名则在移动文件的同时,将其改名为“目标文件”;如果“目标文件”是目录名则将源文件移动到“目标文件”下。

实例

1、将目录 /usr/men 中的所有文件移到当前目录中(用 . 表示当前目录):

mv /usr/men/* .

2、移动文件到指定目录

mv file_1.txt /home/office/

3、同时移动多个文件到指定目录

mv file_2.txt file_3.txt file_4.txt /home/office/
mv *.txt /home/office/

4、移动目录到另一个目录

mv directory_1/ /home/office/

5、重命名文件

# 将文件 file_1.txt 改名为 file_2.txt
mv file_1.txt file_2.txt

6、重命名目录

mv directory_1/ directory_2/

7、移动文件 时打印详细信息

mv -v *.txt /home/office

8、移动文件时提示是否覆盖文件

mv -i file_1.txt /home/office

9、当源文件比目标文件新时才执行更新

mv -uv *.txt /home/office

10、移动文件时不要覆盖任何已存在的文件

mv -vn *.txt /home/office

11、复制时创建备份

mv -bv *.txt /home/office

12、强制覆盖已经存在的文件

mv -f *.txt /home/office

nl 命令

说明

nl 命令读取 file 参数(缺省情况下标准输入),计算输入中的行号,将计算过的行号写入标准输出。在输出中,nl 命 令根据您在命令行中指定的标志来计算左边的行。输入文本必须写在逻辑页中。每个逻辑页有头、主体和页脚节(可以有空节)。除非使用-p 选项,nl 命令在每个逻辑页开始的地方重新设置行号。可以单独为头、主体和页脚节设置行计算标志(例如,头和页脚行可以被计算然而文本行不能)。其默认的结果与 cat -n 有点不太一样。nl 提供了丰富的功能将行号做不同的显示设计,包括位数与是否自动补齐 0 等功能。

语法

nl [选项] [参数]

选项

-b :指定行号指定的方式,主要有两 种:
    -b a :表示不论是否为空行,也同样列出行号(类似 cat -n)
    -b t :如果有空行,空的那一行不要列出行号(默认值)

-n :列出行号表示的方法,主要有三种:
    -n ln :行号在萤幕的最左方显示
    -n rn :行号在自己栏位的最右方显示,且不加 0
    -n rz :行号在自己栏位的最右方显示,且加 0

-w :行号栏位的占用的位数
-p :在逻辑定界符处不重新开始计算

实例

1、用 nl 列出 log2019.log 的内容

root@localhost [test]# nl log2019.log
1 2019-01
2 2019-02

3 ======[root@localhost test]#

说明:文件中的空白行,nl 不会加上行号

2、用 nl 列出 log2019.log 的内容,空本行也加上行号

[root@localhost test]# nl -b a log2019.log
1 2019-01
2 2019-02
3
4
5 ======[root@localhost test]#

3、让行号前面自动补上 0,统一输出格式:

[root@localhost test]# nl -b a -n rz log2019.log
000001 2019-01
000002 2019-02
000003 2019-03
000004 2019-04
000005 2019-05
000006 2019-06
000007 2019-07
000008 2019-08
000009 2019-09
000010 2019-10
000011 2019-11
000012 2019-12
000013 =======

[root@localhost test]# nl -b a -n rz -w 3 log2019.log
001 2019-01
002 2019-02
003 2019-03
004 2019-04
005 2019-05
006 2019-06
007 2019-07
008 2019-08
009 2019-09
010 2019-10
011 2019-11
012 2019-12
013 =======

说明:nl -b a -n rz 命令行号默认为 6 位,要调整位数可以加上参数 -w 3 调整为 3 位。

php 命令

说明

php 命令是 Web 开 发语言 PHP 的命令行接口,利用好 PHP 命令行工具,可以开发出功能强大的基于命令行的系统管理脚本程序。

工具推荐:
本站提供了 PHP 反序列化工具,可还原已经序列化(serialized)的字符串,该操作称为反序列化。

语法

php [选项] [参数]

PHP 命令常用选项

  • -a:进入 PHP 交互模式
  • -c::指定 php.ini 的搜索路径
  • -n:不使用任何 .ini 配置文件
  • -f <file>:解析并执行指定的 PHP 文件
  • -i:打印 PHP 信息
  • -m:显示已安装的 PHP 模块
  • -r <code>:运行 PHP 代码,但不会使用脚本起始标签 <?..?>
  • -R <code>:运行每一行输入的 PHP 代码
  • -S <addr>:<port>:运行内置的 PHP 服务器
  • -t <docroot>:为内置 PHP 服务器指定文档根目 录
  • -s:输出高亮显示的 HTML 代码
  • -v:显示 PHP 版本信息
  • -w:去除注释和空格后,输出 PHP 源码
  • -z <file>:加载 file 对应的 Zend 扩展
  • -ini:显示 PHP 配置文件的名称和完整路径
  • --rf <name>:显示名称为 name 的方法的信息(方法签名)
  • --rc <name>:显示名称为 name 的类的信息
  • --re <name>:显示名称为 name 的扩展的信息
  • --rz <name>:显示名称 为 name 的 Zend 扩展的信息
  • --ri <name>:显示名称为 name 的扩展的配置信息

参数

  • 文件:要执行的 PHP 脚本文件

ps 命令

说明

ps 命令用于报告 当前系统的进程状态。可以搭配 kill 指令随时中断、删除不必要的程序。ps 命令是最基本同时也是非常强大的进程 查看命令,使用该命令可以确定有哪些进程正在运行和运行的状态、进程是否结束、进程有没有僵死、哪些进程占用了过多的资源等等,总之大部分信息都是可以通过执行该命令得到的。

语法

ps [选项]

选 项

-a:显示所有终端机下执行的程序,除了阶段作业领导者之外
a:显示现行终端机下的所有程序,包括其他用户的程序
-A:显示所有程序
-c:显示 CLS 和 PRI 栏位
c:列出程序时,显示每个程序真正的指令名称,而不包含路径,选项或常驻服务的标示
-C<指令名称>:指定执行指令的名称,并列出该指令的程序的状况
-d:显示所有程序,但不包括阶段作业领导者的程序
-e:此选项的效果和指定 A 选项相同
e:列出程序时,显示每个程序所使用的环境变量
-f:显示 UID, PPIP, C 与 STIME 栏位
f:用 ASCII 字符 显示树状结构,表 达程序间的相互关系
-g<群组名称>:此选项的效果和指定 -G 选项相同,当亦能使用阶段作业领导者的名称来指定
g:显示现行终端机下的所有程序,包括群组领导者的程序
-G<群组识别码>:列出属于该群组的程序的状况,也可使用群组名称来指定
h:不显示标题列
-H:显示树状结构,表示程序间的相互关系
-j或j:采用工作控制的格式显示程序状况
-l或l:采用详细的格式来显示程序状况
L:列出栏位的相关信息
-m或m:显示所有的执行绪
n:以数字来表示 USER 和 WCHAN 栏位
-N:显示所有的程序,除了执行 ps 指令终端机下的程序之外
-p<程序识别码>:指定程序识别码,并列出该程序的状况
p<程序识别码>:此选项的效果和指定 -p 选项相同,只在列表格式方面稍有差异
r:只列出现行终端机正在执行中的程序
-s<阶段作业>:指定阶段作业的程序识别码,并列出隶属该阶段作业的程序的状况
s:采用程序信号的格式显示程序状况
S:列出程序时,包括已中断的子程序资料
-t<终端机编号>:指定终端机编号,并列出属于该终端机的程序的状况
t<终端机编号>:此选项的效果和指定 -t 选项相同,只在列表格式方面稍有差异
-T:显示现行终端机下的所有程序
-u<用户识别码>:此选项的效果和指定 -U 选项相同
u:以用户为主的格式来显示程序状况
-U<用户识别码>:列出属于该用户的程序的状况,也可使用用户名称来指定
U<用户名称>:列出属于该用户的程序的状况
v:采用虚拟内存的格式显示程序状况
-V或V:显示版本信息
-w或w:采用宽阔的格式来显示程序状况 
x:显示所有程序,不以终端机来区分
X:采用旧式的 Linux i386 登陆格式显示程序状况
-y:配合选项 -l 使用时,不显示 F(flag) 栏位,并以 RSS 栏位取代 ADDR 栏位 
-<程序识别码>:此选项的效果和指定 p 选项相同
--cols<每列字符数>:设置每列的最大字符数
--columns<每列字符数>:此选项的效果和指定 --cols 选项相同
--cumulative:此选项的效果和指定 S 选项相同
--deselect:此选项的效果和指定 -N 选项相同
--forest:此选项的效果和指定 f 选项相同
--headers:重复显示标题列
--help:在线帮助
--info:显示排错信息
--lines<显示列数>:设置显示画面的列数
--no-headers:此选项的效果和指定 h 选项相同,只在列表格式方面稍有差异
--group<群组名称>:此选项的效果和指定 -G 选项相同
--Group<群组识别码>:此选项的效果和指定 -G 选项相同
--pid<程序识别码>:此选项的效果和指定 -p 选项相同
--rows<显示列数>:此选项的效果和指定 --lines 选项相同
--sid<阶段作业>:此选项的效果和指定 -s 选项相同
--tty<终端机编号>:此选项的效果和指定 -t 选项相同
--user<用户名称>:此选项的效果和指定 -U 选项相同
--User<用户识别码>:此选项的效果和指定 -U 选项相同
--version:此选项的效果和指定 -V 选项相同
--widty<每列字符数>:此选项的效果和指定 -cols 选项相同

从上面列表可以看出,ps 命令的支持的选项非常多,是因为 ps 命令能够支持的系统类型相当的多,所以选项也相应的多。

实例

按内存资源的使用量对进程进行排序

ps aux | sort -rnk 4

按 CPU 资源的 使用量对进程进行排序

ps aux | sort -nk 3

pwd 命令

说明

pwd 命令,它以绝对路径的方式显示用 户当前工作目录。命令将当前目录的全路径名称(从根目录)写入标准输出(stdout)。输出的工作目录使用/ 分隔。第一个 / 表示系统根目录,最后一个目录是当前目录。执行 pwd 命令可 立刻得知您目前所在的工作目录的绝对路径名称。

pwd 命令是一个无副作用的、高频使用的 Linux 命令

语法

pwd [选项]

选项

  • --help:显示帮助信息
  • --version:显示版本信息

实例

# 显示当前目录
[root@localhost ~]# pwd
/usr/local/bin

rm 命令

说明

rm 命令可以删 除一个目录中的一个或多个文件或目录,也可以将某个目录及其下属的所有文件及其子目录均删除掉。对于链接文件,只是删除整个链接文件,而原有文件保持不变。

注意:

使用 rm 命令要格外小心,因为一旦删除了一个文件,就无法再恢复它。所以,在删除文件之前,最好再 看一下文件的内容,确定是否真要删除。

rm 命令可以用 -i 选项,这个选项在使用文件扩展名 字符删除多个文件时特别有用。使用这个选项,系统会要求你逐一确定是否要删除。这时,必须输入 y 并按 Enter 键确认,才能删除文件。如果仅按 Enter 键或其他字符,文件不会被删除。

语法

rm  [选项] [参数]

选项

-d:直接把欲删除的目录的硬连接数据删除成 0,删除该目录
-f:强制删除文件或目录
-i:删除已有文件或目录之前先询问用户
-r或-R:递归处理,将指定目录下的所有文件与子目录一并处理
--preserve-root:不对根目录进行递归操作
-v:显示指令的详细执行过程

参数

文件:指定被删除的文件列表,如果参数中含有目录,则必须加上 -r 或者 -R 选项。

实例

1、交互式删除当前目录下的文件 testexample

rm -i test example
Remove test ?n(不删除文件test)
Remove example ?y(删除文件example)

2、删除当前目录下除隐含文件外的所有文件和子目录

# rm -r *

应注意,这样做是非常危险的!

3、rm 命令删除文件

# rm 文件1 文件2 ...
rm testfile.txt

4、rm 命令删除目录

rm -r [目录名称]
-r 表示递归地删除目录下的所有文件和目录。
-f 表示强制删除

rm -rf testdir
rm -r testdir

5、删除操作前有确认提示

rm -i [文件/目录]
rm -r -i testdir

6、rm 忽略不存在的文件或目录

-f 选项(LCTT 译注:即 “force”)让此次操作强制执行,忽略错误提示
rm -f [文件...]

7、仅在某些场景下确认删除

选项 -I,可保证在删除超过 3  个文件时或递归删除时(LCTT 译注: 如删除目录)仅提示一次确认。
rm -I file1 file2 file3

8、删除根目录(慎用)

# 请务必谨慎使用
rm -rf /

删除根目录 / 是 Linux 用户最不想要的操作,这也就是为什么默认 rm 命令不支持在根目录上执行递归删除操作。然而,如果你非得完成这个操作,你需要使用 --no-preserve-root 选 项。当提供此选项,rm 就不会特殊处理根目录 / 了。

rpm 命令

说明

rpm 命令是 RPM 软件包的管理工具。rpm 原本是 Red Hat Linux 发行版专门用来管理 Linux 各项套件的程 序,由于它遵循 GPL 规则且功能强大方便,因而广受欢迎,逐 渐受到其他发行版的采用。RPM 套件管理方式的出现,让 Linux 下的软件易于安装、升级和卸载,提升了 Linux 系统使用的友好程度。

语法

rpm [选项] [软件包]

选项

-a:查询所有套件
-b<完成阶段><套件档>+或-t <完成阶段><套件档>+:设置包装套件的完成阶段,并指定套 件档的文件名称
-c:只列出组态配置文件,本参数需配合 -l 参数使用
-d:只列出文本文件,本参数需配合 -l 参数使用
-e<套件档>或--erase<套件档>:删除指定的套件
-f<文件>+:查询拥有指定文件的套件
-h或--hash:套件安装时列出标记
-i:显示套件的相关信息
-i<套件档>或--install<套件档>:安装指定的套件档
-l:显示套件的文件列表
-p<套件档>+:查询指定的 RPM 套件档
-q:使用询问模式,当遇到任何问题时,rpm 指令会先询问用户
-R:显示套件的关联性信息
-s:显示文件状态,本参数需配合 -l 参数使用
-U<套件档>或--upgrade<套件档>:升级指定的套件档
-v:显示指令执行过程
-vv:详细显示指令执行过程,便于排错

参数

软件包:指定要操纵的 rpm 软件包。

实例

1、如何安装 rpm 软件包?

rpm 软件包的安装可以使用程序 rpm 来完成。执行 下面的命令:

rpm -ivh your-package.rpm

其中 your-package.rpm 是你要安装的rpm包的文件名,一般置于当前目录下。

安装过程中可能出现下面的警告或者提示:

... conflict with ...

可能是要安装的包里有一些文件可能会覆盖现有的文件,缺省时这样的情况下是无法正确安装的可以用 rpm --force -i 强制安装即可

... is needed by ...
... is not installed ...

此包需要的一些软件你没有安装可以用 rpm --nodeps -i 来忽略 此信息,也就是说 rpm -i --force --nodeps 可以忽略所有依赖关系和文件问题,什么包都能安装上,但这种强制安装的软件包不能保证完全发挥功能。

2、如何安装 .src.rpm 软件包?

有些软件包是以 .src.rpm 结尾的,这类软件包是包含了源代码的 rpm 包,在安装时需 要进行编译。这类软件包有两种安装方法:

方法一:

rpm -i your-package.src.rpm
cd /usr/src/redhat/SPECS
rpmbuild -bp your-package.specs             # 一个和你的软件包同名的 specs 文件
cd /usr/src/redhat/BUILD/your-package/      # 一个和你的软件包同名的目录
./configure                                 # 这一步和编译普通的源码软件一样,可以加上参数
make
make install

方法二:

rpm -i you-package.src.rpm
cd /usr/src/redhat/SPECS

前两步和方法一相同:

rpmbuild -bb your-package.specs       # 一个和你的软件包同名的 specs 文件

这时在 /usr/src/redhat/RPM/i386/(根据具体包的不同,也可能是 i686、noarch 等等)在这个目录下,有一个新的 rpm 包,这个是编译好的二进制文件。

执行 rpm -i new-package.rpm 即可安装完成。

3、如何卸载 rpm 软件包?

使用命令 rpm -e 包名,包名可以包含版本号等信息,但是不可以有后缀 .rpm,比如卸载软件包 proftpd-1.2.8-1,可以使用下列格式:

rpm -e proftpd-1.2.8-1
rpm -e proftpd-1.2.8
rpm -e proftpd-
rpm -e proftpd

下列格式是错误的:

rpm -e proftpd-1.2.8-1.i386.rpm
rpm -e proftpd-1.2.8-1.i386
rpm -e proftpd-1.2
rpm -e proftpd-1

有时会出现一些错误或者警告:

... is needed by ...

这说明这个软 件被其他软件需要,不能随便卸载,可以用 rpm -e --nodeps 强制卸载。

4、如何不安装但是获取 rpm 包中的文件?

使用工具 rpm2cpiocpio

rpm2cpio xxx.rpm | cpio -vi
rpm2cpio xxx.rpm | cpio -idmv
rpm2cpio xxx.rpm | cpio --extract --make-directories

参数 iextract 相同,表示提取文件。v 表示指示执行进程,dmake-directory 相同,表示根据包中文件原来的路径建立目录,m 表示保持文件的更新时间。

5、如何查看 与 rpm 包相关的文件和其他信息?

下面所有的例子都假设使用软件包 mysql-5.7.18b-5

5.1、我的系统中安装了那些 rpm 软件包?

rpm -qa 讲列出所有安装过的包

如果 要查找所有安装过的包含某个字符串 sql 的软件包:

rpm -qa | grep sql

5.2、如何获得某个软件包的文件全名?

rpm -q mysql

可以获得系统 中安装的 mysql 软件包全名,从中可以获得当前软件包的版本等信息。这个例子中可以得到信息 mysql-5.7.18b-5

5.3、一个 rpm 包中的文件安装到那里去了?

rpm -ql 包名

注意这里的 是不包括 .rpm 后缀的软件包的名称,也就是说只能用 mysql 或者 mysql-5.7.18b-5 而不是 mysql-5.7.18b-5.rpm。如果只是想知道可执行程序放到那里去了,也可以使用 which 命令,比如:

which mysql

5.4、一个 rpm 包中包含那些文件?

  • 一 个没有安装过的软件包,使用 rpm -qlp **** .rpm
  • 一个已经安装过的软件包,还可以使用 rpm -ql **** .rpm

5.5、如何获取关于一个软件包的版本,用途等相关信息?

  • 一个没有安装过的软件包,使用 rpm -qip **** .rpm
  • 一个已经安装过的软件包,还可以使 用 rpm -qi **** .rpm

5.6、某个程序是哪个软件包安装的,或者哪个软件包包含这个程 序?

# 返回软件包的全名
rpm -qf `which 程序名`

# 返回软件包的有关信息
rpm -qif `which 程序名`

# 返回软件包的文件列表
rpm -qlf `which 程序名`

注意,这里不是引号,而是`(就是键盘左上角的那个键)。也可以使用 rpm -qilf,同时输出软件包信息和文件列表。

5.7、某个文件是哪个软件包安装的,或者哪个软件包包含这个文件?

注意,前一个问题中的方法,只适用与可执行的程序, 而下面的方法,不仅可以用于可执行程序,也可以用于普通的任何文件。前提是知道这个文件名。首先获得这个程序的完整路径,可以用 whereis 或者 which,然后使用 rpm -qf,例如:

whereis ftptop
ftptop: /usr/bin/ftptop /usr/share/man/man1/ftptop.1.gz

rpm -qf /usr/bin/ftptop
proftpd-1.2.8-1

rpm -qf /usr/share/doc/proftpd-1.2.8/rfc/rfc0959.txt
proftpd-1.2.8-1

su 命令

说明

su 命令 用于把用户身份切换到其他用户身份,变更身份时,需要输入所要变更的用户帐号与密码。su 命令通常用于没有文件操作权限时的场景。

语法

su [选项] [用户]

选项

-c<指令>或--command=<指令>:执行完指定的指令后,即恢复原来的身份
-f:适用于 csh 和 tsch,使 shell 不用去读取启动文件
--fast:同 -f 选项
-l:当改变身份时,也同时变更工作目录,以及 HOME, SHELL, USERlogname
    相应的,也会变更 PATH 变量
--login:同 -l 选项
-m, -p:变更身份时,不要变更环境变量
--preserve-environment:同上
-s<shell>:指定要执行的 shell
--shell=<shell>:同上
--help:显示帮助
--version;显示版本信息

参数

用户:指定要切换身份的目标用户

实例

把当 前登录用户切换为 root 用户,并在执行 ls 指令后切换回原使用者:

su -c ls root

把当前登录用户切换为 root 用户,并传入 -f 选项给新执行的 shell:

su root -f

把当前登录用户切换为 test 用户,并改变工作目录至 test 用户的主目录:

su -test

sudo 命令

说明

sudo 命令 用来以其他身份来执行命令,预设的身份为 root 用户。在 /etc/sudoers 中配置了可执行 sudo 指令的用户。如果未授权的用户使用 sudo 指令,则会给系统管理员发出一封带有警告信息的邮件。当用户使用 sudo 命令时,必须先输入密码,之后有 5 分钟的有效期限,超过有效期则须重新输入密码。

语法

sudo [选项] [指令]

选项

-b:在后台执行指令
-k:结束密码的有效期限,也就是下次再执行 sudo 时便需要输入密码。
-l:列出目前用户可执行与无法执行的指令
-p:改变询问密码的提示符号
-s<shell>:执行指定的 shell
-u<用户>:以指定的用户作为新的身份。若不加上此参数,则预设以 root 作为新的身份
-h:显示帮助
-H:将 HOME 环境变量设为新身份的 HOME 环境变量
-v:延长密码有效期限5分钟
-V :显示版本信息

参数

指令:需要运行的指令和对应的参数

实例

$ sudo su -
# env | grep -E '(HOME|SHELL|USER|LOGNAME|^PATH|PWD|TEST_ETC|TEST_ZSH|TEST_PRO|TEST_BASH|TEST_HOME|SUDO)>

这个命令相当于使用 root 超级用户重新登录一次 shell,只不过密码是使用的当前用户的密码。而且,该命令会重新加载 /etc/profile 文件以及 /etc/bashrc 文件等系 统配置文件,并且还会重新加载 root 用户的 $SHELL 环境变量所对应的配置文件。

比如:root 超级用户的 $SHELL 是 /bin/bash,则会加载 /root/.bashrc 等配置。如果是 /bin/zsh,则会加载 /root/.zshrc 等配置,执行后是完全的 root 环境。

$ sudo -i
# env | grep -E '(HOME|SHELL|USER|LOGNAME|^PATH|PWD|TEST_ETC|TEST_ZSH|TEST_PRO|TEST_BASH|TEST_HOME|SUDO)>

这个命令基本与 sudo su - 相同,执行后也是 root 超级用户的环境,只不过是多了一 些当前用户的信息。

$ sudo -s
# env|grep -E '(HOME|SHELL|USER|LOGNAME|^PATH|PWD|TEST_ETC|TEST_ZSH|TEST_PRO|TEST_BASH|TEST_HOME|SUDO)'  --colo>

这个命令相当于以当前用户的 $SHELL 开启了一个 root 超级用户的 no-login 的 shell,不会加载 /etc/profile 等系统配置。所以 /etc/profile 文件中定义的 TEST_ETC 环境变量就看不到了,但是会加载 root 用户对应的配置文件,比如 root 用户的 $SHELL 是 /bin/zsh,那么会加载 /root/.zshrc 配置文件,执行完后,不会切换当前用户的目录 。

配置 sudo 必须通过编辑 /etc/sudoers 文件,而且只有超级用户才可以修改 ;另外,还必须使用 visudo 编辑。之所以使用 visudo,有两个原因:

  1. 能 够防止两个用户同时修改它;
  2. 也能进行有限的语法检查

所以,即使只有你一个超级用户,你也最好用 visudo 来检查一下语法。

visudo 默认的是在 vi 里打开配置文件,用 vi 来修改文件。我们可以在编译时修改这个默认项。visudo 不会擅自保存带有语法错误的配置文件,它会提示你出现 的问题,并询问该如何处理,就像:

>>> sudoers file: syntax error, line 22 <<

此时我们有三种选择:键入 e 是重新编辑,键入 x 是不保存退出,键入 Q 是退出并保存。如果选择 Q,那么 sudo 将不会再运行,直到错误被纠正。

现在,我们一起来看一下神秘的配置文件,学一下如何编写它。从一个简单的例子开始:让用户 foobar 可以通过 sudo 执行所有 root 可执行的命令。

以 root 身份用 visudo 打开配置文件,可以 看到类似下面几行:

# Runas alias specification
# User privilege specificationroot    ALL=(ALL)ALL

我们一看就明白个差不多了,root 有所有权限,只要仿照现有 root 的例子就行,我们在下面加一行(最好用 tab 作为空白):

foobar ALL=(ALL)    ALL

保存退出后,切换到 foobar 用户,我们用它的身份执行命令:

[foobar@localhost ~]$ ls /root
ls: /root: 权限不够

[foobar@localhost ~]$ sudo ls /root
PassWord:
anaconda-ks.cfg Desktop install.log install.log.syslog

好了,我们限制一下 foobar 的权利,不让他 为所欲为。比如我们只想让他像 root 那样使用 lsifconfig,把那一行改为:

foobar localhost=/sbin/ifconfig,/bin/ls

再来执行命令 :

[foobar@localhost ~]$ sudo head -5 /etc/shadow
Password:
Sorry, user foobar is not allowed to execute '/usr/bin/head -5 /etc/shadow' as root on localhost.localdomain.

[foobar@localhost ~]$ sudo /sbin/ifconfigeth0      Linkencap:Ethernet HWaddr 00:14:85:EC:E9:9B...

现在让我们来看一下那三个 ALL 到底是什么意思。

第一个 ALL 是指网络中的 主机,我们后面把它改成了主机名,它指明 foobar 可以在此主机上执行后面的命令。第二个括号里的 ALL 是指目标用户,也就是以谁的身份去执行命令。最后一个 ALL 当然就是指命令名了。例如,我们想让 foobar 用户在 Linux 主机上以 jimmy 或 rene 的身份执行 kill 命令,这样编写配置文件:

foobar linux=(jimmy,rene) /bin/kill

但这还有个问题,foobar 到底以 jimmy 还是 rene 的身份执行?这时我们应该想到了 sudo -u了,它正是用在这种时候。 foobar 可以使用 sudo -u jimmy kill PID 或者 sudo -u rene kill PID,但这样挺麻烦,其实我们可以不必每次加 -u,把 rene 或 jimmy 设为默认的目标用户即可。再在上面加一行:

Defaults:foobar runas_default=rene

Defaults 后面如果有冒号,是对后面用户的默认;如果没有,则是对所有用户的默认。就像配置文件中自带的一行:

Defaults env_reset

另一个问题是,很多时候,我们本来就登录了,每次使用 sudo 还要输入密码就显得烦琐了。我们可不可以不再输入密码呢?当然可以,我们这样修改配置 文件:

foobar localhost=NOPASSWD:/bin/cat, /bin/ls

再来 sudo 一下:

[foobar@localhost ~]$ sudo ls /rootanaconda-ks.cfg Desktop install.log
install.log.syslog

当然,你也可以说“某些命令用户 foobar 不可以运行”,通过使用 ! 操作符,但这不是一个好主意。因为,用 ! 操作符来从 ALL 中“剔出”一些命令一般是没什么效果的,一个用户完全可以把那个命令拷贝到别的地方,换一个名字后再来运行。

日志与安全

sudo 为安全考虑得很周到,不仅可以记录日志,还能在有必要时向系统管理员报告。 但是,sudo 的日志功能不是自动的,必须由管理员开启。如下所示:

touch /var/log/sudo
vi /etc/syslog.conf

syslog.conf 最后面加一行(必须用 tab 分割开)并保存:

local2.debug /var/log/sudo

重启日志守候进程:

ps aux grep syslogd

把得到的 syslogd 进程的 PID(输出的第二列是 PID)填入下面:

kill –HUP PID

这样,sudo 就可以记录日志了:

[foobar@localhost ~]$ sudo ls /rootanaconda-ks.cfg
Desktop install.log
install.log.syslog
$cat /var/log/sudoJul 28 22:52:54 localhost sudo:   foobar :
TTY=pts/1 ; pwd=/home/foobar ; USER=root ; command=/bin/ls /root

不过,有一个小小的“缺陷”,sudo 记录日志并不是很忠实:

[foobar@localhost ~]$ sudo cat /etc/shadow > /dev/null
cat /var/log/sudo...Jul 28 23:10:24 localhost sudo:   foobar : TTY=pts/1 ;
PWD=/home/foobar ; USER=root ; COMMAND=/bin/cat /etc/shadow

重定向没有被记录!这是因为在命令运行之前,shell 把重定向的工作做完了,sudo 根本就没看到重定向。当然,这也有个好处,比如下面的手段不会得逞:

[foobar@localhost ~]$ sudo ls /root > /etc/shadowbash: /etc/shadow: 权限不够

sudo 有自己的方式来保护安全。

以 root 的身份执行 sudo -V,查看一下 sudo 的设置。因为考虑到安全问题,一部分环境变量并没有传递给 sudo 后面的命令, 或者被检查后再传递的,比如:PATHHOMESHELL 等。当然,你也可以 通过 sudoers 来配置这些环境变量。

top 命令

说明

top 命令可以实时动态地查看系统的整体运行情况,是一个综合了多方信息监测系统性能和运行信息的实用工具。通过 top 命令所提供的互动式界面,我们可以直观地看到系统目前运行的程序所占用的资源;另外, top 命令还支持通过快捷键来管理这些运行中的程序。

语法

top [选项]

选项

-b:以批处理模式操作
-c:显示完整的治命令
-d:屏幕刷新间隔时间
-I:忽略失效过程
-s:保密模式
-S:累积模式
-i<时间>:设置间隔时间
-u<用户名>:指定用户名
-p<进程号>:指定进程
-n<次数>:循环显示的次数

top 交互命令

top 命令执行过程中可以使用的一些交互命令。这些命令都是单字母的,如果在命令行中使用了 -s 选项(保密模式), 其中一 些命令可能会被屏蔽。

h:显示帮助画面,给出一些简短的命令总结说明
k:终止一个进程
i:忽略闲置和僵死进程,这是一个开关式命令
q:退出程序
r:重新安排一个进程的优先级别
S:切换到累计模式
s:改变两次刷新之间的延迟时间(单位为 s),如果有小数,就换算成 ms。输入 0 值则系统将不断刷新,默认值是 5s
f:从当前显示中添加或者删除项目
F:同上
o:改变显示项目的顺序
O:同上
l:切换显示平均负载和启动时间信息
m:切换显示内存信息
t:切换显示进程和 CPU 状态信息
c:切换显示命令名称和完整命令行
M:根据驻留内存大小进行排序
P:根据 CPU 使用百分比大小进行排序
T:根据 时间/累计时间 进行排序
w:将当前设置写入 ~/.toprc 文件中

实例

top - 09:44:56 up 16 days, 21:23,  1 user,  load average: 9.59, 4.75, 1.92
Tasks: 145 total,   2 running, 143 sleeping,   0 stopped,   0 zombie
Cpu(s): 99.8%us,  0.1%sy,  0.0%ni,  0.2%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
Mem:   4147888k total,  2493092k used,  1654796k free,   158188k buffers
Swap:  5144568k total,       56k used,  5144512k free,  2013180k cached

解释

top 命令执行结果含义如下:

  • top - 09:44:56 --- 当前系统时间
  • 16 days --- 系统已经运行了 16 天
  • 1 user --- 个用户当前登录
  • load average: 9.59, 4.75, 1.92 --- 系统负载,即任务队列的平均长度
  • Tasks: 145 total --- 总进程数
  • 2 running --- 正在运行的 进程数
  • 143 sleeping --- 睡眠的进程数
  • 0 stopped --- 停止的进程数
  • 0 zombie --- 冻 结进程数
  • Cpu(s): 99.8% us --- 用户空间占用 CPU 百分比
  • 0.1%sy --- 内核空间占用 CPU 百分比
  • 0.0%ni --- 用户进程空间内改变过优先级的进程占用 CPU 百分比
  • 0.2%id --- 空闲 CPU 百分比
  • 0.0%wa --- 等待输入输出的 CPU 时间百分比
  • 0.0%hi[],
  • 0.0%st[],
  • Mem: 4147888k total --- 物理内存总量
  • 2493092k used --- 使用的物理内存总量
  • 1654796k free --- 空闲内存总量
  • 158188k buffers --- 用作内核缓存的内存量
  • Swap:  5144568k total --- 交换区总量
  • 56k used --- 使用的交换区总量
  • 5144512k free --- 空闲交换区总量
  • 2013180k cached --- 缓冲的交换区总量

vi 命令

说明

vi 命令是 UNIX 操 作系统和类 UNIX 操作系统中通用的全屏幕纯文本编辑器,功能强大,效率极高,但学习曲线陡峭。Linux 中的 vi 编辑器叫 vim,它是 vi 的增强版(vi Improved),与 vi 编辑器完全兼容,而且实现了很多增强功能。

vi 编 辑器支持编辑模式命令模式。编辑模式下可以完成文本的编辑功能,命令模式下可以完成对文件的操作命令,要正确使用 vi 编辑器就必须熟练掌握着两种模式的切换。

默认情况下,打开 vi 编辑器后自动进入命令模式。从编辑模式切换到命令模式使用 esc 键,从命令模式切换到编辑模式使 用 AaOoIi 键。

vi 编辑器提供了丰富的内置命令,有些内置命令使用键盘组合键即可完成,有些内置命令则需要以冒号 : 开头输入。常用内置命令如下:

Ctrl+u:向文件首翻半屏;
Ctrl+d:向文件尾翻半屏;
Ctrl+f:向文件尾翻一屏;
Ctrl+b:向文件首翻一屏;
Esc:从编辑模式切换到命令模式;
ZZ:命令模式下保存当前文件所做的修改后退出vi;
:行号:光标跳转到指定行的行首;
:$:光标跳转到最后一行的行首;
x或X:删除一个字符,x删除光标后的,而X删除光标前的;
D:删除从当前光标到光标所在行尾的全部字符;
dd:删除光标行正行内容;
ndd:删除当前行及其后n-1行;
nyy:将当前行及其下n行的内容保存到寄存器?中,其中?为一个字母,n为一个数字;
p:粘贴文本操作,用于将缓存区的内容粘贴到当前光标所在位置的下方;
P:粘贴文本操作,用于将缓存区的内容粘贴到当前光标所在位置的上方;
/字符串:文本查找操作,用于从当前光标所在位置开始向文件尾部查找指定字符串的内容,查找的字符串会被加亮显 示;
?name:文本查找操作,用于从当前光标所在位置开始向文件头部查找指定字符串的内容,查找的字符串会被加亮显示;
a,bs/F/T:替换文本操作,用于在第a行到第b行之间,将F字符串换成T字符串。其中,“s/”表示进行替换操作;
a:在当前字符后添加文本;
A:在行末添加文本;
i:在当前字符前插入文本;
I:在行首插入文本;
o:在当前行后面插入一空行;
O:在当前行前面插入一空行;
:wq:在命令模式下,执行存盘退出操作;
:w:在命令模式下,执行存盘操作;
:w!:在命令模式下,执行强制存盘操作;
:q:在命令模式下,执行退出vi操作;
:q!:在命令模式下,执行强制退出vi操作;
:e文件名:在命令模式下,打开并编辑指定名称的文件;
:n:在命令模式下,如果同时打开多个文件,则继续编辑下一个文件;
:f:在命令模式下,用于显示当前的文件名、光标所在行的行号以及显示比例;
:set number:在命令模式下,用于在最左端显示行号;
:set nonumber:在命令模式下,用于在最左端不显示行号;

语法

vi [选项] [文件名...]

选项

+<行号>:从指定行号的行开始先是文本内容
-b:以二进制模式打开文件,用于编辑二进制文件和可执行文件
-c<指令>:在完成对第一个文件编辑任务后,执行给出的指令
-d:以 diff 模式打开文件,当多个文件编辑时,显示文件差异部分
-l:使用 lisp 模式,打开 lisp 和 showmatch
-m:取消写文件功能,重设 write 选项
-M:关闭修改功能
-n:不实用缓存功能
-o<文件数目>:指定同时打开指定数目的文件
-R:以只读方式打开文件
-s:安静模式,不现实指令的任何错误信息

参数

文件名:指定要编辑的文件名;多个文件之间使用空格分隔开

补充说明

vi 编辑器有三种工作方式:命令方式、输入方式和 ex 转义方式。通过相 应的命令或操作,在这三种工作方式之间可以进行转换。

命令方式

在 Shell 提示符后输入命令 vi,进入 vi 编辑器,并处于 vi 的命令方式。此时,从键盘上输入的任何字符都被作为编辑命令来解释 ,例如,a(append)表示附加命令,i(insert)表示插入命令,x 表示删除字符命令等。如果输入的字符不是 vi 的合法命令,则机器发出“报警声”,光标不移动。另外,在命令方式下输入的字符(即 vi 命令)并不在屏幕上显示出来,例如,输入 i,屏幕上并无变化,但通过执行 i 命令,编辑器的工作方式却发生变化 :由命令方式变为输入方式。

输入方式

通过输入 vi 的插入命令(i)、附加命令(a)、打开命令(o)、替换命令(s)、修改命令(c)或取代命令(r)可以从命令方式进入输入方式。在输入方式下,从键盘上输入的所有字符都被插入到正在编辑的缓冲区中,被当做该文件的正文。进入输入方式后,输入的可见字符都在屏幕上显示出来,而编辑命令不再起作用,仅作为普通字母出现。例如,在命令方式下输入字母 i, 进到输入方式,然后再输入 i,就在屏幕上相应光标处添加一个字母 i

由输入 方式回到命令方式的办法是按下 Esc 键。如果已在命令方式下,那么按下 Esc 键就会发出“嘟嘟”声。为了确保用户想执行的 vi 命令是在命令方式下输入的,不妨多按几下 Esc 键,听到嘟声后再输入命令。

ex 转义方式

vi 和 ex 编辑器的功能是相同的,二者的主要区别是用户 界面。在 vi 中,命令通常是单个字母,如 a, x, r 等。而在 ex 中,命令是以 Enter 键结束的命令行 。vi 有一个专门的“转义”命令,可访问很多面向行的 ex 命令。为使用 ex 转义方式,可输入一个冒号 :。作为 ex 命令提示符,冒号出现在状态行(通常在屏幕最下一行)。按下中断键(通常是 Del 键),可终止正在执行的命令。多数文件管理命令都是在 ex 转义方式下执行的(例如:读取文件,把编辑缓冲区的内容写到文件中等)。转义命令执行后,自动回到命令方式。例如:

:1,$s/I/i/g 按 Enter 键

则从文件第 一行至文件末尾($)将大写 I 全部替换成小写 i。vi 编辑器的三种工作方式之间的转 换如下所示:

!vi

w 命令

说明

w 命令用于显示已经登录系统的用户列表,并显示用户正在执行的指令。通过该命令可以得知目前登入系统的用户有哪些人,以及他们正在执行的程序;单独执行 w 命令会显示所有的用户。也可指定用户名称,这种情况下,仅显示这位用户的相关信息。

语法

w [选项] [用户]

选项

-h, --no-header     不打印 头信息
-u, --no-current    当显示当前进程和 cpu 时间时忽略用户名
-s, --short         使用短输出格式
-f, --from          显示用户从哪登录
-o, --old-style     老式输出
-i, --ip-addr       显示 IP 地址而不是主机名(如果可能)

--help              显示此帮助并退出
-V, --version       显示版本信息

参数

用户:仅显示指定用户

实例

[root@localhost ~]# w
12:08:22 up 255 days,  3:58,  1 user,  load average: 0.00, 0.00, 0.00
USER     TTY      FROM              login@   IDLE   JCPU   PCPU WHAT
root     pts/0    222.94.97.122     20:39    1.00s  0.00s  0.00s w

xz 命令

说明

xz 命令是 XZ Utils 是为 POSIX 平台开发具有高压缩率的工具。它使用 LZMA2 压缩算法,生成的压缩文件比 POSIX 平台传统使用的 gzip、bzip2 生成的压缩文件更小,而且解压缩 速度也很快。最初,XZ Utils 是基于 LZMA-SDK 开发,但是 LZMA-SDK 包含了一些 Windows 平台的特性,所以 XZ Utils 为了适应 POSIX 平台作了大幅的修改。XZ Utils 的出现也是为了取代 POSIX 系统中旧的 LZMA Utils。

语法

xz [选项] [源文件] [目标文件]

选项

-z, --compress      强制压缩
-d, --decompress, --uncompress  强制解压缩
-t, --test          测试压缩文件的完整性
-l, --list          列出有关 .xz 文件的信息
-k, --keep          保留(不要删除)输入文件
-f, --force         强制覆盖输出文件和(解)压缩链接
-c, --stdout, --to-stdout
                    写入标准输出,不要删除输入文件
-0 ... -9           指定压缩率,取值为 0-9,默认为 6
-e, --extreme       尝试通过使用更多的 CPU 时间来提高压缩比;
                    要求不影响解压缩存储器
-T, --threads=NUM   最多使用 NUM 个线程; 默认值为 1
                    当设置为 0 时,使用与处理器内核一样多的线程
-q, --quiet         抑制警告; 指定两次以抑制错误
-v, --verbose       显示压缩或解压过程中的详细信息; 指定两次 v 则更详细
-h, --help          显示这个简洁的帮助并退出
-H, --long-help     显示更多帮助(还列出了高级选项)
-V, --version       显示版本号并退出

参数

源文件:指定连接的源文件
目标文件:指定源文件的目标连接文件

实例

压缩一个文件 test.txt,压缩成功后生成 test.txt.xz, 原文 件会被删除。

$ xz test.txt
$ ls test.txt*

test.txt.xz 

解压 test.txt.xz 文件,并使用参数 -k 保持原文件不被删除。

$ xz -d -k test.txt.xz
$ ls test.txt*

test.txt.xz test.txt 

使用参数 -l 显示 .xz 文件的基本信息。基本信息包 括压缩率、数据完整性验证方式等。也可以和参数 -v-vv 配合显示更详尽的信息。

xz -l index.txt.xz
# Strms  Blocks   Compressed Uncompressed  Ratio  Check   Filename
#    1       1        768 B      1,240 B  0.619  CRC64   index.txt.

使用参数 -0, -1, -2, … -6, … -9 或参数 --fast, --best 设定压缩率。xz 命令的默认压缩率为 -6。对于大多数系统来说,甚至 是一些较旧的系统,把压缩率设置为 -4, -5, -6 都有不错的表现。

$ xz -k7 xz_pipe_decomp_mini.c
$ xz -k --fast xz_pipe_decomp_mini.c 

使用选项 -H 显示 xz 命令所有 options。选项 -H 比使用选项 --help 显示的内容更详细。

$ xz -H  | more 

借助 xargs 命令并行压缩多文件。下面的命令行可以将 /var/log 目录下所有的 扩展名为 .log 的文件压缩。通过 xargs 命令同时运行多个 xz 进行压缩。

# 运行此命令须有 root 权限。
find /var/log -type f -iname "*.log" -print0 | xargs -P4 -n16 xz -T1 

yum 命令

说明

yum 命令是在 Fedora 和 RedHat 以及 SUSE 中基于 rpm 的软件包管理器,它可以使系统管理人员以更加自动化的方式来管理 RPM 软件包。yum 能够从指定的服务器自动下载 RPM 包并且安装,而且还可以自动处理依赖性关系,并且一次安装所有依赖的软体包,无须繁琐地手动下载 、安装以及卸载软件包。

yum 提供了查找、安装、删除某一个、一组甚至全部软件包的命令,而且提供的命令十分简洁和易于使用。

语法

yum [选项] [参数]

选项

-h:显示 帮助信息
-y:对所有的提问都回答 yes
-c:指定配置文件
-q:安静模式
-v:详细模式
-d:设置调试等级(0-10)
-e:设置错误等级(0-10)
-R:设置 yum 处理一个命令的最大等待时间
-C:完全从缓存中运行,而不去下载或者更新任何头文件

参数

install:安装 rpm 软件包
update:更新 rpm 软件包
check-update:检查是否有可用的更新 rpm 软件包
remove:删除指定的 rpm 软件包
list:显示软件包的信息
search:检查软件包的信息
info:显示指定的 rpm 软件包的描述信息和概要信息
clean:清理 yum 过期的缓存
shell:进入 yum 的 shell 提示符
resolvedep:显示 rpm 软件包的依赖关系
localinstall:安装本地的 rpm 软件包
localupdate:显示本地 rpm 软件包进行更新
deplist:显示 rpm 软件包的所有依赖关系

实例

部分常用的命令包括:

  • 自动搜索最快镜像插件:yum install yum-fastestmirror
  • 安装yum图形窗口插件:yum install yumex
  • 查看可能批量安装的列表:yum grouplist

安装软件

yum install              # 全部安装
yum install package1     # 安装指定的安装包 package1
yum groupinsall group1   # 安装程序组 group1

更新和升级

yum update               # 全部更新
yum update package1      # 更新指定程序包 package1
yum check-update         # 检查可更新的程序
yum upgrade package1     # 升级指定程序包 package1
yum groupupdate group1   # 升级程序组 group1

查找和显示

# 检查 PHP 是否已安装
yum list installed | grep php
yum list installed php*

yum info package1      # 显示安装包 package1 的信息
yum list               # 列出所有已经安装和可以安装的程序包
yum list package1      # 列出指定程序包 package1 的安装情况
yum groupinfo group1   # 列出程序组 group1 信息
yum search string      # 根据关键字 string 查找安装包

删除程序

yum remove package1          # 删除程序包 package1
yum groupremove group1       # 删除程序组 group1
yum deplist package1         # 查看程序 package1 依赖情况

清除缓存

yum clean packages       # 清除缓存目录下的软件包
yum clean headers        # 清除缓存目录下的 headers
yum clean oldheaders     # 清除缓存目录下旧的 headers

zip 命令

说明

zip 命令用于压缩文件,它提供了若干选项来完成压缩工作。zip 是 Linux 系统下一个广泛使用的压缩程序,通过该命令压缩的文件将生成具有 .zip 扩展名的压缩文件。

语法

zip [选项] [zip 压 缩包名称] [要压缩的文件列表]

选项

-A:调整可执行的自动解压缩文件
-b<工作目录>:指定暂时存放文件的目录
-c:替每个被压缩的文件加上注释
-d:从压缩文件内删除指定的文件
-D:压缩文件内不建立目录名称
-f:此参数的效果和指定 -u 参数类似,但不仅更新既有文件,如果某些文件原本不存在于压缩文件内 ,使用本参数会一并将其加入压缩文件中
-F:尝试修复已损坏的压缩文件
-g:将文件压缩后附加在已有的压缩文件之后,而非另行建立新的压缩文件
-h:显示帮助信息
-i<范本样式>:只压缩符合条件的文件
-j:只保存文件名称及其内容,而不存放任何目录名称
-J:删除压缩文件前面不必要的数据
-k:使用 MS-DOS 兼容格式的文件名称
-l:压缩文件时,把 LF 字符置换成 LF+CR 字符
-ll:压缩文件时,把 LF+CR 字符置换成 LF 字符
-L:显示版权信息
-m:将文件压缩并加入压缩文件后,删除原始文件,即把文件移到压缩文件中
-n<字尾字符串>:不压缩具有特定字尾字符串的文件
-o:以压缩文件内拥有最新更改时间的文件为准,将压缩文件的更改时间设成和该文件相同
-q:不显示指令执行过程
-r:递归处理,将指定目录下的所有文件和子目录一并处理
-S:包含系统和隐藏文件
-t<日期时间>:把压缩文件的日期设成指定的日期
-T:检查备份文件内的每个文件是否正确无误
-u:更换较新的文件到压缩文件内
-v:显示指令执行过程或显示版本信息
-V:保存VMS操作系统的文件属性
-w:在文件名称里假如版本编号,本参数仅在 VMS 操作系统下有效
-x<范本样式>:压缩时排除符合条件的文件
-X:不保存额外的文件属性
-y:直接保存符号连接,而非该链接所指向的文件,本参数仅在 UNIX 之类的系统下有效
-z:替压缩文件加上注释
-$:保存第一个被压缩文件所在磁盘的卷册名称
-<压缩效率>:压缩效率是一个介于 1-9 的数值

参数

  • zip 压缩包:指定要创建的 zip 压缩包
  • 文件列表:指定要压缩的文件列表

实例

/home/webroot/html/ 这个目录下所有文件和文件夹打包为当前目录下的 html.zip,命令如下:

zip -q -r html.zip /home/webroot/html

上面的命令是将绝对地址的文件及文件夹进行压缩。

以下 给出压缩相对路径目录。比如,目前在 webroot 这个目录下,执行以下操作可以达到以上同样的效果:

zip -q -r html.zip html

比如,在 html 目录下,使用的 zip 压缩命令是:

zip -q -r html.zip *

常见问题

在 CentOS 7 中命令找不到,报如下错:

-Bash: zip: Command Not Found

原因:系统没有安装 zip 压缩程序。

解决方法 :通过 yum install 命令安装 zip 程序:

yum install -y unzip zip