root 5 years ago
parent 0a7749a772
commit 3f671c4e40

@ -1,83 +1,35 @@
at
===
在指定时间执行一个任务
# **at**
## 说明
**at命令** 用于在指定时间执行命令。at允许使用一套相当复杂的指定时间的方法。它能够接受在当天的hh:mm小时:分钟式的时间指定。假如该时间已过去那么就放在第二天执行。当然也能够使用midnight深夜noon中午teatime饮茶时间一般是下午4点等比较模糊的 词语来指定时间。用户还能够采用12小时计时制即在时间后面加上AM上午或PM下午来说明是上午还是下午。 也能够指定命令执行的具体日期指定格式为month day 或mm/dd/yy月/日/年或dd.mm.yy日.月.年)。指定的日期必须跟在指定时间的后面。
**at命令** 用于在指定时间执行命令。at允许使用一套相当复杂的指定时间的方法。它能够接受在当天的hh:mm小时:分钟)式的时间
指定。假如该时间已过去那么就放在第二天执行。当然也能够使用midnight深夜noon中午teatime饮茶时间一般是下
午4点等比较模糊的 词语来指定时间。用户还能够采用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明天来指定完成命令的时间。
上面介绍的都是绝对计时法,其实还能够使用相对计时法,这对于安排不久就要执行的命令是很有好处的。指定格式为:
`now + count time-units`now就是当前时间time-units是时间单位这里能够是minutes分钟、hours小时、days
、weeks星期。count是时间的数量究竟是几天还是几小时等等。 更有一种计时方法就是直接使用today今天、tomorrow
(明天)来指定完成命令的时间
### 语法
## 选项
```
at(选项)(参数)
```markdown
-f指定包含具体指令的任务文件
-q指定新任务的队列名称
-l显示待执行任务的列表
-d删除指定的待执行任务
-m任务执行完成后向用户发送E-mail
```
## 实例
```bash
echo "mail -s 'get the train' P@draigBrady.com < /dev/null" | at 17:45 # 在指定的时间发送邮件
/bin/ls | at 5pm+3 days # 三天后的下午5点锺执行/bin/ls
date >/root/2013.log | at 17:20 tomorrow # 明天17点钟输出时间到指定文件内
atq # 计划任务设定后在没有执行之前我们可以用atq命令来查看系统没有执行工作任务
at -c 8 # 显示已经设置的任务内容
echo "DISPLAY=$DISPLAY xmessage cooker" | at "NOW + 30 minutes" # 在给定的时间弹出对话框
```
-f指定包含具体指令的任务文件
-q指定新任务的队列名称
-l显示待执行任务的列表
-d删除指定的待执行任务
-m任务执行完成后向用户发送E-mail。
```
### 参数
日期时间:指定任务执行的日期时间。
### 实例
三天后的下午 5 点锺执行`/bin/ls`
```
[root@localhost ~]# at 5pm+3 days
at> /bin/ls
at> <EOT>
job 7 at 2013-01-08 17:00
```
明天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
```
删除已经设置的任务:
```
[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
```
显示已经设置的任务内容:
```
[root@localhost ~]# at -c 8
#!/bin/sh
# atrun uid=0 gid=0
# mail root 0
umask 22此处省略n个字符
date >/root/2013.log
```

File diff suppressed because it is too large Load Diff

@ -1,26 +1,100 @@
badblocks
===
查找磁盘中损坏的区块
# badblocks
## 说明
**badblock命令** 用于查找磁盘中损坏的区块。 硬盘是一个损耗设备,当使用一段时间后可能会出现坏道等物理故障。电脑硬盘出现坏道后如果不及时更换或进行技术处理坏道就会越来越多并会造成频繁死机和数据丢失。最好的处理方式是更换磁盘但在临时的情况下应及时屏蔽坏道部分的扇区不要触动它们。badblocks就是一个很好的检查坏道位置的工具。
### 语法
**badblock命令** 用于查找磁盘中损坏的区块。 硬盘是一个损耗设备,当使用一段时间后可能会出现坏道等物理故障。电脑硬盘
出现坏道后,如果不及时更换或进行技术处理,坏道就会越来越多,并会造成频繁死机和数据丢失。最好的处理方式是更换磁盘,但
在临时的情况下应及时屏蔽坏道部分的扇区不要触动它们。badblocks就是一个很好的检查坏道位置的工具
```
badblock(选项)(参数)
```
## 选项
```
```markdown
-b<区块大小>:指定磁盘的区块大小,单位为字节;
-o<输出文件>:将检查的结果写入指定的输出文件;
-s在检查时显示进度
-v执行时显示详细的信息
-w在检查时执行写入测试。
OPTIONS
-b block-size
Specify the size of blocks in bytes. The default is 1024.
-c number of blocks
is the number of blocks which are tested at a time. The default is 64.
-e max bad block count
Specify a maximum number of bad blocks before aborting the test. The default is 0, meaning the test will continue until the
end of the test range is reached.
-d read delay factor
This parameter, if passed and non-zero, will cause bad blocks to sleep between reads if there were no errors encountered in the
read operation; the delay will be calculated as a percentage of the time it took for the read operation to be performed. In
other words, a value of 100 will cause each read to be delayed by the amount the previous read took, and a value of 200 by
twice the amount.
-f Normally, badblocks will refuse to do a read/write or a non-destructive test on a device which is mounted, since either can
cause the system to potentially crash and/or damage the filesystem even if it is mounted read-only. This can be overridden
using the -f flag, but should almost never be used --- if you think you're smarter than the badblocks program, you almost cer
tainly aren't. The only time when this option might be safe to use is if the /etc/mtab file is incorrect, and the device
really isn't mounted.
-i input_file
-e max bad block count
Specify a maximum number of bad blocks before aborting the test. The default is 0, meaning the test will continue until the
end of the test range is reached.
-d read delay factor
This parameter, if passed and non-zero, will cause bad blocks to sleep between reads if there were no errors encountered in the
read operation; the delay will be calculated as a percentage of the time it took for the read operation to be performed. In
other words, a value of 100 will cause each read to be delayed by the amount the previous read took, and a value of 200 by
twice the amount.
-f Normally, badblocks will refuse to do a read/write or a non-destructive test on a device which is mounted, since either can
cause the system to potentially crash and/or damage the filesystem even if it is mounted read-only. This can be overridden
using the -f flag, but should almost never be used --- if you think you're smarter than the badblocks program, you almost cer
tainly aren't. The only time when this option might be safe to use is if the /etc/mtab file is incorrect, and the device
really isn't mounted.
-i input_file
Read a list of already existing known bad blocks. Badblocks will skip testing these blocks since they are known to be bad. If
input_file is specified as "-", the list will be read from the standard input. Blocks listed in this list will be omitted from
the list of new bad blocks produced on the standard output or in the output file. The -b option of dumpe2fs(8) can be used to
retrieve the list of blocks currently marked bad on an existing filesystem, in a format suitable for use with this option.
-n Use non-destructive read-write mode. By default only a non-destructive read-only test is done. This option must not be com
bined with the -w option, as they are mutually exclusive.
-o output_file
Write the list of bad blocks to the specified file. Without this option, badblocks displays the list on its standard output.
The format of this file is suitable for use by the -l option in e2fsck(8) or mke2fs(8).
-p num_passes
Repeat scanning the disk until there are no new blocks discovered in num_passes consecutive scans of the disk. Default is 0,
meaning badblocks will exit after the first pass.
-s Show the progress of the scan by writing out rough percentage completion of the current badblocks pass over the disk. Note
that badblocks may do multiple test passes over the disk, in particular if the -p or -w option is requested by the user.
-t test_pattern
Specify a test pattern to be read (and written) to disk blocks. The test_pattern may either be a numeric value between 0 and
ULONG_MAX-1 inclusive, or the word "random", which specifies that the block should be filled with a random bit pattern. For
read/write (-w) and non-destructive (-n) modes, one or more test patterns may be specified by specifying the -t option for each
test pattern desired. For read-only mode only a single pattern may be specified and it may not be "random". Read-only testing
with a pattern assumes that the specified pattern has previously been written to the disk - if not, large numbers of blocks
will fail verification. If multiple patterns are specified then all blocks will be tested with one pattern before proceeding
to the next pattern.
-v Verbose mode. Will write the number of read errors, write errors and data- corruptions to stderr.
-w Use write-mode test. With this option, badblocks scans for bad blocks by writing some patterns (0xaa, 0x55, 0xff, 0x00) on
every block of the device, reading every block and comparing the contents. This option may not be combined with the -n option,
as they are mutually exclusive.
-B Use buffered I/O and do not use Direct I/O, even if it is available.
-X Internal flag only to be used by e2fsck(8) and mke2fs(8). It bypasses the exclusive mode in-use device safety check.
```
### 参数

@ -22,6 +22,8 @@
echo "1.212*3" | bc # 算术操作高级运算bc命令它可以执行浮点运算和一些高级函数
echo "scale=2;3/8" | bc # 设定小数精度(数值范围)参数`scale=2`是将bc输出结果的小数位设置为2位
echo "obase=2;192" | bc # 进制转换,将数字192转换为2进制注意只能对数字进行进制转换,对应的进制有2,8,16,64
echo "$((0x2dec))" # 十六进制转十进制
echo "sqrt(1000/10) + 1" | bc -l
# 计算平方和平方根
echo "10^10" | bc

@ -1,71 +1,27 @@
cal
===
显示当前日历或指定日期的日历
# cal
## 说明
**cal命令** 用于显示当前日历,或者指定日期的日历
**cal命令** 用于显示当前日历,或者指定日期的日历
### 语法
## 选项
```
cal(选项)(参数)
```
```markdown
cal [选项] [[[日] 月] 年]
-1, --one 只显示当前月份(默认)
-3, --three 显示上个月、当月和下个月
-s, --sunday 周日作为一周第一天
-m, --monday 周一用为一周第一天
-j, --julian 输出儒略日,即显示“julian”日期
-y, --year 输出整年
```
-l显示单月输出
-3显示临近三个月的日历
-s将星期日作为月的第一天
-m将星期一作为月的第一天
-j显示“julian”日期
-y显示当前年的日历。
```
### 参数
## 实例
```
月:指定月份;
年:指定年份。
```
### 实例
```bash
cal -j
cal 9 1752 # 显示指定月,年的日历
单独执行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
```

@ -19,5 +19,11 @@
## 实例
```bash
cat -n /etc/passwd | sed '2,5d' # 显示passwd内容将2-5行删除后再显示
cat -n /etc/passwd | sed '2a hello' # 在passwd文件第二行后加上hello语句
cat -n /etc/passwd | sed '2a hello? \ zhangfneg ?' # 在passwd文件第二行后面加上两行字
cat -n /etc/passwd | sed '3,37c我是好人' # 将2至5行内容替换成我是好人
cat -n /etc/passwd | sed -n '5,7p' # 只显示5至7行
cat /var/log/secure | sed -n '/12:12:50/,/12:13:50/p' # 分析secure日志
cat /proc/partitions # 显示所在系统注册的分区
```

@ -32,11 +32,12 @@ Default operation is replace, per 1003.2
Linux下的任务调度分为两类 **系统任务调度** 和 **用户任务调度** 。
**系统任务调度:** 系统周期性所要执行的工作,比如写缓存数据到硬盘、日志清理等。在`/etc`目录下有一个crontab文件这个就是系统任务调度的配置文件。
**系统任务调度:** 系统周期性所要执行的工作,比如写缓存数据到硬盘、日志清理等。在`/etc`目录下有一个crontab文件这个就是
系统任务调度的配置文件
`/etc/crontab`文件包括下面几行:
/etc/crontab文件包括下面几行
```
```markdown
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=""HOME=/
@ -48,160 +49,58 @@ MAILTO=""HOME=/
42 4 1 * * root run-parts /etc/cron.monthly
```
前四行是用来配置crond任务运行的环境变量第一行SHELL变量指定了系统要使用哪个shell这里是bash第二行PATH变量指定了系统执行命令的路径第三行MAILTO变量指定了crond的任务执行信息将通过电子邮件发送给root用户如果MAILTO变量的值为空则表示不发送任务执行信息给用户第四行的HOME变量指定了在执行命令或者脚本时使用的主目录。
前四行是用来配置crond任务运行的环境变量第一行SHELL变量指定了系统要使用哪个shell这里是bash第二行PATH变量指定了系统
执行命令的路径第三行MAILTO变量指定了crond的任务执行信息将通过电子邮件发送给root用户如果MAILTO变量的值为空则表示不
发送任务执行信息给用户第四行的HOME变量指定了在执行命令或者脚本时使用的主目录
**用户任务调度:** 用户定期要执行的工作比如用户数据备份、定时邮件提醒等。用户可以使用 crontab 工具来定制自己的计划任务。所有用户定义的crontab文件都被保存在`/var/spool/cron`目录中。其文件名与用户名一致,使用者权限文件如下:
**用户任务调度:** 用户定期要执行的工作比如用户数据备份、定时邮件提醒等。用户可以使用 crontab 工具来定制自己的计划任
务。所有用户定义的crontab文件都被保存在`/var/spool/cron`目录中。其文件名与用户名一致,使用者权限文件如下:
```
```markdown
/etc/cron.deny 该文件中所列用户不允许使用crontab命令
/etc/cron.allow 该文件中所列用户允许使用crontab命令
/var/spool/cron/ 所有用户crontab文件存放的目录,以用户名命名
```
crontab文件的含义用户所建立的crontab文件中每一行都代表一项任务每行的每个字段代表一项设置它的格式共分为六个字段前五段是时间设定段第六段是要执行的命令段格式如下
```
crontab文件的含义用户所建立的crontab文件中每一行都代表一项任务每行的每个字段代表一项设置它的格式共分为六个字段
前五段是时间设定段,第六段是要执行的命令段,格式如下:
minute hour day month week command 顺序:分 时 日 月 周
```
其中:
* minute 表示分钟可以是从0到59之间的任何整数
* hour表示小时可以是从0到23之间的任何整数
* day表示日期可以是从1到31之间的任何整数
* month表示月份可以是从1到12之间的任何整数
* week表示星期几可以是从0到7之间的任何整数这里的0或7代表星期日
* command要执行的命令可以是系统命令也可以是自己编写的脚本文件
* minute 表示分钟可以是从0到59之间的任何整数
* hour表示小时可以是从0到23之间的任何整数
* day表示日期可以是从1到31之间的任何整数
* month表示月份可以是从1到12之间的任何整数
* week表示星期几可以是从0到7之间的任何整数这里的0或7代表星期日
* command要执行的命令可以是系统命令也可以是自己编写的脚本文件
在以上各个字段中,还可以使用以下特殊字符:
* 星号(*代表所有可能的值例如month字段如果是星号则表示在满足其它字段的制约条件后每月都执行该命令操作
* 星号(*代表所有可能的值例如month字段如果是星号则表示在满足其它字段的制约条件后每月都执行该命令操作
* 逗号(,可以用逗号隔开的值指定一个列表范围例如“1,2,5,7,8,9”
* 中杠(-可以用整数之间的中杠表示一个整数范围例如“2-6”表示“2,3,4,5,6”
* 正斜线(/可以用正斜线指定时间的间隔频率例如“0-23/2”表示每两小时执行一次。同时正斜线可以和星号一起使用例如*/10如果用在minute字段表示每十分钟执行一次。
**crond服务**
```
/sbin/service crond start //启动服务
/sbin/service crond stop //关闭服务
/sbin/service crond restart //重启服务
/sbin/service crond reload //重新载入配置
```
* 正斜线(/可以用正斜线指定时间的间隔频率例如“0-23/2”表示每两小时执行一次。同时正斜线可以和星号一起使用例如
*/10如果用在minute字段表示每十分钟执行一次
查看crontab服务状态
```
service crond status
```
手动启动crontab服务
```
service crond start
```
查看crontab服务是否已设置为开机启动执行命令
```
ntsysv
```
加入开机自动启动:
```
chkconfig level 35 crond on
```
### 实例
每1分钟执行一次command
```
* * * * * command
```
每小时的第3和第15分钟执行
```
3,15 * * * * command
```
在上午8点到11点的第3和第15分钟执行
```
3,15 8-11 * * * command
```
每隔两天的上午8点到11点的第3和第15分钟执行
```
3,15 8-11 */2 * * command
```
## 实例
每个星期一的上午8点到11点的第3和第15分钟执行
```
3,15 8-11 * * 1 command
```
每晚的21:30重启smb 
```
30 21 * * * /etc/init.d/smb restart
```
每月1、10、22日的4 : 45重启smb 
```
45 4 1,10,22 * * /etc/init.d/smb restart
```
每周六、周日的1:10重启smb
```
10 1 * * 6,0 /etc/init.d/smb restart
```
每天18 : 00至23 : 00之间每隔30分钟重启smb 
```
0,30 18-23 * * * /etc/init.d/smb restart
```
每星期六的晚上11:00 pm重启smb 
```
0 23 * * 6 /etc/init.d/smb restart
```
每一小时重启smb 
```
* */1 * * * /etc/init.d/smb restart
```
晚上11点到早上7点之间每隔一小时重启smb
```
* 23-7/1 * * * /etc/init.d/smb restart
```
每月的4号与每周一到周三的11点重启smb 
```
0 11 4 * mon-wed /etc/init.d/smb restart
```
一月一号的4点重启smb
```
0 4 1 jan * /etc/init.d/smb restart
```
每小时执行`/etc/cron.hourly`目录内的脚本
```markdown
* * * * * command # 每1分钟执行一次command
3,15 * * * * command # 每小时的第3和第15分钟执行
3,15 8-11 * * * command # 在上午8点到11点的第3和第15分钟执行
3,15 8-11 */2 * * command # 每隔两天的上午8点到11点的第3和第15分钟执行
3,15 8-11 * * 1 command # 每个星期一的上午8点到11点的第3和第15分钟执行
30 21 * * * /etc/init.d/smb restart # 每晚的21:30重启smb
45 4 1,10,22 * * /etc/init.d/smb restart # 每月1、10、22日的4:45重启smb 
10 1 * * 6,0 /etc/init.d/smb restart # 每周六、周日的1:10重启smb
0,30 18-23 * * * /etc/init.d/smb restart # 每天18:00至23:00之间每隔30分钟重启smb 
0 23 * * 6 /etc/init.d/smb restart # 每星期六的晚上11:00重启smb 
* */1 * * * /etc/init.d/smb restart # 每一小时重启一次smb
* 23-7/1 * * * /etc/init.d/smb restart # 晚上11点到早上7点之间每隔一小时重启smb
0 11 4 * mon-wed /etc/init.d/smb restart # 每月的4号与每周一到周三的11点重启smb 
0 4 1 jan * /etc/init.d/smb restart # 一月一号的4点重启smb
01 * * * * root run-parts /etc/cron.hourly # 每小时执行`/etc/cron.hourly`目录内的脚本
```
01 * * * * root run-parts /etc/cron.hourly
```

@ -42,6 +42,7 @@ Mandatory arguments to long options are mandatory for short options too.
grep "model name" /proc/cpuinfo | uniq | cut -f2 -d : # 显示CPU信息;-f截取,-d以:字符分界
cut -f2 --complement test.txt # --complement选项提取指定字段之外的列打印除了第二列之外的列
cut -f2 -d";" test2.txt # 使用-d选项指定字段分隔符
pip3 list -o --format columns | cut -d ' ' -f1 | xargs -n1 pip install -U # 一次性升级所有pip包
### 指定字段的字符或者字节范围

@ -100,17 +100,19 @@ date --date='TZ="America/Los_Angeles" 09:00 next Fri'
```bash
date +"%Y-%m-%d" # 格式化输出并用-符号连接日期
# 输出昨天日期
date -d "1 day ago" +"%Y-%m-%d"
date -d "yesterday" +"%Y-%m-%d"
date -d "-1 day" +"%Y-%m-%d"
date -d "2 second" +"%Y-%m-%d %H:%M.%S" # 2秒后输出
date -d "1970-01-01 1234567890 seconds" +"%Y-%m-%d %H:%m:%S" # 输出传说中的1234567890秒
date -d "2009-12-12" +"%Y/%m/%d %H:%M.%S" # 普通转格式
date -d "Dec 5, 2009 12:00:37 AM" +"%Y-%m-%d %H:%M.%S" # apache格式转换
date -d "Dec 5, 2009 12:00:37 AM 2 year ago" +"%Y-%m-%d %H:%M.%S" # 格式转换后时间游走
date --date='25 Dec' +%A # 今年的圣诞节是星期几
date -d fri # 这个星期五是几号
date --date '1970-01-01 UTC 2147483647 seconds' # 将相对于1970-01-01 0000的秒数转换成时间
# 输出昨天日期
date -d "1 day ago" +"%Y-%m-%d"
date -d "yesterday" +"%Y-%m-%d"
date -d "-1 day" +"%Y-%m-%d"
# 加减操作
date +%Y%m%d # 显示前天年月日

@ -2,16 +2,19 @@
## 说明
**dd命令** 用于复制文件并对原文件的内容进行转换和格式化处理。dd命令功能很强大的对于一些比较底层的问题使用dd命令往往可以得到出人意料的效果。用的比较多的还是用dd来备份裸设备。但是不推荐如果需要备份oracle裸设备可以使用rman备份或使用第三方软件备份使用dd的话管理起来不太方便。
**dd命令** 用于复制文件并对原文件的内容进行转换和格式化处理。dd命令功能很强大的对于一些比较底层的问题使用dd命令往往
可以得到出人意料的效果。用的比较多的还是用dd来备份裸设备。但是不推荐如果需要备份oracle裸设备可以使用rman备份或使用
第三方软件备份使用dd的话管理起来不太方便
建议在有需要的时候使用dd 对物理磁盘操作如果是文件系统的话还是使用tar backup cpio等其他命令更加方便。另外使用dd对磁盘操作时最好使用块设备文件。
建议在有需要的时候使用dd 对物理磁盘操作如果是文件系统的话还是使用tar backup cpio等其他命令更加方便。另外使用dd对磁盘
操作时,最好使用块设备文件
其次dd命令可以创建一个固定大小的文件如下
dd if=/dev/zero of=/var/swap/file.swap bs=1024K count=64 linux支持K单位unix不支持
## 选项
```sh
```markdown
bs=BYTES 一次读写BYTES字节数
cbs=BYTES 一次转换BYTES字节数,即指定转换缓冲区大小
conv=CONVS 以逗号分隔的参数列表转换文件,具体参数见下面详述
@ -24,7 +27,8 @@ of=FILE 从文件写入而不是从标准输出
oflag=FLAGS 按逗号分隔的参数列表写入
seek=N 在输出开始时跳过N个obs-sized的块
skip=N 在输入开始时跳过N个ibs-sized的块
status=LEVEL 要打印到stderr的信息的级别; 'none'除了错误消息之外禁止其他所有输出,'noxfer'禁止最终传输统计信息,'progress'显示定期传输统计信息
status=LEVEL 要打印到stderr的信息的级别; 'none'除了错误消息之外禁止其他所有输出,'noxfer'禁止最终传输统计信息,
'progress'显示定期传输统计信息
N和BYTES之后可以跟随以下乘法后缀:
c =1, w =2, b =512, kB =1000, K =1024, MB =1000*1000, M =1024*1024, xM =M
@ -78,12 +82,8 @@ print I/O statistics to standard error and then resume copying.
## 实例
```sh
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
可以看出dd命令来测试内存操作速度
```bash
dd if=/dev/zero of=sun.txt bs=1M count=1 # 可以看出dd命令来测试内存操作速度
```
该命令创建了一个1M大小的文件sun.txt其中参数解释
@ -105,20 +105,17 @@ dd if=/dev/zero of=sun.txt bs=1M count=1
| 兆字节1024KB | M |
| 吉字节1024MB | G |
```bash
## 用dd命令备份磁盘
```sh
dd if=/dev/sda of=/deb/sdb # “if”表示inputfile“of”表示outputfile。参数“conv = noerror”如果存在读取错误它将继续复制。
dd if=/dev/sda of=/deb/sdb # if表示inputfileof表示outputfile。参数conv=noerror如果存在读取错误它仍将继续复制
dd if=/dev/hda of=~/hdadisk.img # 创建硬盘镜像
dd if=hdadisk.img of=/dev/hdb # 从硬盘镜像恢复
dd if=/dev/hda1 of=~/partition1.img # 备份分区
dd if=/dev/cdrom of=tgsservice.iso bs=2048 # 备份CDROM
dd bs=1M if=/dev/sda | gzip | ssh user@remote 'dd of=sda.gz' # 将硬盘sda压缩并备份到远程机器上
dd bs=1 seek=2TB if=/dev/null of=ext4.test # 建立一个大的测试文件(不占用空间)
dd if=/dev/zero bs=1024 count=1000000 of=/root/1Gb.filedd if=/root/1Gb.file bs=64k | dd of=/dev/null # 测试硬盘的读写速度
# 确定硬盘的最佳块大小
dd if=/dev/zero bs=1024 count=1000000 of=/root/1Gb.filedd if=/dev/zero bs=2048 count=500000 of=/root/1Gb.filedd if=/dev/zero bs=4096 count=250000 of=/root/1Gb.filedd if=/dev/zero bs=8192 count=125000 of=/root/1Gb.file
dd if=/dev/zero bs=1024 count=1000000 of=/root/1Gb.filedd if=/dev/zero bs=2048 count=500000 of=/root/1Gb.filedd if=/dev/zero bs=4096 count=250000 of=/root/1Gb.filedd if=/dev/zero bs=8192 count=125000 of=/root/1Gb.file # 确定硬盘的最佳块大小
```

@ -7,65 +7,31 @@
## 选项
```markdown
-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为单位
-a, --all 包含全部的文件系统
-B, --block-size=SIZE 在打印之前按size调整大小; 例如:'- BM'以1048576字节为单位打印size;请参阅下面的SIZE格式
--direct show statistics for a file instead of mount point
--total produce a grand total
-h, --human-readable 以可读性较高的方式来显示信息(e.g., 1K 234M 2G)
-H, --si 与-h参数相同但在计算时是以1000 Bytes为换算单位而非1024 Bytes
-i, --inodes 显示inode 信息而非块使用量
-k 即--block-size=1K
-l, --local 只显示本机的文件系统
--no-sync 取得使用量数据前不进行同步动作(默认)
--output[=FIELD_LIST] use the output format defined by FIELD_LIST,
or print all fields if FIELD_LIST is omitted.
-P, --portability 使用POSIX的输出格式
--sync invoke sync before getting usage info
-t, --type=TYPE 仅显示指定文件系统类型的磁盘信息
-T, --print-type 显示文件系统的类型
-x, --exclude-type=TYPE 不显示指定文件系统类型的磁盘信息
```
[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 27G 106G 21% /
/dev/sda1 996M 61M 884M 7% /boot
tmpfs 1009M 0 1009M 0% /dev/shm
/dev/sdb1 2.7T 209G 2.4T 8% /data1
```
```bash
df # 查看系统磁盘设备默认是KB为单位
查看全部文件系统:
```
[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
```

@ -2,15 +2,19 @@
## 说明
**dmidecode命令** 可以让你在Linux系统下获取有关硬件方面的信息。dmidecode的作用是将DMI数据库中的信息解码以可读的文本方式显示。由于DMI信息可以人为修改因此里面的信息不一定是系统准确的信息。dmidecode遵循SMBIOS/DMI标准其输出的信息包括BIOS、系统、主板、处理器、内存、缓存等等。
**dmidecode命令** 可以让你在Linux系统下获取有关硬件方面的信息。dmidecode的作用是将DMI数据库中的信息解码以可读的文本
方式显示。由于DMI信息可以人为修改因此里面的信息不一定是系统准确的信息。dmidecode遵循SMBIOS/DMI标准其输出的信息包括
BIOS、系统、主板、处理器、内存、缓存等等
DMIDesktop Management Interface,DMI就是帮助收集电脑系统信息的管理系统DMI信息的收集必须在严格遵照SMBIOS规范的前提下进行。SMBIOSSystem Management BIOS是主板或系统制造者以标准格式显示产品管理信息所需遵循的统一规范。SMBIOS和DMI是由行业指导机构Desktop Management Task Force(DMTF)起草的开放性的技术标准其中DMI设计适用于任何的平台和操作系统。
DMIDesktop Management Interface,DMI就是帮助收集电脑系统信息的管理系统DMI信息的收集必须在严格遵照SMBIOS规范的前提
下进行。SMBIOSSystem Management BIOS是主板或系统制造者以标准格式显示产品管理信息所需遵循的统一规范。SMBIOS和DMI是
由行业指导机构Desktop Management Task Force(DMTF)起草的开放性的技术标准其中DMI设计适用于任何的平台和操作系统
DMI充当了管理工具和系统层之间接口的角色。它建立了标准的可管理系统更加方便了电脑厂商和用户对系统的了解。DMI的主要组成部分是Management Information Format(MIF)数据库。这个数据库包括了所有有关电脑系统和配件的信息。通过DMI用户可以获取序列号、电脑厂商、串口信息以及其它系统配件信息。
DMI充当了管理工具和系统层之间接口的角色。它建立了标准的可管理系统更加方便了电脑厂商和用户对系统的了解。DMI的主要组成
部分是Management Information Format(MIF)数据库。这个数据库包括了所有有关电脑系统和配件的信息。通过DMI用户可以获取
序列号、电脑厂商、串口信息以及其它系统配件信息
```info
```markdown
Usage: dmidecode [OPTIONS]
-d, --dev-mem FILE 从设备文件读取信息,输出内容与不加参数标准输出相同(默认: /dev/mem)
@ -110,7 +114,7 @@ Usage: dmidecode [OPTIONS]
## 实例
```sh
```bash
dmidecode -t 1 # 查看服务器信息
dmidecode | grep 'Product Name' # 查看服务器型号
dmidecode | grep 'Serial Number' # 查看主板的序列号
@ -121,7 +125,7 @@ dmidecode -t 11 # 查看OEM信息
dmidecode -t 17 # 查看内存条数
dmidecode -t 16 # 查询内存信息
dmidecode -t 4 # 查看CPU信息
dmidecode -q | less # 显示SMBIOS/DMI 信息
cat /proc/scsi/scsi # 查看服务器硬盘信息
#不带选项执行dmidecode命令通常会输出所有的硬件信息。dmidecode命令有个很有用的选项-t可以按指定类型输出相关信息假如要获得处理器方面的信息则可以执行

@ -20,6 +20,7 @@ Deb软件包指定要操作的.deb软件包。
### 实例
```
dpkg-query -W -f='${Installed-Size;10}\t${Package}\n' | sort -k1,1n | 显示所有在deb发布版上安装的包并以KB包大小为序
dpkg -i package.deb #安装包
dpkg -r package #删除包
dpkg -P package #删除包(包括配置文件)

@ -4,15 +4,9 @@
**du命令** 也是查看使用空间的但是与df命令不同的是Linux du命令是对文件和目录磁盘使用的空间的查看还是和df命令有一些区别
### 语法
## 选项
```
du [选项][文件]
```
```
```markdown
-a或-all 显示目录中个别文件的大小。
-b或-bytes 显示目录或文件大小时以byte为单位。
-c或--total 除了显示个别目录或文件的大小外,同时也显示所有目录或文件的总和。
@ -33,7 +27,7 @@ du [选项][文件]
## 实例
```bash
du -sh /etc/* | sort -rh | head -n 10 # etc目录下所占空间倒序排序前十个目录或文件
du -sh * | sort -k1,1rh | head -n 10 # 当前目录下所占空间倒序排序前十个
```

@ -33,7 +33,7 @@ echo LONG-OPTION
```bash
echo "I live in `locale territory`" # 从locale数据库中展开信息
echo "$((0x2dec))" # 十六进制转十进制
# 用echo命令打印带有色彩的文字
## 文字色:# 颜色码:重置=0黑色=30红色=31绿色=32黄色=33蓝色=34洋红=35青色=36白色=37
@ -47,4 +47,36 @@ echo -e "\e[1;42mGreed Background\e[0m"
## 文字闪动:# 红色数字处还有其他数字参数0 关闭所有属性、1 设置高亮度加粗、4 下划线、5 闪烁、7 反显、8 消隐
echo -e "\033[37;31;5mMySQL Server Stop...\033[39;49;0m"
```
# 关于转义字符使用如下:
echo -e "\v\v\v" # 用-e选项echo会打印出转义字符
echo -e "\042" # 根据"引号字符的八进制ASCII码打印出字符
echo $'\042' # 版本2开始bash允许使用$'\nnn'结构,这里'\nnn'表示一个八进制的值
echo $'\x22' # 使用$'\xnnn'结构也可以使用十六进制来转义
# 当使用像$'\x'的结构时,-e的选项是多余的
echo "NEW LINE and BEEP"
echo $'\n' # 新行
echo $'\a' # 警告(峰鸣)
# 用ASCII码值把字符赋给变量
quote=$'\042' # 引号"被赋值给变量quote
echo "$quote 这是一个引号字符串"
# 用连串的ASCII码把一串字符赋给变量
triple_underline=$'\137\137\137' # 137是字符'_'的ASCII码
echo "$triple_underline UNDERLINE $triple_underline"
ABC=$'\101\102\103\010' # 101, 102, 103分别是A, B, C字符的八进制ASCII码.
echo $ABC
escape=$'\033' # 033是ESC的ASCII码的八进制值
echo "\"escape\" echoes as $escape" # 不可见的输出
: << comment
一个字符串赋给变量时里面的组成部分可能会被转义,但如果单独一个转义字符(\)是不能赋给变量的
转义一个空格可以防止一个字符串参数被分割成多个命令行参数
转义符也提供了写一个多行命令的手段。一般地,每个单独的行有一个不同的命令,而在一行末尾的转义符转义新行符,命令序列则由下
一行继续
comment
```

@ -1,15 +1,12 @@
ethtool
===
显示或修改以太网卡的配置信息
# **ethtool**
## 说明
ethtool命令用于获取以太网卡的配置信息或者修改这些配置。这个命令比较复杂功能特别多
ethtool命令用于获取以太网卡的配置信息或者修改这些配置。这个命令比较复杂功能特别多
### 语法
## 选项
```
```markdown
ethtool [ -a | -c | -g | -i | -d | -k | -r | -S |] ethX
ethtool [-A] ethX [autoneg on|off] [rx on|off] [tx on|off]
ethtool [-C] ethX [adaptive-rx on|off] [adaptive-tx on|off] [rx-usecs N] [rx-frames N] [rx-usecs-irq N] [rx-frames-irq N] [tx-usecs N] [tx-frames N] [tx-usecs-irq N] [tx-frames-irq N] [stats-block-usecs N][pkt-rate-low N][rx-usecs-low N] [rx-frames-low N] [tx-usecs-low N] [tx-frames-lowN] [pkt-rate-high N] [rx-usecs-high N] [rx-frames-high N] [tx-usecs-high N] [tx-frames-high N] [sample-interval N]
@ -21,11 +18,7 @@ ethtool [-p] ethX [N]
ethtool [-t] ethX [offline|online]
ethtool [-s] ethX [speed 10|100|1000] [duplex half|full] [autoneg on|off] [port tp|aui|bnc|mii] [phyad N] [xcvr internal|external]
[wol p|u|m|b|a|g|s|d...] [sopass xx:yy:zz:aa:bb:cc] [msglvl N]
```
```
-a 查看网卡中 接收模块RX、发送模块TX和Autonegotiate模块的状态启动on 或 停用off。
-A 修改网卡中 接收模块RX、发送模块TX和Autonegotiate模块的状态启动on 或 停用off。
-c display the Coalesce information of the specified ethernet card。
@ -43,202 +36,181 @@ ethtool [-s] ethX [speed 10|100|1000] [duplex half|full] [autoneg on|off] [port
-S 显示NIC- and driver-specific 的统计参数,如网卡接收/发送的字节数、接收/发送的广播包个数等。
-t 让网卡执行自我检测有两种模式offline or online。
-s 修改网卡的部分配置,包括网卡速度、单工/全双工模式、mac地址等。
```
### 数据来源
ethtool DEVNAME Display standard information about device
ethtool -s|--change DEVNAME Change generic options
[ speed %d ]
[ duplex half|full ]
[ port tp|aui|bnc|mii|fibre ]
[ mdix auto|on|off ]
[ autoneg on|off ]
[ advertise %x ]
[ phyad %d ]
[ xcvr internal|external ]
[ wol p|u|m|b|a|g|s|d... ]
[ sopass %x:%x:%x:%x:%x:%x ]
[ msglvl %d | msglvl type on|off ... ]
ethtool -a|--show-pause DEVNAME Show pause options
ethtool -A|--pause DEVNAME Set pause options
[ autoneg on|off ]
[ rx on|off ]
[ tx on|off ]
ethtool -c|--show-coalesce DEVNAME Show coalesce options
ethtool -C|--coalesce DEVNAME Set coalesce options
[adaptive-rx on|off]
[adaptive-tx on|off]
[rx-usecs N]
[rx-frames N]
[rx-usecs-irq N]
[rx-frames-irq N]
[tx-usecs N]
[tx-frames N]
[tx-usecs-irq N]
[tx-frames-irq N]
[stats-block-usecs N]
[pkt-rate-low N]
[rx-usecs-low N]
[rx-frames-low N]
[tx-usecs-low N]
[tx-frames-low N]
[pkt-rate-high N]
[rx-usecs-high N]
[rx-frames-high N]
[tx-usecs-high N]
[tx-frames-high N]
[sample-interval N]
ethtool -g|--show-ring DEVNAME Query RX/TX ring parameters
ethtool -G|--set-ring DEVNAME Set RX/TX ring parameters
[ rx N ]
[ rx-mini N ]
[ rx-jumbo N ]
[ tx N ]
ethtool -k|--show-features|--show-offload DEVNAME Get state of protocol offload and other features
ethtool -K|--features|--offload DEVNAME Set protocol offload and other features
FEATURE on|off ...
ethtool -i|--driver DEVNAME Show driver information
ethtool -d|--register-dump DEVNAME Do a register dump
[ raw on|off ]
[ file FILENAME ]
ethtool -e|--eeprom-dump DEVNAME Do a EEPROM dump
[ raw on|off ]
[ offset N ]
[ length N ]
ethtool -E|--change-eeprom DEVNAME Change bytes in device EEPROM
[ magic N ]
[ offset N ]
[ length N ]
[ value N ]
ethtool -r|--negotiate DEVNAME Restart N-WAY negotiation
ethtool -p|--identify DEVNAME Show visible port identification (e.g. blinking)
[ TIME-IN-SECONDS ]
ethtool -t|--test DEVNAME Execute adapter self test
[ online | offline | external_lb ]
ethtool -S|--statistics DEVNAME Show adapter statistics
ethtool --phy-statistics DEVNAME Show phy statistics
ethtool -n|-u|--show-nfc|--show-ntuple DEVNAME Show Rx network flow classification options or rules
[ rx-flow-hash tcp4|udp4|ah4|esp4|sctp4|tcp6|udp6|ah6|esp6|sctp6 [context %d] |
rule %d ]
ethtool -N|-U|--config-nfc|--config-ntuple DEVNAME Configure Rx network flow classification options or rules
rx-flow-hash tcp4|udp4|ah4|esp4|sctp4|tcp6|udp6|ah6|esp6|sctp6 m|v|t|s|d|f|n|r... [context %d] |
flow-type ether|ip4|tcp4|udp4|sctp4|ah4|esp4|ip6|tcp6|udp6|ah6|esp6|sctp6
[ src %x:%x:%x:%x:%x:%x [m %x:%x:%x:%x:%x:%x] ]
[ dst %x:%x:%x:%x:%x:%x [m %x:%x:%x:%x:%x:%x] ]
[ proto %d [m %x] ]
[ src-ip IP-ADDRESS [m IP-ADDRESS] ]
[ dst-ip IP-ADDRESS [m IP-ADDRESS] ]
[ tos %d [m %x] ]
[ tclass %d [m %x] ]
[ l4proto %d [m %x] ]
[ src-port %d [m %x] ]
[ dst-port %d [m %x] ]
[ spi %d [m %x] ]
[ vlan-etype %x [m %x] ]
[ vlan %x [m %x] ]
[ user-def %x [m %x] ]
[ dst-mac %x:%x:%x:%x:%x:%x [m %x:%x:%x:%x:%x:%x] ]
[ action %d ]
[ context %d ]
[ loc %d]] |
delete %d
ethtool -T|--show-time-stamping DEVNAME Show time stamping capabilities
ethtool -x|--show-rxfh-indir|--show-rxfh DEVNAME Show Rx flow hash indirection table and/or RSS hash key
[ context %d ]
ethtool -X|--set-rxfh-indir|--rxfh DEVNAME Set Rx flow hash indirection table and/or RSS hash key
[ context %d|new ]
[ equal N | weight W0 W1 ... | default ]
[ hkey %x:%x:%x:%x:%x:.... ]
[ hfunc FUNC ]
[ delete ]
ethtool -f|--flash DEVNAME Flash firmware image from the specified file to a region on the device
FILENAME [ REGION-NUMBER-TO-FLASH ]
ethtool -P|--show-permaddr DEVNAME Show permanent hardware address
ethtool -w|--get-dump DEVNAME Get dump flag, data
[ data FILENAME ]
ethtool -W|--set-dump DEVNAME Set dump flag of the device
N
ethtool -l|--show-channels DEVNAME Query Channels
ethtool -L|--set-channels DEVNAME Set Channels
[ rx N ]
[ tx N ]
[ other N ]
[ combined N ]
ethtool --show-priv-flags DEVNAME Query private flags
ethtool --set-priv-flags DEVNAME Set private flags
FLAG on|off ...
ethtool -m|--dump-module-eeprom|--module-info DEVNAME Query/Decode Module EEPROM information and optical diagnostics if available
[ raw on|off ]
[ hex on|off ]
[ offset N ]
[ length N ]
ethtool --show-eee DEVNAME Show EEE settings
ethtool --set-eee DEVNAME Set EEE settings
[ eee on|off ]
[ advertise %x ]
[ tx-lpi on|off ]
[ tx-timer %d ]
ethtool --show-fec DEVNAME Show FEC settings
ethtool --set-fec DEVNAME Set FEC settings
[ encoding auto|off|rs|baser ]
```
## 数据来源
Ethtool命令显示的信息来源于网卡驱动层即TCP/ip协议的链路层。该命令在Linux内核中实现的逻辑层次为
最重要的结构体`struct ethtool_ops`,该结构体成员为用于显示或修改以太网卡配置的一系列函数指针,见下表中的第二列。
网卡驱动负责实现(部分)这些函数,并将其封装入`ethtool_ops`结构体,为网络核心层提供统一的调用接口。因此,不同的网卡驱动会给应用层返回不同的信息。`Ethtool命令选项`、`struct ethtool_ops成员函数`、`Ethtool命令显示参数的来源`,三者间的对应关系如下表所示:
<table>
<tbody>
<tr>
<th style="width: 100px;">命令选项</th>
<th>struct ethtool_ops成员函数</th>
<th>Ethtool命令显示参数的来源以网卡驱动BNX2为例</th>
</tr>
<tr>
<td>无 -s</td>
<td>get_settingsget_wol get_msglevel get_link set_settings set_wol set_msglevel</td>
<td>从网卡寄存器中获得网卡速度等信息,可配置。</td>
</tr>
<tr>
<td>-a -A</td>
<td>get_pauseparam set_pauseparam</td>
<td>从网卡寄存器中获得Autonegotiate/RX/TX模块的状态on oroff可配置。</td>
</tr>
<tr>
<td>-c -C</td>
<td>get_coalesceset_coalesce</td>
<td>从网卡寄存器中获得coalescing参数TX/RX一个数据包后推迟发生TX/RX中断的时间(us)/数据包个数。—减小该值可以提高网卡的响应时间。 当rx-usecs&rx-frames同时被设为0时RX中断停止。 当tx-usecs&tx-frames同时被设为0时TX中断停止。</td>
</tr>
<tr>
<td>-g -G</td>
<td>get_ringparam set_ringparam</td>
<td>除当前TX/RX ring的值从网卡寄存器中读取得到可配置其它为网卡bnx2自己固定的信息。</td>
</tr>
<tr>
<td>-k -K</td>
<td>get_rx_csumget_tx_csum get_sg get_tso set_rx_csum set_tx_csum set_sg set_tso</td>
<td>显示信息从保存该状态的变量中读取得到没有对应的寄存器。因此TX/RX校验等模块一直处于on状态实际上是无法修改的。</td>
</tr>
<tr>
<td>-i</td>
<td>get_drvinfo[self_test_count, get_stats_coun,t get_regs_len, get_eeprom_len]</td>
<td>网卡bnx2自己固定的信息
——————————————————–
driver: bnx2 version: 1.4.30 firmware-version: 1.8.0.5 bus-info: 0000:09:00.0
——————————————————–</td>
</tr>
<tr>
<td>-d</td>
<td>get_drvinfoget_regs</td>
<td>不支持即bnx2中没有实现函数get_regs。</td>
</tr>
<tr>
<td>-e -E</td>
<td>get_eepromset_eeprom</td>
<td>不支持即bnx2中没有实现函数get_eeprom。</td>
</tr>
<tr>
<td>-r</td>
<td>nway_reset</td>
<td>配置网卡MII_BMCR寄存器重启Auto negotiation模块。</td>
</tr>
<tr>
<td>-p</td>
<td>phys_id</td>
<td>配置网卡BNX2_EMAC_LED寄存器实现LED闪功能。</td>
</tr>
<tr>
<td>-t</td>
<td>self_test</td>
<td>通过配置网卡寄存器逐一测试网卡的硬件模块registersmemoryloopbackLink statinterrupt。</td>
</tr>
<tr>
<td>-S</td>
<td>get_ethtool_stats</td>
<td>显示信息来源于网卡驱动中的结构体变量stats_blk。网卡通过DMA方式将寄存器BNX2_HC_STATISTICS _ADDR_L和BNX2_HC_STATISTICS_ADDR_H中的数据实时地读取到结构体变量struct statistics_block *stats_blk中。 —显示的数据都是从网卡寄存器中统计得到的,各项的含义需查询网卡(芯片)手册。</td>
</tr>
</tbody>
</table>
由上可见ethtool命令用于显示/配置网卡硬件(寄存器)。  
### 实例
查看机器上网卡的速度:百兆还是千兆,请输入:
```
ethool eth0
最重要的结构体`struct ethtool_ops`,该结构体成员为用于显示或修改以太网卡配置的一系列函数指针,见下表中的第二列
网卡驱动负责实现(部分)这些函数,并将其封装入`ethtool_ops`结构体,为网络核心层提供统一的调用接口。因此,不同的网卡驱动
会给应用层返回不同的信息。`Ethtool命令选项`、`struct ethtool_ops成员函数`、`Ethtool命令显示参数的来源`,三者间的对应关系
如下表所示:
| 命令选项 | struct ethtool_ops成员函数 | Ethtool命令显示参数的来源以网卡驱动BNX2为例 |
| :------: | :------: | :------: |
| 无 -s | get_settingsget_wol get_msglevel get_link set_settings set_wol set_msglevel | 从网卡寄存器中获得网卡速度等信息,可配置 |
| -a -A | get_pauseparam set_pauseparam | 从网卡寄存器中获得Autonegotiate/RX/TX模块的状态on oroff可配置 |
| -c -C | get_coalesceset_coalesce | 从网卡寄存器中获得coalescing参数TX/RX一个数据包后推迟发生TX/RX中断的时间(us)/数据包个数。—减小该值可以提高网卡的响应时间。 当rx-usecs&rx-frames同时被设为0时RX中断停止。 当tx-usecs&tx-frames同时被设为0时TX中断停止 |
| -g -G | get_ringparam set_ringparam | 除当前TX/RX ring的值从网卡寄存器中读取得到可配置其它为网卡bnx2自己固定的信息 |
| -k -K | get_rx_csumget_tx_csum get_sg get_tso set_rx_csum set_tx_csum set_sg set_tso | 显示信息从保存该状态的变量中读取得到没有对应的寄存器。因此TX/RX校验等模块一直处于on状态实际上是无法修改的 |
| -i | get_drvinfo[self_test_count, get_stats_coun,t get_regs_len, get_eeprom_len] | 网卡bnx2自己固定的信息 —– driver: bnx2 version: 1.4.30 firmware-version: 1.8.0.5 bus-info: 0000:09:00.0 —— |
| -d | get_drvinfoget_regs | 不支持即bnx2中没有实现函数get_regs |
| -e -E | get_eepromset_eeprom | 不支持即bnx2中没有实现函数get_eeprom |
| -r | nway_reset | 配置网卡MII_BMCR寄存器重启Auto negotiation模块 |
| -p | phys_id | 配置网卡BNX2_EMAC_LED寄存器实现LED闪功能 |
| -t | self_test | 通过配置网卡寄存器逐一测试网卡的硬件模块registersmemoryloopbackLink statinterrupt |
| -S | get_ethtool_stats | 显示信息来源于网卡驱动中的结构体变量stats_blk。网卡通过DMA方式将寄存器BNX2_HC_STATISTICS _ADDR_L和BNX2_HC_STATISTICS_ADDR_H中的数据实时地读取到结构体变量struct statistics_block *stats_blk中。 —显示的数据都是从网卡寄存器中统计得到的,各项的含义需查询网卡(芯片)手册 |
由上可见ethtool命令用于显示/配置网卡硬件(寄存器)
## 实例
```bash
ethool eth0 # 查看机器上网卡的速度:百兆还是千兆
ethtool -A tx off eth0 # 输出信息中`Speed:`这一项就指示了网卡的速度。停止网卡的发送模块TX
ethtool -i eth0 # 可输入`ethtool -a eth0`查看tx模块是否已被停止。查看网卡eth0采用了何种驱动
ethtool -K eth0 rx off # 显示 driver: bnx2version: 1.4.30 等信息。关闭网卡对收到的数据包的校验功能
ethtool -p eth0 10 # 可输入`ethtool k eth0`查看校验功能是否已被停止。如安装了两块网卡查询eth0对应那块网卡
ethtool -S eth0 # 看哪块网卡的led灯在闪eth0就对应着哪块网卡。查看网卡在接收/发送数据时,有没有出错
ethtool -s eth0 speed 100 # 将千兆网卡的速度降为百兆
ethtool --change eth0 autoneg off speed 100 duplex full # 手动设制网卡速度
```
操作完毕后,输出信息中`Speed:`这一项就指示了网卡的速度。停止网卡的发送模块TX请输入
```
ethtool -A tx off eth0
```
操作完毕后,可输入`ethtool -a eth0`查看tx模块是否已被停止。查看网卡eth0采用了何种驱动请输入
```
ethtool -i eth0
```
操作完毕后,显示 driver: bnx2version: 1.4.30 等信息。关闭网卡对收到的数据包的校验功能,请输入:
```
ethtool -K eth0 rx off
```
操作完毕后,可输入`ethtool k eth0`查看校验功能是否已被停止。如果机器上安装了两块网卡那么eth0对应着哪块网卡呢输入
```
ethtool -p eth0 10
```
操作完毕后看哪块网卡的led灯在闪eth0就对应着哪块网卡。查看网卡在接收/发送数据时,有没有出错?请输入:
```
ethtool S eth0
```
将千兆网卡的速度降为百兆,请输入:
```
ethtool -s eth0 speed 100   
```

@ -1,21 +1,17 @@
fdisk
===
查看磁盘使用情况和磁盘分区
# **fdisk**
## 说明
**fdisk命令** 用于观察硬盘实体使用情况也可对硬盘分区。它采用传统的问答式界面而非类似DOS fdisk的cfdisk互动式操作界面因此在使用上较为不便但功能却丝毫不打折扣。
### 语法
**fdisk命令** 用于观察硬盘实体使用情况也可对硬盘分区。它采用传统的问答式界面而非类似DOSfdisk的cfdisk互动式操作界面
因此在使用上较为不便,但功能却丝毫不打折扣
```
fdisk(选项)(参数)
```
## 选项
```markdown
fdisk [选项] <磁盘> 更改分区表
fdisk [选项] -l <磁盘> 列出分区表
fdisk -s <分区> 给出分区大小(块数)
```
-b <大小> 扇区大小(512、1024、2048或4096)
-c[=<模式>] 兼容模式“dos”或“nondos”(默认)
-h 打印此帮助文本
@ -24,23 +20,19 @@ fdisk(选项)(参数)
-C <数字> 指定柱面数
-H <数字> 指定磁头数
-S <数字> 指定每个磁道的扇区数
```
### 参数
设备文件:指定要进行分区或者显示分区的硬盘设备文件。
```
### 实例
## 实例
```bash
# 新建分区及目录详细步骤:
: << comment
首先选择要进行操作的磁盘:
```
[root@localhost ~]# fdisk /dev/sdb
```
fdisk /dev/sdb
输入`m`列出可以执行的命令:
```
command (m for help): m
Command action
a toggle a bootable flag
@ -59,11 +51,9 @@ Command action
v verify the partition table
w write table to disk and exit
x extra functionality (experts only)
```
输入`p`列出磁盘目前的分区情况:
```
Command (m for help): p
Disk /dev/sdb: 3221 MB, 3221225472 bytes
@ -73,21 +63,17 @@ Units = cylinders of 16065 * 512 = 8225280 bytes
Device Boot Start End Blocks Id System
/dev/sdb1 1 1 8001 8e Linux LVM
/dev/sdb2 2 26 200812+ 83 Linux
```
输入`d`然后选择分区,删除现有分区:
```
Command (m for help): d
Partition number (1-4): 1
Command (m for help): d
Selected partition 2
```
查看分区情况,确认分区已经删除:
```
Command (m for help): print
Disk /dev/sdb: 3221 MB, 3221225472 bytes
@ -97,11 +83,9 @@ Units = cylinders of 16065 * 512 = 8225280 bytes
Device Boot Start End Blocks Id System
Command (m for help):
```
输入`n`建立新的磁盘分区,首先建立两个主磁盘分区:
```
Command (m for help): n
Command action
e extended
@ -121,11 +105,9 @@ Partition number (1-4): 2 //分区号为2
First cylinder (101-391, default 101):
Using default value 101
Last cylinder or +size or +sizeM or +sizeK (101-391, default 391): +200M //分区结束位置单位为M
```
确认分区建立成功:
```
Command (m for help): p
Disk /dev/sdb: 3221 MB, 3221225472 bytes
@ -135,11 +117,9 @@ Units = cylinders of 16065 * 512 = 8225280 bytes
Device Boot Start End Blocks Id System
/dev/sdb1 1 100 803218+ 83 Linux
/dev/sdb2 101 125 200812+ 83 Linux
```
再建立一个逻辑分区:
```
Command (m for help): n
Command action
e extended
@ -150,11 +130,9 @@ First cylinder (126-391, default 126):
Using default value 126
Last cylinder or +size or +sizeM or +sizeK (126-391, default 391):
Using default value 391
```
确认扩展分区建立成功:
```
Command (m for help): p
Disk /dev/sdb: 3221 MB, 3221225472 bytes
@ -165,11 +143,9 @@ Units = cylinders of 16065 * 512 = 8225280 bytes
/dev/sdb1 1 100 803218+ 83 Linux
/dev/sdb2 101 125 200812+ 83 Linux
/dev/sdb3 126 391 2136645 5 Extended
```
在扩展分区上建立两个逻辑分区:
```
Command (m for help): n
Command action
l logical (5 or over)
@ -188,11 +164,9 @@ First cylinder (176-391, default 176):
Using default value 176
Last cylinder or +size or +sizeM or +sizeK (176-391, default 391):
Using default value 391
```
确认逻辑分区建立成功:
```
Command (m for help): p
Disk /dev/sdb: 3221 MB, 3221225472 bytes
@ -207,104 +181,31 @@ Units = cylinders of 16065 * 512 = 8225280 bytes
/dev/sdb6 176 391 1734988+ 83 Linux
Command (m for help):
```
从上面的结果我们可以看到在硬盘sdb我们建立了2个主分区sdb1sdb21个扩展分区sdb32个逻辑分区sdb5sdb6
注意主分区和扩展分区的磁盘号位1-4也就是说最多有4个主分区或者扩展分区逻辑分区开始的磁盘号为5因此在这个实验中试没有sdb4的。
最后对分区操作进行保存:
最后对分区操作进行写入保存:
```
Command (m for help): w
The partition table has been altered!
Calling ioctl() to re-read partition table.
Syncing disks.
```
建立好分区之后我们还需要对分区进行格式化才能在系统中使用磁盘。
在sdb1上建立ext2分区
# 建立好分区之后我们还需要对分区进行格式化才能在系统中使用磁盘
mkfs.ext4 /dev/sdb1 # 在sdb1上建立ext4分区
```
[root@localhost ~]# mkfs.ext2 /dev/sdb1
mke2fs 1.39 (29-May-2006)
Filesystem label=
OS type: Linux
Block size=4096 (log=2)
Fragment size=4096 (log=2)
100576 inodes, 200804 blocks
10040 blocks (5.00%) reserved for the super user
First data block=0
Maximum filesystem blocks=209715200
7 block groups
32768 blocks per group, 32768 fragments per group
14368 inodes per group
Superblock backups stored on blocks:
32768, 98304, 163840
Writing inode tables: done
Writing superblocks and filesystem accounting information: done
This filesystem will be automatically checked every 32 mounts or
180 days, whichever comes first. Use tune2fs -c or -i to override.
```
在sdb6上建立ext3分区
```
[root@localhost ~]# mkfs.ext3 /dev/sdb6
mke2fs 1.39 (29-May-2006)
Filesystem label=
OS type: Linux
Block size=4096 (log=2)
Fragment size=4096 (log=2)
217280 inodes, 433747 blocks
21687 blocks (5.00%) reserved for the super user
First data block=0
Maximum filesystem blocks=444596224
14 block groups
32768 blocks per group, 32768 fragments per group
15520 inodes per group
Superblock backups stored on blocks:
32768, 98304, 163840, 229376, 294912
Writing inode tables: done
Creating journal (8192 blocks): done
Writing superblocks and filesystem accounting information: done
This filesystem will be automatically checked every 32 mounts or
180 days, whichever comes first. Use tune2fs -c or -i to override.
[root@localhost ~]#
```
建立两个目录`/oracle`和`/web`,将新建好的两个分区挂载到系统:
```
[root@localhost ~]# mkdir /oracle
[root@localhost ~]# mkdir /web
[root@localhost ~]# mount /dev/sdb1 /oracle
[root@localhost ~]# mount /dev/sdb6 /web
```
查看分区挂载情况:
```
[root@localhost ~]# df -h
文件系统 容量 已用 可用 已用% 挂载点
/dev/mapper/VolGroup00-LogVol00
6.7G 2.8G 3.6G 44% /
/dev/sda1 99M 12M 82M 13% /boot
tmpfs 125M 0 125M 0% /dev/shm
/dev/sdb1 773M 808K 733M 1% /oracle
/dev/sdb6 1.7G 35M 1.6G 3% /web
```
# 建立两个目录`/oracle`和`/web`,将新建好的两个分区挂载到系统
mkdir /oracle
mkdir /web
mount /dev/sdb1 /oracle
mount /dev/sdb6 /web
如果需要每次开机自动挂载则需要修改`/etc/fstab`文件,加入两行配置:
```
[root@localhost ~]# vim /etc/fstab
vim /etc/fstab
/dev/VolGroup00/LogVol00 / ext3 defaults 1 1
LABEL=/boot /boot ext3 defaults 1 2
@ -313,8 +214,10 @@ devpts /dev/pts devpts gid=5,mode=620 0 0
sysfs /sys sysfs defaults 0 0
proc /proc proc defaults 0 0
/dev/VolGroup00/LogVol01 swap swap defaults 0 0
/dev/sdb1 /oracle ext2 defaults 0 0
/dev/sdb6 /web ext3 defaults 0 0
/dev/sdb1 /oracle ext4 defaults 0 0
/dev/sdb6 /web ext4 defaults 0 0
comment
```

@ -192,7 +192,6 @@ find . -type f -name "*.txt" -exec cat {} \;> all.txt # 查找当前目录下
find . -type f -name "*.txt" -exec printf "File: %s\n" {} \; # 找出当前目录下所有.txt文件并以“File:文件名”的形式打印出来
find . -type f -name "*" | xargs grep "test" # 当前目录搜索包含test内容的文件
find . -type f -mmin -10 # 搜索当前目录中所有过去10分钟中更新过的普通文件。如果不加-type f参数则搜索普通文件+特殊文件+目录
```
```bash
@ -216,6 +215,10 @@ find . -type f -amin +10 # 搜索访问时间超过10分钟的所有文件
find . -type f -mmin -5 # 查找在5分钟内修改过的文件
find . -type f -newer file.log # 找出比file.log修改时间更长的所有文件
find . -newer file1 ! -newer file2 -exec ls -l {} \; # 查找更改时间比文件file1新但比file2旧的文件
# 查找当前目录更改时间一天以内的文件并压缩
find . -mtime -1 -type f -print0 | xargs -0 tar rvf "archive.tar"
find . -mtime -1 -type f -exec tar rvf "archive.tar" '{}' \;
```
```bash

@ -132,6 +132,7 @@ fgrep 快速grep命令不支持正则表达式与grep -F等价
## grep命令常见用法
```bash
grep MemTotal /proc/meminfo # 查看系统可见的总内存
grep bash /etc/passwd | cut -d: -f1 # 显示系统上使用Bash shell登录的所有用户
ls -algG --time-style=+%s | grep ^[^d] | awk -vlimit=$(date +%s -d '10 hours ago') '$4 > limit { print substr($0, index($0, $4) + length($4) + 1) }' # 搜索目录下十小时前更改的文件不包括文件夹只使用grep实现。(更好的方式用find实现)
grep ^[[:upper:]] test.txt # 搜索test.txt以大写字母开头的行POSIX字符类作为模式的用法都类似使用时注意用方括号将POSIX字符括起来就行了

@ -1,21 +1,12 @@
hdparm
===
显示与设定硬盘的参数
# hdparm
## 说明
**hdparm命令** 提供了一个命令行的接口用于读取和设置IDE或SCSI硬盘参数。
### 语法
```
hdparm(选项)(参数)
```
**hdparm命令** 提供了一个命令行的接口用于读取和设置IDE或SCSI硬盘参数
## 选项
```
```markdown
-a<快取分区>:设定读取文件时,预先存入块区的分区数,若不加上<快取分区>选项,则显示目前的设定;
-A<01>:启动或关闭读取文件时的快取功能;
-c<I/O>设定IDE32位I/O模式
@ -46,70 +37,18 @@ hdparm(选项)(参数)
-Z关闭某些Seagate硬盘的自动省电功能。
```
### 参数
设备文件指定id驱动对应的设备文件名。
### 实例
## 实例
显示硬盘的相关设置:
```
hdparm /dev/sda
/dev/sda:
IO_support = 0 (default 16-bit)
readonly = 0 (off)
readahead = 256 (on)
geometry = 19457柱面数/255磁头数/63扇区数, sectors = 312581808总扇区数, start = 0起始扇区数
```bash
hdparm -i /dev/sda # 显示硬盘/dev/sda的相关设置
hdparm -tT /dev/sda # 检测磁盘sda的读取速度
hdparm -g /dev/sda # 显示硬盘的柱面、磁头、扇区数
hdparm -T /dev/xvda # 测试硬盘缓存的读取速度
hdparm -C /dev/sda # 检测硬盘的电源管理模式
hdparm -m /dev/sda # 设置硬盘多重扇区存取的扇区数,以增进硬盘的存取效率,-m不加参数只查询此信息
# 硬盘坏道修复方法(步骤)
smartctl -l selftest /dev/sda
umount /dev/sda*
badblocks /dev/sda
```
显示硬盘的柱面、磁头、扇区数:
```
hdparm -g /dev/sda
/dev/sda:
geometry = 19457柱面数/255磁头数/63扇区数, sectors = 312581808总扇区数, start = 0起始扇区数
```
测试硬盘的读取速度:
```
hdparm -T /dev/sda
/dev/sda:
Timing cached reads: 4684 MB in 2.00 seconds = 2342.92 MB/sec
```
测试硬盘缓存的读取速度:
```
hdparm -T /dev/xvda
/dev/xvda:
Timing cached reads: 11154 MB in 1.98 seconds = 5633.44 MB/sec
```
检测硬盘的电源管理模式:
```
hdparm -C /dev/sda
/dev/sda:
drive state is: standby [省电模式]
```
查询并设置硬盘多重扇区存取的扇区数,以增进硬盘的存取效率:
```
hdparm -m /dev/sda
hdparm -m #参数值为整数值如8 /dev/sda
```
**附:硬盘坏道修复方法**
```
检查smartctl -l selftest /dev/sda
卸载umount /dev/sda*
修复badblocks /dev/sda
```

@ -25,5 +25,5 @@ GB 1000*1000*1000, G 1024*1024*1024, 对于T, P, E, Z, Y 同样适用
```bash
head -1 file # 显示file文件第一行
head -n1 /etc/issue # 查看操作系统版本,不一定每个系统都能看到
```

@ -1,56 +1,27 @@
host
===
常用的分析域名查询工具
# host
## 说明
**host命令** 是常用的分析域名查询工具,可以用来测试域名系统工作是否正常。
### 语法
```
host(选项)(参数)
```
```
-a显示详细的DNS信息
-c<类型>指定查询类型默认值为“IN“
-C查询指定主机的完整的SOA记录
-r在查询域名时不使用递归的查询方式
-t<类型>:指定查询的域名信息类型;
-v显示指令执行的详细信息
-w如果域名服务器没有给出应答信息则总是等待直到域名服务器给出应答
-W<时间>:指定域名查询的最长时间,如果在指定时间内域名服务器没有给出应答信息,则退出指令;
-4使用IPv4
-6使用IPv6.
```
### 参数
主机:指定要查询信息的主机信息。
### 实例
**host命令** 是常用的分析域名查询工具,可以用来测试域名系统工作是否正常
## 选项
```markdown
-a显示详细的DNS信息
-c<类型>指定查询类型默认值为IN
-C查询指定主机的完整的SOA记录
-r在查询域名时不使用递归的查询方式
-t<类型>:指定查询的域名信息类型
-v显示指令执行的详细信息
-w如果域名服务器没有给出应答信息则总是等待直到域名服务器给出应答
-W<时间>:指定域名查询的最长时间,如果在指定时间内域名服务器没有给出应答信息,则退出指令
-4使用IPv4
-6使用IPv6
```
[root@localhost ~]# host www.jsdig.com
www.jsdig.com is an alias for host.1.jsdig.com.
host.1.jsdig.com has address 100.42.212.8
[root@localhost ~]# host -a www.jsdig.com
Trying "www.jsdig.com"
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 34671
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 0
;; QUESTION SECTION:
;www.jsdig.com. IN ANY
## 实例
;; ANSWER SECTION:
www.jsdig.com. 463 IN CNAME host.1.jsdig.com.
```bash
host www.jsdig.com
Received 54 bytes from 202.96.104.15#53 in 0 ms
```

@ -1,39 +1,47 @@
hostname
===
显示和设置系统的主机名
# hostname
## 说明
**hostname命令** 用于显示和设置系统的主机名称。环境变量HOSTNAME也保存了当前的主机名。在使用hostname命令设置主机名后系统并不会永久保存新的主机名重新启动机器之后还是原来的主机名。如果需要永久修改主机名需要同时修改`/etc/hosts`和`/etc/sysconfig/network`的相关内容。
**hostname命令** 用于显示和设置系统的主机名称。环境变量HOSTNAME也保存了当前的主机名。在使用hostname命令设置主机名后
统并不会永久保存新的主机名,重新启动机器之后还是原来的主机名。如果需要永久修改主机名,需要同时修改`/etc/hosts`和
`/etc/sysconfig/network`的相关内容
### 语法
## 选项
```
hostname(选项)(参数)
```
```markdown
Usage: hostname [-b] {hostname|-F file} set host name (from file)
hostname [-a|-A|-d|-f|-i|-I|-s|-y] display formatted name
hostname display host name
{yp,nis,}domainname {nisdomain|-F file} set NIS domain name (from file)
{yp,nis,}domainname display NIS domain name
```
-v详细信息模式
-a显示主机别名
-d显示DNS域名
-f显示FQDN名称
-i显示主机的ip地址
-s显示短主机名称在第一个点处截断
-y显示NIS域名。
```
dnsdomainname display dns domain name
### 参数
hostname -V|--version|-h|--help print info and exit
主机名:指定要设置的主机名。
Program name:
{yp,nis,}domainname=hostname -y
dnsdomainname=hostname -d
### 实例
Program options:
-a, --alias 显示主机别名
-A, --all-fqdns all long host names (FQDNs)
-b, --boot set default hostname if none available
-d, --domain 显示DNS域名
-f, --fqdn, --long 显示FQDN名称
-F, --file read host name or NIS domain name from given file
-i, --ip-address 显示主机的ip地址
-I, --all-ip-addresses all addresses for the host
-s, --short 显示短主机名称,在第一个点处截断
-y, --yp, --nis 显示NIS/YP域名
```
[root@AY1307311912260196fcZ ~]# hostname
AY1307311912260196fcZ
## 实例
```bash
hostname -i # 查寻本地主机的IP地址同等于host `hostname`
```

@ -1,34 +1,36 @@
join
===
两个文件中指定栏位内容相同的行连接起来
# join
## 说明
**join命令** 用来将两个文件中,制定栏位内容相同的行连接起来。找出两个文件中,指定栏位内容相同的行,并加以合并,再输出到标准输出设备。
### 语法
**join命令** 用来将两个文件中,制定栏位内容相同的行连接起来。找出两个文件中,指定栏位内容相同的行,并加以合并,再输出到
标准输出设备
## 选项
```markdown
-a FILENUM 除了显示原来的输出内容之外,还显示指令文件中没有相同栏位的行
-e EMPTY 若[文件1]与[文件2]中找不到指定的栏位,则在输出中填入选项中的字符串
-i, --ignore-case 比较栏位内容时,忽略大小写的差异
-j FIELD equivalent to '-1 FIELD -2 FIELD'
-o FORMAT 按照指定的格式来显示结果
-t CHAR 使用栏位的分割字符
-v 文件编号 类似 -a 文件编号,但禁止组合输出行
-1 域 在文件1 的此域组合
-2 域 在文件2 的此域组合
--check-order 检查输入行是否正确排序,即使所有输入行均是成对的
--nocheck-order 不检查输入是否正确排序
--header 将首行视作域的头部,直接输出而不对其进行匹配
-z, --zero-terminated 以0 字节而非新行作为行尾标志
```
join(选项)(参数)
```
```
-a<12>:除了显示原来的输出内容之外,还显示指令文件中没有相同栏位的行;
-e<字符串>:若[文件1]与[文件2]中找不到指定的栏位,则在输出中填入选项中的字符串;
-i或--ignore-case比较栏位内容时忽略大小写的差异
-o<格式>:按照指定的格式来显示结果;
-t<字符>:使用栏位的分割字符;
-v<12>:更-a相同但是只显示文件中没有相同栏位的行
-1<栏位>:连接[文件1]指定的栏位;
-2<栏位>:连接[文件2]指定的栏位。
```
### 参数
* 文件1要进行合并操作的第1个文件参数
* 文件2要进行合并操作的第2个文件参数。
## 实例
```bash
# 以下如果是英文文本的话export LANG=C可以提高速度
join -t'\0' -a1 -a2 file1 file2 # 两个有序文件的并集
join -t'\0' file1 file2 # 两个有序文件的交集
join -t'\0' -v2 file1 file2 # 两个有序文件的差集
join -t'\0' -v1 -v2 file1 file2 # 两个有序文件的对称差集
```

@ -1,61 +0,0 @@
jwhois
===
whois 客户端服务
## 说明
**jwhois** searches Whois servers for the object on the command line.The host to query is taken from a global configuration file, a configuration file specified on the command line, or selected directly on the command line.
### 语法
```
jwhois [选项]
```
```
--version display version number and patch level
--help display this help
-v, --verbose verbose debug output
-c FILE, --config=FILE use FILE as configuration file
-h HOST, --host=HOST explicitly query HOST
-n, --no-redirect disable content redirection
-s, --no-whoisservers disable whois-servers.net service support
-a, --raw disable reformatting of the query
-i, --display-redirections display all redirects instead of hiding them
-p PORT, --port=PORT use port number PORT (in conjunction with HOST)
-r, --rwhois force an rwhois query to be made
--rwhois-display=DISPLAY sets the display option in rwhois queries
--rwhois-limit=LIMIT sets the maximum number of matches to return
```
> 注:以上英文部分寻求网友协助翻译,翻译结果可发送至 sa(at)linuxde.net谢谢
### 实例
显示指定用户信息:
```
# jwhois root
//查找root用户信息
```
查询域名信息:
```
[root@localhost ~]# jwhois linuxde.net
[Querying whois.verisign-grs.com]
[Redirected to whois.west263.com]
[Querying whois.west263.com]
[whois.west263.com]
Domain Name: linuxde.net                   
Registry Domain id: whois protect
Registrar WHOIS Server: whois.west263.com
...省略部分内容
```

@ -2,11 +2,10 @@
## 说明
**kill命令** 用来删除执行中的程序或工作。kill可将指定的信息送至程序。预设的信息为SIGTERM(15),可将指定程序终止。若仍无法终止该程序可使用SIGKILL(9)信息尝试强制删除程序。程序或工作的编号可利用ps指令或job指令查看。
**kill命令** 用来删除执行中的程序或工作。kill可将指定的信息送至程序。预设的信息为SIGTERM(15),可将指定程序终止。若仍无法
终止该程序可使用SIGKILL(9)信息尝试强制删除程序。程序或工作的编号可利用ps指令或job指令查看
```sh
```markdown
-a当处理当前进程时不限制命令名和进程号的对应关系
-l <信息编号>:若不加<信息编号>选项,则-l参数会列出全部的信息名称
-L, --table List signal names in a nice table
@ -19,7 +18,7 @@
列出所有信号名称:
```sh
```markdown
kill -l
1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL
2) SIGTRAP 6) SIGABRT 7) SIGBUS 8) SIGFPE
@ -41,7 +40,7 @@
只有第9种信号(SIGKILL)才可以无条件终止进程,其他信号进程都有权利忽略, **下面是常用的信号:**
```sh
```markdown
HUP 1 终端断线
INT 2 中断(同 Ctrl + C
QUIT 3 退出(同 Ctrl + \
@ -51,14 +50,7 @@ CONT 18 继续与STOP相反 fg/bg命令
STOP 19 暂停(同 Ctrl + Z
```
先用ps查找进程然后用kill杀掉
```sh
ps -ef | grep vim
root 3268 2884 0 16:21 pts/1 00:00:00 vim install.log
root 3370 2822 0 16:21 pts/0 00:00:00 grep vim
```bash
kill 3268
kill 3268
-bash: kill: (3268) - 没有那个进程
```

@ -126,5 +126,5 @@ lsof输出各列信息的意义如下:
```bash
lsof -i # 列出所有的网络连接或端口
lsof ~ # 查看打开用户目录的进程
```

@ -1,21 +1,12 @@
lspci
===
显示当前主机的所有PCI总线信息
# lspci
## 说明
**lspci命令** 用于显示当前主机的所有PCI总线信息以及所有已连接的PCI设备信息。
### 语法
```
lspci(选项)
```
## 选项
```
```markdown
-n以数字方式显示PCI厂商和设备代码
-t以树状结构显示PCI设备的层次关系包括所有的总线、桥、设备以及它们之间的联接
-b以总线为中心的视图
@ -23,57 +14,53 @@ lspci(选项)
-s仅显示指定总线、插槽上的设备和设备上的功能块信息
-i指定PCI编号列表文件而不使用默认的文件
-m以机器可读方式显示PCI设备信息。
```
### 实例
Usage: lspci [<switches>]
Basic display modes:
-mm Produce machine-readable output (single -m for an obsolete format)
-t Show bus tree
Display options:
-v Be verbose (-vv for very verbose)
-k Show kernel drivers handling each device
-x Show hex-dump of the standard part of the config space
-xxx Show hex-dump of the whole config space (dangerous; root only)
-xxxx Show hex-dump of the 4096-byte extended config space (root only)
-b Bus-centric view (addresses and IRQ's as seen by the bus)
-D Always show domain numbers
Resolving of device ID's to names:
-n Show numeric ID's
-nn Show both textual and numeric ID's (names & numbers)
-q Query the PCI ID database for unknown ID's via DNS
-qq As above, but re-query locally cached entries
-Q Query the PCI ID database for all ID's via DNS
Selection of devices:
-s [[[[<domain>]:]<bus>]:][<slot>][.[<func>]] Show only devices in selected slots
-d [<vendor>]:[<device>][:<class>] Show only devices with specified ID's
Other options:
-i <file> Use specified ID database instead of /usr/share/hwdata/pci.ids
-p <file> Look up kernel modules in a given file instead of default modules.pcimap
-M Enable `bus mapping' mode (dangerous; root only)
PCI access options:
-A <method> Use the specified PCI access method (see `-A help' for a list)
-O <par>=<val> Set PCI access parameter (see `-O help' for a list)
-G Enable PCI access debugging
-H <mode> Use direct hardware access (<mode> = 1 or 2)
-F <file> Read PCI configuration dump from a given file
```
[root@localhost ~]# lspci
00:00.0 host bridge: Intel Corporation 5500 I/O Hub to ESI Port (rev 22)
00:01.0 PCI bridge: Intel Corporation 5520/5500/X58 I/O Hub PCI Express Root Port 1 (rev 22)
00:02.0 PCI bridge: Intel Corporation 5520/5500/X58 I/O Hub PCI Express Root Port 2 (rev 22)
00:03.0 PCI bridge: Intel Corporation 5520/5500/X58 I/O Hub PCI Express Root Port 3 (rev 22)
00:07.0 PCI bridge: Intel Corporation 5520/5500/X58 I/O Hub PCI Express Root Port 7 (rev 22)
00:08.0 PCI bridge: Intel Corporation 5520/5500/X58 I/O Hub PCI Express Root Port 8 (rev 22)
00:09.0 PCI bridge: Intel Corporation 5520/5500/X58 I/O Hub PCI Express Root Port 9 (rev 22)
00:0a.0 PCI bridge: Intel Corporation 5520/5500/X58 I/O Hub PCI Express Root Port 10 (rev 22)
00:10.0 PIC: Intel Corporation 5520/5500/X58 Physical and Link Layer Registers Port 0 (rev 22)
00:10.1 PIC: Intel Corporation 5520/5500/X58 Routing and Protocol Layer Registers Port 0 (rev 22)
00:11.0 PIC: Intel Corporation 5520/5500 Physical and Link Layer Registers Port 1 (rev 22)
00:11.1 PIC: Intel Corporation 5520/5500 Routing & Protocol Layer Register Port 1 (rev 22)
00:14.0 PIC: Intel Corporation 5520/5500/X58 I/O Hub System Management Registers (rev 22)
00:14.1 PIC: Intel Corporation 5520/5500/X58 I/O Hub GPIO and Scratch Pad Registers (rev 22)
00:14.2 PIC: Intel Corporation 5520/5500/X58 I/O Hub Control Status and RAS Registers (rev 22)
00:14.3 PIC: Intel Corporation 5520/5500/X58 I/O Hub Throttle Registers (rev 22)
00:16.0 System peripheral: Intel Corporation 5520/5500/X58 Chipset QuickData Technology Device (rev 22)
00:16.1 System peripheral: Intel Corporation 5520/5500/X58 Chipset QuickData Technology Device (rev 22)
00:16.2 System peripheral: Intel Corporation 5520/5500/X58 Chipset QuickData Technology Device (rev 22)
00:16.3 System peripheral: Intel Corporation 5520/5500/X58 Chipset QuickData Technology Device (rev 22)
00:16.4 System peripheral: Intel Corporation 5520/5500/X58 Chipset QuickData Technology Device (rev 22)
00:16.5 System peripheral: Intel Corporation 5520/5500/X58 Chipset QuickData Technology Device (rev 22)
00:16.6 System peripheral: Intel Corporation 5520/5500/X58 Chipset QuickData Technology Device (rev 22)
00:16.7 System peripheral: Intel Corporation 5520/5500/X58 Chipset QuickData Technology Device (rev 22)
00:1a.0 USB controller: Intel Corporation 82801JI (ICH10 Family) USB UHCI Controller #4
00:1a.1 USB controller: Intel Corporation 82801JI (ICH10 Family) USB UHCI Controller #5
00:1a.7 USB controller: Intel Corporation 82801JI (ICH10 Family) USB2 EHCI Controller #2
00:1b.0 Audio device: Intel Corporation 82801JI (ICH10 Family) HD Audio Controller
00:1c.0 PCI bridge: Intel Corporation 82801JI (ICH10 Family) PCI Express Root Port 1
00:1c.4 PCI bridge: Intel Corporation 82801JI (ICH10 Family) PCI Express Root Port 5
00:1c.5 PCI bridge: Intel Corporation 82801JI (ICH10 Family) PCI Express Root Port 6
00:1d.0 USB controller: Intel Corporation 82801JI (ICH10 Family) USB UHCI Controller #1
00:1d.1 USB controller: Intel Corporation 82801JI (ICH10 Family) USB UHCI Controller #2
00:1d.2 USB controller: Intel Corporation 82801JI (ICH10 Family) USB UHCI Controller #3
00:1d.3 USB controller: Intel Corporation 82801JI (ICH10 Family) USB UHCI Controller #6
00:1d.7 USB controller: Intel Corporation 82801JI (ICH10 Family) USB2 EHCI Controller #1
00:1e.0 PCI bridge: Intel Corporation 82801 PCI Bridge (rev 90)
00:1f.0 ISA bridge: Intel Corporation 82801JIR (ICH10R) lpc Interface Controller
00:1f.2 IDE interface: Intel Corporation 82801JI (ICH10 Family) 4 port SATA IDE Controller #1
00:1f.3 SMBus: Intel Corporation 82801JI (ICH10 Family) SMBus Controller
00:1f.5 IDE interface: Intel Corporation 82801JI (ICH10 Family) 2 port SATA IDE Controller #2
01:01.0 VGA compatible controller: ASPEED Technology, Inc. ASPEED Graphics Family (rev 10)
02:00.0 Ethernet controller: Intel Corporation 82574L Gigabit Network Connection
03:00.0 Ethernet controller: Intel Corporation 82574L Gigabit Network Connection
04:00.0 Serial Attached SCSI controller: LSI Logic / Symbios Logic SAS2008 PCI-Express Fusion-MPT SAS-2 [Falcon] (rev 03)
## 实例
```bash
lspci -tv # 显示PCI信息
```

@ -1,23 +1,15 @@
lsusb
===
显示本机的USB设备列表信息
# lsusb
## 说明
**lsusb命令** 用于显示本机的USB设备列表以及USB设备的详细信息。
lsusb命令是一个学习USB驱动开发认识USB设备的助手推荐大家使用如果您的开发板中或者产品中没有lsusb命令可以自己移植一个放到文件系统里面。
**lsusb命令** 用于显示本机的USB设备列表以及USB设备的详细信息
### 语法
```
lsusb(选项)
```
lsusb命令是一个学习USB驱动开发认识USB设备的助手推荐大家使用如果您的开发板中或者产品中没有lsusb命令可以自己移植
一个,放到文件系统里面
## 选项
```
```markdown
-v显示USB设备的详细信息
-s<总线:设备号>仅显示指定的总线和(或)设备号的设备;
-d<厂商:产品>:仅显示指定厂商和产品编号的设备;
@ -25,17 +17,18 @@ lsusb(选项)
-V显示命令的版本信息。
```
### 实例
## 实例
```bash
: << comment
插入usb鼠标后执行lsusb的输出内容如下:
```
Bus 005 Device 001: id 0000:0000
Bus 001 Device 001: ID 0000:0000
Bus 004 Device 001: ID 0000:0000
Bus 003 Device 001: ID 0000:0000
Bus 002 Device 006: ID 15d9:0a37
Bus 002 Device 001: ID 0000:0000
comment
```
解释:

@ -2,70 +2,70 @@
## 说明
**mount命令** Linux mount命令是经常会使用到的命令它用于挂载Linux系统外的文件
**mount命令** Linux mount命令是经常会使用到的命令它用于挂载Linux系统外的文件
## 选项
```markdown
mount [-hV]
mount -a [-fFnrsvw] [-t vfstype]
mount [-fnrsvw] [-o options [,...]] device | dir
mount [-fnrsvw] [-t vfstype] [-o options] device dir
mount [-lhV]
mount -a [选项]
mount [选项] [--source] <源> | [--target] <目录>
mount [选项] <源> <目录>
mount <操作> <挂载点> [<目标>]
-v显示较讯息通常和 -f 用来除错。
-a将 /etc/fstab 中定义的所有档案系统挂上。
-F这个命令通常和 -a 一起使用,它会为每一个 mount 的动作产生一个行程负责执行。在系统需要挂上大量 NFS 档案系统时可以加快挂上的动作。
-f通常用在除错的用途。它会使 mount 并不执行实际挂上的动作,而是模拟整个挂上的过程。通常会和 -v 一起使用。
-n一般而言mount 在挂上后会在 /etc/mtab 中写入一笔资料。但在系统中没有可写入档案系统存在的情况下可以用这个选项取消这个动作。
-s-r等于 -o ro
-w等于 -o rw
-L将含有特定标签的硬盘分割挂上。
-U将档案分割序号为 的档案系统挂下。-L 和 -U 必须在/proc/partition 这种档案存在时才有意义。
-t指定档案系统的型态通常不必指定。mount 会自动选择正确的型态。
-o async打开非同步模式所有的档案读写动作都会用非同步模式执行。
-o sync在同步模式下执行。
-o atime、-o noatime当 atime 打开时,系统会在每次读取档案时更新档案的『上一次调用时间』。当我们使用 flash 档案系统时可能会选项把这个选项关闭以减少写入的次数。
-o auto、-o noauto打开/关闭自动挂上模式。
-o defaults:使用预设的选项 rw, suid, dev, exec, auto, nouser, and async.
-o dev、-o nodev-o exec、-o noexec允许执行档被执行。
-o suid、-o nosuid
允许执行档在 root 权限下执行。
-o user、-o nouser使用者可以执行 mount/umount 的动作。
-o remount将一个已经挂下的档案系统重新用不同的方式挂上。例如原先是唯读的系统现在用可读写的模式重新挂上。
-o ro用唯读模式挂上。
-o rw用可读写模式挂上。
-o loop=:使用 loop 模式用来将一个档案当成硬盘分割挂上系统。
```
## 实例
```bash
`/dev/hda1` 挂在 `/mnt` 之下。
#mount /dev/hda1 /mnt
选项:
-a, --all 挂载 fstab 中的所有文件系统
-c, --no-canonicalize 不对路径规范化
-f, --fake 空运行;跳过 mount(2) 系统调用,通常用在除错的用途
-F, --fork 对每个设备禁用 fork(和 -a 选项一起使用)
-T, --fstab <路径> /etc/fstab 的替代文件
-h, --help 显示此帮助并退出
-i, --internal-only 不调用 mount.<类型> 助手程序
-l, --show-labels 列出所有带有指定标签的挂载
-n, --no-mtab 不写 /etc/mtab
-o, --options <列表> 挂载选项列表,以英文逗号分隔
-O, --test-opts <列表> 限制文件系统集合(和 -a 选项一起使用)
-r, --read-only 以只读方式挂载文件系统(同 -o ro)
-t, --types <列表> 限制文件系统类型集合
--source <源> 指明源(路径、标签、uuid)
--target <目标> 指明挂载点
-v, --verbose 打印当前进行的操作
-V, --version 显示版本信息并退出
-w, --rw, --read-write 以读写方式挂载文件系统(默认)
mount | column -t # 以表格形式输出
```
源:
-L, --label <标签> 同 LABEL=<label>
-U, --uuid <uuid> 同 UUID=<uuid>
LABEL=<标签> 按文件系统标签指定设备
UUID=<uuid> 按文件系统 UUID 指定设备
PARTLABEL=<标签> 按分区标签指定设备
PARTUUID=<uuid> 按分区 UUID 指定设备
<设备> 按路径指定设备
<目录> 绑定挂载的挂载点(参阅 --bind/rbind)
<文件> 用于设置回环设备的常规文件
`/dev/hda1` 用唯读模式挂在 `/mnt` 之下。
操作:
-B, --bind 挂载其他位置的子树(同 -o bind)
-M, --move 将子树移动到其他位置
-R, --rbind 挂载其他位置的子树及其包含的所有挂载
--make-shared 将子树标记为 共享
--make-slave 将子树标记为 从属
--make-private 将子树标记为 私有
--make-unbindable 将子树标记为 不可绑定
--make-rshared 递归地将整个子树标记为 共享
--make-rslave 递归地将整个子树标记为 从属
--make-rprivate 递归地将整个子树标记为 私有
--make-runbindable 递归地将整个子树标记为 不可绑定
```
#mount -o ro /dev/hda1 /mnt
```
`/tmp/image.iso` 这个光碟的 `image` 档使用 `loop` 模式挂在 `/mnt/cdrom` 之下。用这种方法可以将一般网络上可以找到的 `Linux` 光 碟 ISO 档在不烧录成光碟的情况下检视其内容。
## 实例
```
#mount -o loop /tmp/image.iso /mnt/cdrom
```
```bash
mount /dev/hda1 /mnt # 将/dev/hda1挂在/mnt之下
mount | column -t # 以表格形式输出
mount -t smbfs -o fmask=666,guest //windows_box/share /mnt/share # 挂载一个windows共享
mount -o ro /dev/hda1 /mnt 将/dev/hda1用只读模式挂在/mnt之下
mount -o loop /tmp/image.iso /mnt/cdrom # 将/tmp/image.iso光碟的image使用loop模式挂在/mnt/cdrom下。可不烧录检视光碟
```sh
挂载光驱:
mount /dev/cdrom /mnt/cdrom 格式Mount 设备名字 挂载点
df -h
cd /mnt/cdrom
ls /mnt/cdrom
卸载光驱:
umount /mnt/cdrom (注意卸载时不要在当前/mnt/cdrom目录中不然会提示设备忙的错误信息)
```

@ -7,179 +7,60 @@
## 选项
```markdown
--archive-headers
-a
显示档案库的成员信息,类似ls -l将lib*.a的信息列出。
-b bfdname
--target=bfdname
指定目标码格式。这不是必须的objdump能自动识别许多格式比如
objdump -b oasys -m vax -h fu.o
显示fu.o的头部摘要信息明确指出该文件是Vax系统下用Oasys编译器生成的目标文件。objdump -i将给出这里可以指定的目标码格式列表。
-C
--demangle
将底层的符号名解码成用户级名字除了去掉所开头的下划线之外还使得C++函数名以可理解的方式显示出来。
--debugging
-g
显示调试信息。企图解析保存在文件中的调试信息并以C语言的语法显示出来。仅仅支持某些类型的调试信息。有些其他的格式被readelf -w支持。
-e
--debugging-tags
类似-g选项但是生成的信息是和ctags工具相兼容的格式。
--disassemble
-d
从objfile中反汇编那些特定指令机器码的section。
-D
--disassemble-all
与 -d 类似但反汇编所有section.
--prefix-addresses
反汇编的时候,显示每一行的完整地址。这是一种比较老的反汇编格式。
-EB
-EL
--endian={big|little}
指定目标文件的小端。这个项将影响反汇编出来的指令。在反汇编的文件没描述小端信息的时候用。例如S-records.
-f
--file-headers
显示objfile中每个文件的整体头部摘要信息。
-h
--section-headers
--headers
显示目标文件各个section的头部摘要信息。
-H
--help
简短的帮助信息。
-i
--info
显示对于 -b 或者 -m 选项可用的架构和目标格式列表。
-j name
--section=name
仅仅显示指定名称为name的section的信息
-l
--line-numbers
用文件名和行号标注相应的目标代码,仅仅和-d、-D或者-r一起使用使用-ld和使用-d的区别不是很大在源码级调试的时候有用要求编译时使用了-g之类的调试编译选项。
-m machine
--architecture=machine
指定反汇编目标文件时使用的架构,当待反汇编文件本身没描述架构信息的时候(比如S-records),这个选项很有用。可以用-i选项列出这里能够指定的架构.
--reloc
-r
显示文件的重定位入口。如果和-d或者-D一起使用重定位部分以反汇编后的格式显示出来。
--dynamic-reloc
-R
显示文件的动态重定位入口,仅仅对于动态目标文件意义,比如某些共享库。
-s
--full-contents
显示指定section的完整内容。默认所有的非空section都会被显示。
-S
--source
尽可能反汇编出源代码,尤其当编译的时候指定了-g这种调试参数时效果比较明显。隐含了-d参数。
--show-raw-insn
反汇编的时候,显示每条汇编指令对应的机器码,如不指定--prefix-addresses这将是缺省选项。
--no-show-raw-insn
反汇编时,不显示汇编指令的机器码,如不指定--prefix-addresses这将是缺省选项。
--start-address=address
从指定地址开始显示数据,该选项影响-d、-r和-s选项的输出。
--stop-address=address
显示数据直到指定地址为止,该项影响-d、-r和-s选项的输出。
-t
--syms
显示文件的符号表入口。类似于nm -s提供的信息
-T
--dynamic-syms
显示文件的动态符号表入口,仅仅对动态目标文件意义,比如某些共享库。它显示的信息类似于 nm -D|--dynamic 显示的信息。
-V
--version
版本信息
--all-headers
-x
显示所可用的头信息,包括符号表、重定位入口。-x 等价于-a -f -h -r -t 同时指定。
-z
--disassemble-zeroes
一般反汇编输出将省略大块的零,该选项使得这些零块也被反汇编。
@file 可以将选项集中到一个文件中,然后使用这个@file选项载入。
用法objdump <选项> <文件>
显示来自目标 <文件> 的信息。至少必须给出以下选项之一:
-a, --archive-headers Display archive header information
-f, --file-headers Display the contents of the overall file header
-p, --private-headers Display object format specific file header contents
-P, --private=OPT,OPT... Display object format specific contents
-h, --[section-]headers Display the contents of the section headers
-x, --all-headers Display the contents of all headers
-d, --disassemble Display assembler contents of executable sections
-D, --disassemble-all Display assembler contents of all sections
-S, --source Intermix source code with disassembly
-s, --full-contents Display the full contents of all sections requested
-g, --debugging Display debug information in object file
-e, --debugging-tags Display debug information using ctags style
-G, --stabs Display (in raw form) any STABS info in the file
-W[lLiaprmfFsoRt] or
--dwarf[=rawline,=decodedline,=info,=abbrev,=pubnames,=aranges,=macro,=frames,
=frames-interp,=str,=loc,=Ranges,=pubtypes,
=gdb_index,=trace_info,=trace_abbrev,=trace_aranges,
=addr,=cu_index]
Display DWARF info in the file
-t, --syms Display the contents of the symbol table(s)
-T, --dynamic-syms Display the contents of the dynamic symbol table
-r, --reloc Display the relocation entries in the file
-R, --dynamic-reloc Display the dynamic relocation entries in the file
@<file> Read options from <file>
-v, --version Display this program's version number
-i, --info List object formats and architectures supported
-H, --help Display this information
-a, --archive-headers Display archive header information
-f, --file-headers Display the contents of the overall file header
-p, --private-headers Display object format specific file header contents
-P, --private=OPT,OPT... Display object format specific contents
-h, --[section-]headers Display the contents of the section headers
-x, --all-headers Display the contents of all headers
-d, --disassemble Display assembler contents of executable sections
-D, --disassemble-all Display assembler contents of all sections
-S, --source Intermix source code with disassembly
-s, --full-contents Display the full contents of all sections requested
-g, --debugging Display debug information in object file
-e, --debugging-tags Display debug information using ctags style
-G, --stabs Display (in raw form) any STABS info in the file
-W[lLiaprmfFsoRt] or
--dwarf[=rawline,=decodedline,=info,=abbrev,=pubnames,=aranges,=macro,=frames,
=frames-interp,=str,=loc,=Ranges,=pubtypes,
=gdb_index,=trace_info,=trace_abbrev,=trace_aranges,
=addr,=cu_index]
Display DWARF info in the file
-t, --syms Display the contents of the symbol table(s)
-T, --dynamic-syms Display the contents of the dynamic symbol table
-r, --reloc Display the relocation entries in the file
-R, --dynamic-reloc Display the dynamic relocation entries in the file
@<file> Read options from <file>
-v, --version Display this program's version number
-i, --info List object formats and architectures supported
-H, --help Display this information
以下选项是可选的:
-b, --target=BFDNAME 将标的目标文件格式指定为 BFDNAME
-m, --architecture=MACHINE 将标的体系结构指定为 MACHINE
-j, --section=NAME 只显示 NAME 节的信息
-M, --disassembler-options=OPT 将文本传递到 OPT 反汇编程序
-EB --endian=big 反汇编时假定高位字节在前
-EL --endian=little 反汇编时假定低位字节在前
--file-start-context 从文件的起点引入上下文 (带有 -S)
-l, --line-numbers 在输出中给出行号和文件名
-C, --demangle[=STYLE] 对修饰过的 (mangled) 符号名进行解码
如果给出了 STYLESTYLE 可能为“auto”、“gnu”、
“lucid”、“arm”、“hp”、“edg”或“gnu-new-abi”
-w, --wide 以多于 80 列的宽度对输出进行格式化
-z, --disassemble-zeroes 反汇编时不要跳过为零的块
--start-address=ADDR 只有进程数据的地址 >= ADDR
--stop-address=ADDR 只有进程数据的地址 <= ADDR
--prefix-addresses 同反汇编代码并列显示完整的地址
--[no-]show-raw-insn 同符号反汇编并列显示十六进制值
--adjust-vma=OFFSET 为所有显示的节地址增加 OFFSET
--dwarf-depth=N Do not display DIEs at depth N or greater
--dwarf-start=N Display DIEs starting with N, at the same depth
or deeper
--dwarf-check Make additional dwarf internal consistency checks.
-b, --target=BFDNAME 将标的目标文件格式指定为 BFDNAME
-m, --architecture=MACHINE 将标的体系结构指定为 MACHINE
-j, --section=NAME 只显示 NAME 节的信息
isassembler-options=OPT 将文本传递到 OPT 反汇编程序
ian=big 反汇编时假定高位字节在前
ian=little 反汇编时假定低位字节在前
--file-start-context 从文件的起点引入上下文 (带有 -S)
-l, --line-numbers 在输出中给出行号和文件名
emangle[=STYLE] 对修饰过的 (mangled) 符号名进行解码
如果给出了 STYLESTYLE 可能为“auto”、“gnu”、
”、“arm”、“hp”、“edg”或“gnu-new-abi”
e 以多于 80 列的宽度对输出进行格式化
isassemble-zeroes 反汇编时不要跳过为零的块
dress=ADDR 只有进程数据的地址 >= ADDR
dress=ADDR 只有进程数据的地址 <= ADDR
dresses 同反汇编代码并列显示完整的地址
--[no-]show-raw-insn 同符号反汇编并列显示十六进制值
just-vma=OFFSET 为所有显示的节地址增加 OFFSET
warf-depth=N Do not display DIEs at depth N or greater
warf-start=N Display DIEs starting with N, at the same depth
eeper
warf-check Make additional dwarf internal consistency checks.
objdump支持的目标 elf64-x86-64 elf32-i386 elf32-iamcu 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
objdump支持的体系结构 i386 i386:x86-64 i386:x64-32 i8086 i386:intel i386:x86-64:intel i386:x64-32:intel i386:nacl i386:x86-64:nacl i386:x64-32:nacl iamcu iamcu:intel l1om l1om:intel k1om k1om:intel plugin
@ -205,365 +86,27 @@ objdump支持的体系结构 i386 i386:x86-64 i386:x64-32 i8086 i386:intel
```
### 实例
首先,在给出后面大部分测试所基于的源代码以及编译指令。 源代码如下: 
```
root@localhost [test]# nl mytest.cpp
```
## 实例
```
void printTest() {
char a;
a = 'a';
}
void printTest2() {
int a = 2;
a+=2;
}
```
对以上源代码进行编译,如下: 
```
[root@localhost test]# g++ -c -g mytest.cpp
```
```bash
objdump -a libmy2.a # 查看档案库文件中的信息
objdump -i # 显示可用的架构和目标结构列表
objdump --section=.text -s mytest.o # 显示mytest.o文件中的text段的内容
objdump -S mytest.o # 反汇编出mytest.o的源代码
这里生成的文件是mytest.o为了方便测试包含了调试的信息对可执行文件的测试显示的结果类似。 
objdump -j .text -S mytest.o
: << comment
反汇编mytest.o中的text段内容并尽可能用源代码形式表示,注意:不能单独使用-j或者--section例如`objdump -j .text mytest.o
是不会运行成功的`。另外-S命令对于包含调试信息的目标文件显示的效果比较好如果编译时没有指定g++的-g选项那么目标文件就不
包含调试信息
comment
**查看当前使用的objdump的版本号 **
objdump -d -l mytest.o
: << comment
反汇编特定段,并将汇编代码对应的文件名称和行号对应上
这里,项"-d"从objfile中反汇编那些特定指令机器码的section而使用"-l"指定用文件名和行号标注相应的目标代码,仅仅和-d、-D或
者-r一起使用使用-ld和使用-d的区别不是很大在源码级调试的时候有用要求编译时使用了-g之类的调试编译选项
comment
```
[root@localhost test]# objdump -V
GNU objdump 2.17.50.0.6-14.el5 20061020
Copyright 2005 free Software Foundation, Inc.
This program is free software; you may redistribute it under the terms of
the GNU General Public License. This program has absolutely no warranty.
```
**查看档案库文件中的信息: **
```
[root@localhost test]# objdump -a libmy2.a
In archive libmy2.a:
myfile.o: file format elf32-i386
rwxrwxrwx 0/0 2724 Nov 16 16:06 2009 myfile.o
mytest.o: file format elf32-i386
rw-r--r-- 0/0 727 Jul 13 15:32 2011 mytest.o
```
**这里libmy2.a是一个使用ar命令将多个*.o目标文件打包而生成的静态库。命令的输出类似`ar -tv`,相比较`ar -tv`输出如下: **
```
[root@localhost test]# ar -tv libmy2.a
rwxrwxrwx 0/0 2724 Nov 16 16:06 2009 myfile.o
rw-r--r-- 0/0 727 Jul 13 15:32 2011 mytest.o
```
显示可用的架构和目标结构列表: 
```
[root@localhost test]# objdump -i
BFD header file version 2.17.50.0.6-14.el5 20061020
elf32-i386
(header little endian, data little endian)
i386
a.out-i386-linux
(header little endian, data little endian)
i386
efi-app-ia32
(header little endian, data little endian)
i386
elf64-x86-64
(header little endian, data little endian)
i386
elf64-little
(header little endian, data little endian)
i386
elf64-big
(header big endian, data big endian)
i386
elf32-little
(header little endian, data little endian)
i386
elf32-big
(header big endian, data big endian)
i386
srec
(header endianness unknown, data endianness unknown)
i386
symbolsrec
(header endianness unknown, data endianness unknown)
i386
tekhex
(header endianness unknown, data endianness unknown)
i386
binary
(header endianness unknown, data endianness unknown)
i386
ihex
(header endianness unknown, data endianness unknown)
i386
trad-core
(header endianness unknown, data endianness unknown)
elf32-i386 a.out-i386-linux efi-app-ia32 elf64-x86-64
i386 elf32-i386 a.out-i386-linux efi-app-ia32 elf64-x86-64
elf64-little elf64-big elf32-little elf32-big srec symbolsrec
i386 elf64-little elf64-big elf32-little elf32-big srec symbolsrec
tekhex binary ihex trad-core
i386 tekhex binary ihex ---------
```
这里,显示的信息是相对于 -b 或者 -m 选项可用的架构和目标格式列表。 
**显示mytest.o文件中的text段的内容 **
```
[root@localhost test]# objdump --section=.text -s mytest.o
mytest.o: file format elf32-i386
Contents of section .text:
0000 5589e583 ec10c645 ff61c9c3 5589e583 U......E.a..U...
0010 ec10c745 fc020000 008345fc 02c9c3 ...E......E....
```
这里注意,不能单独使用-j或者--section例如`objdump --section=.text mytest.o`是不会运行成功的。 
**反汇编mytest.o中的text段内容并尽可能用源代码形式表示 **
```
[root@localhost test]# objdump -j .text -S mytest.o
mytest.o: file format elf32-i386
Disassembly of section .text:
00000000 <_Z9printTestv>:
void printTest()
0: 55 push %ebp
1: 89 e5 mov %esp,%ebp
3: 83 ec 10 sub $0x10,%esp
{
char a;
a = 'a';
6: c6 45 ff 61 movb $0x61,0xffffffff(%ebp)
}
a: c9 leave
b: c3 ret
000000c <_Z10printTest2v>:
void printTest2()
c: 55 push %ebp
d: 89 e5 mov %esp,%ebp
f: 83 ec 10 sub $0x10,%esp
{
int a = 2;
12: c7 45 fc 02 00 00 00 movl $0x2,0xfffffffc(%ebp)
a+=2;
19: 83 45 fc 02 addl $0x2,0xfffffffc(%ebp)
}
1d: c9 leave
1e: c3 ret
```
这里注意,不能单独使用-j或者--section例如`objdump -j .text mytest.o是不会运行成功的`。另外-S命令对于包含调试信息的目标文件显示的效果比较好如果编译时没有指定g++的-g选项那么目标文件就不包含调试信息那么显示效果就差多了。 
**反汇编出mytest.o的源代码: **
```
[root@localhost test]# objdump -S mytest.o
mytest.o: file format elf32-i386
Disassembly of section .text:
00000000 <_Z9printTestv>:
void printTest()
0: 55 push %ebp
1: 89 e5 mov %esp,%ebp
3: 83 ec 10 sub $0x10,%esp
{
char a;
a = 'a';
6: c6 45 ff 61 movb $0x61,0xffffffff(%ebp)
}
a: c9 leave
b: c3 ret
0000000c <_Z10printTest2v>:
void printTest2()
c: 55 push %ebp
d: 89 e5 mov %esp,%ebp
f: 83 ec 10 sub $0x10,%esp
{
int a = 2;
12: c7 45 fc 02 00 00 00 movl $0x2,0xfffffffc(%ebp)
a+=2;
19: 83 45 fc 02 addl $0x2,0xfffffffc(%ebp)
}
1d: c9 leave
1e: c3 ret
```
这里,尤其当编译的时候指定了-g这种调试参数时反汇编的效果比较明显。隐含了-d参数。 
**显示文件的符号表入口: **
```
[root@localhost test]# objdump -t mytest.o
mytest.o: file format elf32-i386
SYMBOL TABLE:
00000000 l df *ABS* 00000000 mytest.cpp
00000000 l d .text 00000000 .text
00000000 l d .data 00000000 .data
00000000 l d .bss 00000000 .bss
00000000 l d .debug_abbrev 00000000 .debug_abbrev
00000000 l d .debug_info 00000000 .debug_info
00000000 l d .debug_line 00000000 .debug_line
00000000 l d .debug_frame 00000000 .debug_frame
00000000 l d .debug_loc 00000000 .debug_loc
00000000 l d .debug_pubnames 00000000 .debug_pubnames
00000000 l d .debug_aranges 00000000 .debug_aranges
00000000 l d .note.GNU-stack 00000000 .note.GNU-stack
00000000 l d .comment 00000000 .comment
00000000 g F .text 0000000c _Z9printTestv
00000000 *UND* 00000000 __gxx_personality_v0
0000000c g F .text 00000013 _Z10printTest2v
```
这里,输出的信息类似`nm -s`命令的输出相比较之下nm命令的输出如下 
```
[root@localhost test]# nm -s mytest.o
0000000c T _Z10printTest2v
00000000 T _Z9printTestv
U __gxx_personality_v0
```
**显示文件的符号表入口,将底层符号解码并表示成用户级别: **
```
[root@localhost test]# objdump -t -C mytest.o
mytest.o: file format elf32-i386
SYMBOL TABLE:
00000000 l df *ABS* 00000000 mytest.cpp
00000000 l d .text 00000000 .text
00000000 l d .data 00000000 .data
00000000 l d .bss 00000000 .bss
00000000 l d .debug_abbrev 00000000 .debug_abbrev
00000000 l d .debug_info 00000000 .debug_info
00000000 l d .debug_line 00000000 .debug_line
00000000 l d .debug_frame 00000000 .debug_frame
00000000 l d .debug_loc 00000000 .debug_loc
00000000 l d .debug_pubnames 00000000 .debug_pubnames
00000000 l d .debug_aranges 00000000 .debug_aranges
00000000 l d .note.GNU-stack 00000000 .note.GNU-stack
00000000 l d .comment 00000000 .comment
00000000 g F .text 0000000c printTest()
00000000 *UND* 00000000 __gxx_personality_v0
0000000c g F .text 00000013 printTest2()
```
这里,和没-C相比printTest2函数可读性增加了。 
**反汇编目标文件的特定机器码段: **
```
[root@localhost test]# objdump -d mytest.o
mytest.o: file format elf32-i386
Disassembly of section .text:
00000000 <_Z9printTestv>:
0: 55 push %ebp
1: 89 e5 mov %esp,%ebp
3: 83 ec 10 sub $0x10,%esp
6: c6 45 ff 61 movb $0x61,0xffffffff(%ebp)
a: c9 leave
b: c3 ret
0000000c <_Z10printTest2v>:
c: 55 push %ebp
d: 89 e5 mov %esp,%ebp
f: 83 ec 10 sub $0x10,%esp
12: c7 45 fc 02 00 00 00 movl $0x2,0xfffffffc(%ebp)
19: 83 45 fc 02 addl $0x2,0xfffffffc(%ebp)
1d: c9 leave
1e: c3 ret
```
这里对text段的内容进行了反汇编。 
**反汇编特定段,并将汇编代码对应的文件名称和行号对应上: **
```
[root@localhost test]# objdump -d -l mytest.o
mytest.o: file format elf32-i386
Disassembly of section .text:
00000000 <_Z9printTestv>:
_Z9printTestv():
/root/test/04_libraryTest/mytest.cpp:1
0: 55 push %ebp
1: 89 e5 mov %esp,%ebp
3: 83 ec 10 sub $0x10,%esp
/root/test/04_libraryTest/mytest.cpp:4
6: c6 45 ff 61 movb $0x61,0xffffffff(%ebp)
/root/test/04_libraryTest/mytest.cpp:5
a: c9 leave
b: c3 ret
0000000c <_Z10printTest2v>:
_Z10printTest2v():
/root/test/04_libraryTest/mytest.cpp:6
c: 55 push %ebp
d: 89 e5 mov %esp,%ebp
f: 83 ec 10 sub $0x10,%esp
/root/test/04_libraryTest/mytest.cpp:8
12: c7 45 fc 02 00 00 00 movl $0x2,0xfffffffc(%ebp)
/root/test/04_libraryTest/mytest.cpp:9
19: 83 45 fc 02 addl $0x2,0xfffffffc(%ebp)
/root/test/04_libraryTest/mytest.cpp:10
1d: c9 leave
1e: c3 ret
```
这里,项"-d"从objfile中反汇编那些特定指令机器码的section而使用"-l"指定用文件名和行号标注相应的目标代码,仅仅和-d、-D或者-r一起使用使用-ld和使用-d的区别不是很大在源码级调试的时候有用要求编译时使用了-g之类的调试编译选项。 
**显示目标文件各个段的头部摘要信息: **
```
[root@localhost test]# objdump -h mytest.o
mytest.o: file format elf32-i386
Sections:
Idx Name Size VMA LMA File off Algn
0 .text 0000001f 00000000 00000000 00000034 2**2
CONTENTS, ALLOC, LOAD, readonly, CODE
1 .data 00000000 00000000 00000000 00000054 2**2
CONTENTS, ALLOC, LOAD, DATA
2 .bss 00000000 00000000 00000000 00000054 2**2
ALLOC
3 .debug_abbrev 00000046 00000000 00000000 00000054 2**0
CONTENTS, READONLY, DEBUGGING
4 .debug_info 000000ed 00000000 00000000 0000009a 2**0
CONTENTS, RELOC, READONLY, DEBUGGING
5 .debug_line 0000003e 00000000 00000000 00000187 2**0
CONTENTS, RELOC, READONLY, DEBUGGING
6 .debug_frame 00000044 00000000 00000000 000001c8 2**2
CONTENTS, RELOC, READONLY, DEBUGGING
7 .debug_loc 00000058 00000000 00000000 0000020c 2**0
CONTENTS, READONLY, DEBUGGING
8 .debug_pubnames 0000002f 00000000 00000000 00000264 2**0
CONTENTS, RELOC, READONLY, DEBUGGING
9 .debug_aranges 00000020 00000000 00000000 00000293 2**0
CONTENTS, RELOC, READONLY, DEBUGGING
10 .comment 0000002e 00000000 00000000 000002b3 2**0
CONTENTS, READONLY
11 .note.GNU-stack 00000000 00000000 00000000 000002e1 2**0
CONTENTS, READONLY
```
这里,更多的内容参见`man objdump`中的这个选项。

@ -11,77 +11,40 @@
## 选项
```markdown
-a此参数的效果和同时指定“-ta”参数相同
-A<字码基数>:选择以何种基数计算字码;
-b此参数的效果和同时指定“-toC”参数相同
-c此参数的效果和同时指定“-tC”参数相同
-d此参数的效果和同时指定“-tu2”参数相同
-f此参数的效果和同时指定“-tfF”参数相同
-h此参数的效果和同时指定“-tx2”参数相同
-i此参数的效果和同时指定“-td2”参数相同
-j<字符数目>或--skip-bytes=<字符数目>:略过设置的字符数目;
-l此参数的效果和同时指定“-td4”参数相同
-N<字符数目>或--read-bytes=<字符数目>:到设置的字符树目为止;
-o此参数的效果和同时指定“-to2”参数相同
-s<字符串字符数>或--strings=<字符串字符数>:只显示符合指定的字符数目的字符串;
-t<输出格式>或--format=<输出格式>:设置输出格式;
-v或--output-duplicates输出时不省略重复的数据
-w<每列字符数>或--width=<每列字符数>:设置每列的最大字符数;
-x此参数的效果和同时指定“-h”参数相同
用法od [选项]... [文件]...
 od [-abcdfilosx]... [文件] [[+]偏移量[.][b]]
 od --traditional [选项]... [文件] [[+]偏移量[.][b] [+][标签][.][b]]
将指定文件以八进制形式(默认)转储到标准输出。如果指定了多于一个的文件
参数,程序会自动将输入的内容整合为列表并以同样的形式输出。
如果没有指定文件,或指定文件为"-",程序从标准输入读取数据。
If first and second call formats both apply, the second format is assumed
if the last operand begins with + or (if there are 2 operands) a digit.
An OFFSET operand means -j OFFSET. LABEL is the pseudo-address
at first byte printed, incremented when dump is progressing.
For OFFSET and LABEL, a 0x or 0X prefix indicates hexadecimal;
suffixes may be . for octal and b for multiply by 512.
Mandatory arguments to long options are mandatory for short options too.
-A, --address-radix=RADIX output format for file offsets; RADIX is one
of [doxn], for Decimal, Octal, Hex or None
-j, --skip-bytes=BYTES skip BYTES input bytes first
-N, --read-bytes=BYTES limit dump to BYTES input bytes
-S BYTES, --strings[=BYTES] output strings of at least BYTES graphic chars;
3 is implied when BYTES is not specified
-t, --format=TYPE select output format or formats
-v, --output-duplicates do not use * to mark line suppression
-w[BYTES], --width[=BYTES] output BYTES bytes per output line;
32 is implied when BYTES is not specified
--traditional accept arguments in third form above
--help 显示此帮助信息并退出
--version 显示版本信息并退出
Traditional format specifications may be intermixed; they accumulate:
-a same as -t a, select named characters, ignoring high-order bit
-b same as -t o1, select octal bytes
-c same as -t c, select printable characters or backslash escapes
-d same as -t u2, select unsigned decimal 2-byte units
-f 即 -t fF指定浮点数对照输出格式
-i 即 -t dl指定十进制整数对照输出格式
-l 即 -t dL指定十进制长整数对照输出格式
-o 即 -t o2指定双字节单位八进制数的对照输出格式
-s 即 -t d2指定双字节单位十进制数的对照输出格式
-x 即 -t x2指定双字节单位十六进制数的对照输出格式
TYPE is made up of one or more of these specifications:
a named character, ignoring high-order bit
c printable character or backslash escape
d[尺寸] 有符号十进制数,每个整形数占指定尺寸的字节
f[尺寸] 浮点数,每个整形数占指定尺寸的字节
o[尺寸] 八进制数,每个整形数占指定尺寸的字节
u[尺寸] 无符号十进制数,每个整形数占指定尺寸的字节
x[尺寸] 十六进制数,每个整形数占指定尺寸的字节
将指定文件以八进制形式(默认)转储到标准输出。如果指定了多于一个的文件参数,程序会自动将输入的内容整合为列表并以同样的形式
输出。如果没有指定文件,或指定文件为"-",程序从标准输入读取数据
-A, --address-radix=RADIX output format for file offsets; RADIX is one of [doxn], for Decimal, Octal, Hex or None
-j, --skip-bytes=BYTES skip BYTES input bytes first
-N, --read-bytes=BYTES limit dump to BYTES input bytes
-S BYTES, --strings[=BYTES] output strings of at least BYTES graphic chars;3 is implied when BYTES is not specified
-t, --format=TYPE select output format or formats
-v, --output-duplicates do not use * to mark line suppression
-w[BYTES], --width[=BYTES] output BYTES bytes per output line;32 is implied when BYTES is not specified
--traditional accept arguments in third form above
-a same as -t a, select named characters, ignoring high-order bit
-b same as -t o1, select octal bytes
-c same as -t c, select printable characters or backslash escapes
-d same as -t u2, select unsigned decimal 2-byte units
-f 即 -t fF指定浮点数对照输出格式
-i 即 -t dl指定十进制整数对照输出格式
-l 即 -t dL指定十进制长整数对照输出格式
-o 即 -t o2指定双字节单位八进制数的对照输出格式
-s 即 -t d2指定双字节单位十进制数的对照输出格式
-x 即 -t x2指定双字节单位十六进制数的对照输出格式
a named character, ignoring high-order bit
c printable character or backslash escape
d[尺寸] 有符号十进制数,每个整形数占指定尺寸的字节
f[尺寸] 浮点数,每个整形数占指定尺寸的字节
o[尺寸] 八进制数,每个整形数占指定尺寸的字节
u[尺寸] 无符号十进制数,每个整形数占指定尺寸的字节
x[尺寸] 十六进制数,每个整形数占指定尺寸的字节
SIZE is a number. For TYPE in [doux], SIZE may also be C for
sizeof(char), S for sizeof(short), I for sizeof(int) or L for
@ -91,7 +54,6 @@ for sizeof(double) or L for sizeof(long double).
Adding a z suffix to any type displays printable characters at the end of
each output line.
BYTES is hex with 0x or 0X prefix, and may have a multiplier suffix:
b 512
KB 1000
@ -100,115 +62,20 @@ BYTES is hex with 0x or 0X prefix, and may have a multiplier suffix:
M 1024*1024
and so on for G, T, P, E, Z, Y.
```
### 参数
## 实例
文件:指定要显示的文件。
### 实例
```
[linuxde@localhost ~]$ echo abcdef g > tmp
[linuxde@localhost ~]$ cat tmp
abcdef g
```bash
od -b file # 说明:使用单字节八进制解释进行输出,注意左侧的默认地址格式为八字节
od -c file # 说明使用ASCII码进行输出注意其中包括转义字符
od -t d1 file # 说明:使用单字节十进制进行解释
od -A d -c file # 说明:设置地址格式为十进制。
od -A x -c file # 说明:设置地址格式为十六进制
od -j 2 -c file # 说明:跳过开始的两个字节
od -N 2 -j 2 -c file # 说明:跳过开始的两个字节,并且仅输出两个字节
od -w1 -c file # 说明每行仅输出1个字节
od -w2 -c file # 说明:每行输出两个字节
od -w3 -b file # 说明每行输出3个字节并使用八进制单字节进行解释
```
说明先准备一个tmp文件
```
[linuxde@localhost ~]$ od -b tmp
0000000 141 142 143 144 145 146 040 147 012
0000011
```
说明:使用单字节八进制解释进行输出,注意左侧的默认地址格式为八字节
```
[linuxde@localhost ~]$ od -c tmp
0000000 a b c d e f g \n
0000011
```
说明使用ASCII码进行输出注意其中包括转义字符
```
[linuxde@localhost ~]$ od -t d1 tmp
0000000 97 98 99 100 101 102 32 103 10
0000011
```
说明:使用单字节十进制进行解释
```
[linuxde@localhost ~]$ od -A d -c tmp
0000000 a b c d e f g \n
0000009
```
说明:设置地址格式为十进制。
```
[linuxde@localhost ~]$ od -A x -c tmp
000000 a b c d e f g \n
000009
```
说明:设置地址格式为十六进制
```
[linuxde@localhost ~]$ od -j 2 -c tmp
0000002 c d e f g \n
0000011
```
说明:跳过开始的两个字节
```
[linuxde@localhost ~]$ od -N 2 -j 2 -c tmp
0000002 c d
0000004
```
说明:跳过开始的两个字节,并且仅输出两个字节
```
[linuxde@localhost ~]$ od -w1 -c tmp
0000000 a
0000001 b
0000002 c
0000003 d
0000004 e
0000005 f
0000006
0000007 g
0000010 \n
0000011
```
说明每行仅输出1个字节
```
[linuxde@localhost ~]$ od -w2 -c tmp
0000000 a b
0000002 c d
0000004 e f
0000006 g
0000010 \n
0000011
```
说明:每行输出两个字节
```
[linuxde@localhost ~]$ od -w3 -b tmp
0000000 141 142 143
0000003 144 145 146
0000006 040 147 012
0000011
```
说明每行输出3个字节并使用八进制单字节进行解释

@ -1,27 +1,74 @@
pr
===
将文本文件转换成适合打印的格式
# **pr**
## 说明
**pr命令** 用来将文本文件转换成适合打印的格式,它可以把较大的文件分割成多个页面进行打印,并为每个页面添加标题。
### 语法
## 选项
```
pr(选项)(参数)
```
```markdown
用法pr [选项] [文件]
Mandatory arguments to long options are mandatory for short options too.
+首页[:末页], --pages=首页[:末页]
在指定的首页/末页处开始/停止打印
-列数, --columns=列数
输出指定的列数。如果指定了-a 选项,则从上到下列印。
程序会自动在每一页均衡每列占用的行数。
-a, --across 设置每列从上到下输出,配合"-列数"选项一起使用
-c, --show-control-chars
使用头标(^G)和八进制反斜杠标记
-d, --double-space 加倍输出空白区域
-D, --date-format=格式
使用遵循指定格式的页眉日期
-e[字符[宽度]], --expand-tabs[=字符[宽度]]
扩展输入的字符(制表符) 到制表符宽度(8)
-F, -f, --form-feed 使用出纸页页标代替新行作为页面间的分隔符
(使用-F 选项时报头为3 行,不使用时为5 行)
-h, --header=页眉 在页眉中使用居中的指定字符代替文件名,-h "" 输出一个空行,不要使用 -h"" 即为页指定标题
-i[字符[宽度]], --output-tabs[=字符[宽度]]
使用指定字符(或制表符)代替空格不足到指定制表符宽度(默认8)
-J, --join-lines 合并整个行,关闭-W 选项的行截断,不使用栏调整,使用
--sep-string[=字符串] 设置分隔符
-l, --length=页长 使用指定页长的行数(默认66)(默认文本行数为56当启用-F 时为 63)
-m, --merge 在同一行显示所有文件,每个文件占用一栏,分割行,但是当
使用-J 时将行合并到完整长度
-n[分隔符[位数]], --number-lines[=分隔符[位数]]
显示行号,使用指定(默认5) 位数,后接分隔符(默认TAB)
默认从输入文件的第一行开始计数
-N, --first-line-number=数字
从首页的首行以指定数字开始计数(参看"+首页")
-o, --indent=缩进量
将每行缩进(默认0)个空格,不影响-w 或-W 参数,
缩进亮的值将被加入页面宽度
-r, --no-file-warnings
当文件无法打开时忽略警告
-s[CHAR], --separator[=CHAR]
由单个字符分隔各列,未附加-w 时默认为制表符,否则为空。
另外除非-w 选项被指定,否则"-s[CHAR]"会屏蔽三个列相关
的截行选项(-COLUMN|-a -COLUMN|-m)
-S[STRING], --sep-string[=STRING]
separate columns by STRING,
without -S: Default separator <TAB> with -J and <space>
otherwise (same as -S" "), no effect on column options
-t, --omit-header omit page headers and trailers
-T, --omit-pagination
按照输入文件中的设置忽略页眉和页脚并除去所有分页记号
-v, --show-nonprinting
使用八进制反斜杠标记
-w, --width=页面宽度
为多栏页面输出将设置为指定的字符数(默认72)
仅当-s[char] 选项不启用时有效(即保持默认值 72)。
-W, --page-width=页宽
总是将页宽设置为指定的(默认72)字符数,
除非-J 选项启用总是截断行,此参数与-S 或-s 冲突
```
-h<标题>:为页指定标题;
-l<行数>:指定每页的行数。
```
如果页长<=10 则使用-t 选项。如果FILE 没有定义或者FILE 是"-",则从标准输入读入
### 参数
```
文件:需要转换格式的文件。
## 实例
```bash
```

@ -1,24 +1,35 @@
printf
===
格式化并输出结果
# **printf**
## 说明
**printf命令** 格式化并输出结果到标准输出
**printf命令** 格式化并输出结果到标准输出
### 语法
## 选项
```
printf(选项)(参数)
--help在线帮助
--version显示版本信息。
```
```markdown
### 参数
和C语言printf一样FORMAT控制输出转义序列如下
* 输出格式:指定数据输出时的格式;
* 输出字符串:指定要输出的数据。
\" 双引号
\\ 反斜杠
\a 警告字符通常是ASCII的(BEL)字符
\b 后退
\c 抑制(不显示)输出结果中任何结尾的换行字符(只在%b格式指示符控制下的参数字符串中有效
\e escape
\f 换页(form feed)
\n 换行
\r 回车(carriage return)
\t 水平制表符
\v 垂直制表符
\NNN byte with octal value NNN (1 to 3 digits)
\xHH byte with hexadecimal value HH (1 to 2 digits)
\uHHHH Unicode (ISO/IEC 10646) character with hex value HHHH (4 digits)
\UHHHHHHHH Unicode character with hex value HHHHHHHH (8 digits)
%% a single %
%b ARGUMENT as a string with '\' escapes interpreted, except that octal escapes are of the form \0 or \0NNN
```
**格式替代符**
@ -35,38 +46,14 @@ printf(选项)(参数)
* %X 不带正负号的十六进制值使用A至F表示10至15
* %% 字面意义的%
**转义序列**
* \a 警告字符通常为ASCII的BEL字符
* \b 后退
* \c 抑制(不显示)输出结果中任何结尾的换行字符(只在%b格式指示符控制下的参数字符串中有效而且任何留在参数里的字符、任何接下来的参数以及任何留在格式字符串中的字符都被忽略
* \f 换页formfeed
* \n 换行
* \r 回车Carriage return
* \t 水平制表符
* \v 垂直制表符
* \\ 一个字面上的反斜杠字符
* \ddd 表示1到3位数八进制值的字符仅在格式字符串中有效
* \0ddd 表示1到3位的八进制值字符
### 实例
```
printf "hello world"
```
```
#!/bin/bash
## 实例
```bash
# %-5s 格式为左对齐且宽度为5的字符串代替-表示左对齐),不使用则是又对齐
# %-4.2f 格式为左对齐宽度为4保留两位小数
printf "%-5s %-10s %-4s\n" NO Name Mark
printf "%-5s %-10s %-4.2f\n" 01 Tom 90.3456
printf "%-5s %-10s %-4.2f\n" 02 Jack 89.2345
printf "%-5s %-10s %-4.2f\n" 03 Jeff 98.4323
```
* %-5s 格式为左对齐且宽度为5的字符串代替-表示左对齐),不使用则是又对齐。
* %-4.2f 格式为左对齐宽度为4保留两位小数。

@ -88,9 +88,17 @@ Miscellaneous options:
## 实例
```bash
# 查看所有用户执行的进程的详细信息
ps -aux
ps -le
ps -p pid1,pid2 # 显示指定进程id的信息此例为pid1pid2进程的信息
ps aux | sort -rnk 4 # 按内存资源的使用量对进程进行排序
ps aux | sort -nk 3 # 按CPU 资源的使用量对进程进行排序
ps -le or ps -aux # 查看所有用户执行的进程的详细信息
ps -eo pid,args --forest # 以树结构显示进程
ps -eo pcpu,cpu,nice,state,cputime,args --sort pcpu | sed '/^ 0.0 /d' # 以CPU占用率为序显示进程
ps -e -orss=,args= | sort -rb -k1,1n | pr -TW$COLUMNS # 以内存使用量排序显示进程
ps -C nginx -L -o pid,tid,pcpu,state # 显示指定进程的所有线程信息
ps -aux --sort pid # 可按照进程执行的时间PIDUID等对进程进行排序
ps -uU tangsir / ps -aux | grep tangsir # 查看系统中指定用户执行的进程
pstree | more # 进程树,非常直观的观察父子进程

@ -17,21 +17,21 @@
用法readelf <选项> elf-文件
显示关于 ELF 格式文件内容的信息
Options are:
-a --all Equivalent to: -h -l -S -s -r -d -V -A -I
-h --file-header Display the ELF file header
-a --all 显示全部信息,等价于: -h -l -S -s -r -d -V -A -I
-h --file-header 显示elf文件开始的文件头信息
-l --program-headers Display the program headers
--segments An alias for --program-headers
-S --section-headers Display the sections' header
--sections An alias for --section-headers
-g --section-groups Display the section groups
-t --section-details Display the section details
-e --headers Equivalent to: -h -l -S
-e --headers 显示全部头信息,等价于: -h -l -S
-s --syms Display the symbol table
--symbols An alias for --syms
--dyn-syms Display the dynamic symbol table
-n --notes Display the core notes (if present)
-r --relocs Display the relocations (if present)
-u --unwind Display the unwind info (if present)
-r --relocs 显示可重定位段的信息 (if present)
-u --unwind 显示unwind段信息。当前只支持IA64 ELF的unwind段信息 (if present)
-d --dynamic Display the dynamic section (if present)
-V --version-info Display the version sections (if present)
-A --arch-specific Display architecture specific information (if any)
@ -84,565 +84,20 @@ elf文件头描述elf文件的总体信息。包括系统相关类型相
* 加载相关:包括程序头表相关信息。 
* 链接相关:节头表相关信息。 
## 实例
```
-a
--all 显示全部信息,等价于 -h -l -S -s -r -d -V -A -I.
-h
--file-header 显示elf文件开始的文件头信息.
-l
--program-headers
--segments 显示程序头(段头)信息(如果有的话)。
-S
--section-headers
--sections 显示节头信息(如果有的话)。
-g
--section-groups 显示节组信息(如果有的话)。
-t
--section-details 显示节的详细信息(-S的)。
-s
--syms
--symbols 显示符号表段中的项(如果有的话)。
-e
--headers 显示全部头信息,等价于: -h -l -S
-n
--notes 显示note段内核注释的信息。
-r
--relocs 显示可重定位段的信息。
-u
--unwind 显示unwind段信息。当前只支持IA64 ELF的unwind段信息。
-d
--dynamic 显示动态段的信息。
-V
--version-info 显示版本段的信息。
-A
--arch-specific 显示CPU构架信息。
-D
--use-dynamic 使用动态段中的符号表显示符号,而不是使用符号段。
-x <number or name>
--hex-dump=<number or name> 以16进制方式显示指定段内内容。number指定段表中段的索引,或字符串指定文件中的段名。
-w[liaprmfFsoR] or
--debug-dump[=line,=info,=abbrev,=pubnames,=aranges,=macro,=frames,=frames-interp,=str,=loc,=Ranges] 显示调试段中指定的内容。
-I
--histogram 显示符号的时候显示bucket list长度的柱状图。
-v
--version 显示readelf的版本信息。
-H
--help 显示readelf所支持的命令行选项。
-W
--wide 宽行输出。
@file 可以将选项集中到一个文件中,然后使用这个@file选项载入。
```
### 实例
先给出如下例子:
**1.对于可执行文件形式的elf格式文件**
1)查看可执行程序的源代码如下: 
```
root@localhost [test]$ cat main.cpp
#include <iostream>
using std::cout;
using std::endl;
void my_print();
int main(int argc, char *argv[])
{
my_print();
cout<<"hello!"<<endl;
return 0;
}
void my_print()
{
cout<<"print!"<<endl;
}
```
2)编译如下: 
```bash
readelf -h main # 读取可执行文件main的elf文件头信息
readelf -h myfile.o # 读取目标文件形式的elf文件头信息
readelf -h libmy.a # 读取静态库文件形式的elf文件头信息
readelf -h libmy.so # 读取动态库文件形式的elf文件头信息
readelf -l main # 查看可执行的elf文件程序头表信息
readelf -l myfile.o # 查看目标文件的elf文件程序头表信息
readelf -l libmy.a # 查看静态库文件的elf文件程序头表信息
readelf -l libmy.so # 查看动态库文件的elf文件程序头表信息
readelf -S main # 查看一个可执行的elf文件的节信息
readelf -S main.debug # 查看一个包含调试信息的可执行的elf文件的节信息
readelf -S myfile.o # 查看一个目标文件的elf文件的节信息
readelf -S libmy.a # 查看一个静态库文件的elf文件的节信息
```
[root@localhost test]$ g++ main.cpp -o main
[root@localhost test]$ g++ -g main.cpp -o main.debug
```
3)编译之后,查看生成的文件: 
```
[root@localhost test]$ ls -l
总计 64
-rwxr-xr-x 1 quietheart quietheart 6700 07-07 18:04 main
-rw-r--r-- 1 quietheart quietheart 201 07-07 18:02 main.cpp
-rwxr-xr-x 1 quietheart quietheart 38932 07-07 18:04 main.debug
```
这里main.debug是带有调试信息的可执行文件main是一般的可执行文件。 
**2.对于库文件形式的elf格式文件**
1)查看库的源代码如下: 
```
//myfile.h
#ifndef __MYFILE_H
#define __MYFILE_H
void printInfo();
#endif
//myfile.cpp
#include "myfile.h"
#include <iostream>
using std::cout;
using std::endl;
void printInfo()
{
cout<<"hello"<<endl;
}
```
2)编译如下: 
```
[root@localhost test]$ g++ -c myfile.cpp
[root@localhost test]$ g++ -shared -fPCI -o libmy.so myfile.o
[root@localhost test]$ ar -r libmy.a myfile.o
ar: creating libmy.a
```
3)编译之后,查看生成的文件: 
[root@localhost test]$ ls -l 
总计 44 
```
-rw-r--r-- 1 quietheart quietheart 2154 07-08 16:14 libmy.a
-rwxr-xr-x 1 quietheart quietheart 5707 07-08 16:08 libmy.so
-rwxr-xr-x 1 quietheart quietheart 117 07-08 16:06 myfile.cpp
-rwxr-xr-x 1 quietheart quietheart 63 07-08 16:08 myfile.h
-rw-r--r-- 1 quietheart quietheart 2004 07-08 16:08 myfile.o
libmy.a libmy.so myfile.cpp myfile.h myfile.o
```
这里分别生成目标文件myfile.o共享库文件libmy.so和静态库文件libmy.a。 
基于以上可执行文件和库,这里给出一些常用的命令。 
**读取可执行文件形式的elf文件头信息**
```
[root@localhost test]$ readelf -h main
ELF Header:
Magic: 7f 45 4c 46 01 01 01 00 00 00 00 00 00 00 00 00
Class: ELF32
Data: 2's complement, little endian
Version: 1 (current)
OS/ABI: UNIX - System V
ABI Version: 0
type: exec (Executable file)
Machine: Intel 80386
Version: 0x1
Entry point address: 0x8048580
Start of program headers: 52 (bytes into file)
Start of section headers: 3232 (bytes into file)
Flags: 0x0
Size of this header: 52 (bytes)
Size of program headers: 32 (bytes)
Number of program headers: 8
Size of section headers: 40 (bytes)
Number of section headers: 29
Section header string table index: 26
```
这里可见可执行文件的elf文件其类型为EXEC(可执行文件)。另外,含调试信息的"main.debug"和不含调试信息的"main"除了一些大小信息之外其内容是一样的。并且由此可见文件的体系结构为Intel 80386。 
**读取目标文件形式的elf文件头信息**
```
[root@localhost test]$ readelf -h myfile.o
ELF Header:
Magic: 7f 45 4c 46 01 01 01 00 00 00 00 00 00 00 00 00
Class: ELF32
Data: 2's complement, little endian
Version: 1 (current)
OS/ABI: UNIX - System V
ABI Version: 0
Type: REL (Relocatable file)
Machine: Intel 80386
Version: 0x1
Entry point address: 0x0
Start of program headers: 0 (bytes into file)
Start of section headers: 516 (bytes into file)
Flags: 0x0
Size of this header: 52 (bytes)
Size of program headers: 0 (bytes)
Number of program headers: 0
Size of section headers: 40 (bytes)
Number of section headers: 15
Section header string table index: 12
```
这里可见目标文件的elf文件其类型为REL(可重定位文件)。 
**读取静态库文件形式的elf文件头信息**
```
[root@localhost test]$ readelf -h libmy.a
File: libmy.a(myfile.o)
ELF Header:
Magic: 7f 45 4c 46 01 01 01 00 00 00 00 00 00 00 00 00
Class: ELF32
Data: 2's complement, little endian
Version: 1 (current)
OS/ABI: UNIX - System V
ABI Version: 0
Type: REL (Relocatable file)
Machine: Intel 80386
Version: 0x1
Entry point address: 0x0
Start of program headers: 0 (bytes into file)
Start of section headers: 516 (bytes into file)
Flags: 0x0
Size of this header: 52 (bytes)
Size of program headers: 0 (bytes)
Number of program headers: 0
Size of section headers: 40 (bytes)
Number of section headers: 15
Section header string table index: 12
```
这里可见静态库文件的elf文件其类型为REL(可重定位文件)。 
**读取动态库文件形式的elf文件头信息**
```
[root@localhost test]$ readelf -h libmy.so
ELF Header:
Magic: 7f 45 4c 46 01 01 01 00 00 00 00 00 00 00 00 00
Class: ELF32
Data: 2's complement, little endian
Version: 1 (current)
OS/ABI: UNIX - System V
ABI Version: 0
Type: DYN (Shared object file)
Machine: Intel 80386
Version: 0x1
Entry point address: 0x550
Start of program headers: 52 (bytes into file)
Start of section headers: 2768 (bytes into file)
Flags: 0x0
Size of this header: 52 (bytes)
Size of program headers: 32 (bytes)
Number of program headers: 5
Size of section headers: 40 (bytes)
Number of section headers: 27
Section header string table index: 24
```
这里可见动态库文件的elf文件其类型为DYN(共享目标文件)。 
**查看可执行的elf文件程序头表信息**
```
[root@localhost test]$ readelf -l main
Elf file type is EXEC (Executable file)
Entry point 0x8048580
There are 8 program headers, starting at offset 52
Program Headers:
Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align
PHDR 0x000034 0x08048034 0x08048034 0x00100 0x00100 R E 0x4
INTERP 0x000134 0x08048134 0x08048134 0x00013 0x00013 R 0x1
Requesting program interpreter: /lib/[ld-linux.so.2]
LOAD 0x000000 0x08048000 0x08048000 0x00970 0x00970 R E 0x1000
LOAD 0x000970 0x08049970 0x08049970 0x00130 0x001c8 RW 0x1000
DYNAMIC 0x000988 0x08049988 0x08049988 0x000e0 0x000e0 RW 0x4
NOTE 0x000148 0x08048148 0x08048148 0x00020 0x00020 R 0x4
GNU_EH_FRAME 0x000820 0x08048820 0x08048820 0x00044 0x00044 R 0x4
GNU_STACK 0x000000 0x00000000 0x00000000 0x00000 0x00000 RW 0x4
Section to Segment mapping:
Segment Sections...
00
01 .interp
02 .interp .note.ABI-tag .gnu.hash .dynsym .dynstr .gnu.version .gnu.version_r .rel.dyn .rel.plt .init .plt .text .fini .rodata .eh_frame_hdr .eh_frame
03 .ctors .dtors .jcr .dynamic .got .got.plt .data .bss
04 .dynamic
05 .note.ABI-tag
06 .eh_frame_hdr
07
```
这里,含调试信息的"main.debug"和不含调试信息的"main"其内容是一样的。 
**查看目标文件的elf文件程序头表信息 **
```
[root@localhost test]$ readelf -l myfile.o
There are no program headers in this file.
```
这里可知,可重定位的目标文件,它没程序头表。 
**查看静态库文件的elf文件程序头表信息**
```
[root@localhost test]$ readelf -l libmy.a
File: libmy.a(myfile.o)
There are no program headers in this file.
```
这里可知,可重定位的静态库文件,它没程序头表。 
**查看动态库文件的elf文件程序头表信息**
```
[root@localhost test]$ readelf -l libmy.so
Elf file type is DYN (Shared object file)
Entry point 0x550
There are 5 program headers, starting at offset 52
Program Headers:
Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align
LOAD 0x000000 0x00000000 0x00000000 0x007f4 0x007f4 R E 0x1000
LOAD 0x0007f4 0x000017f4 0x000017f4 0x0011c 0x00128 RW 0x1000
DYNAMIC 0x000810 0x00001810 0x00001810 0x000e0 0x000e0 RW 0x4
GNU_EH_FRAME 0x000738 0x00000738 0x00000738 0x0002c 0x0002c R 0x4
GNU_STACK 0x000000 0x00000000 0x00000000 0x00000 0x00000 RW 0x4
Section to Segment mapping:
Segment Sections...
00 .gnu.hash .dynsym .dynstr .gnu.version .gnu.version_r .rel.dyn .rel.plt .init .plt .text .fini .rodata .eh_frame_hdr .eh_frame
01 .ctors .dtors .jcr .data.rel.ro .dynamic .got .got.plt .bss
02 .dynamic
03 .eh_frame_hdr
04
```
这里可知,做为共享目标文件的动态库,它程序头表。 
**查看一个可执行的elf文件的节信息**
```
[root@localhost test]$ readelf -S main
There are 29 section headers, starting at offset 0xca0:
Section Headers:
[Nr] Name Type Addr Off Size ES Flg Lk Inf Al
[ 0] NULL 00000000 000000 000000 00 0 0 0
[ 1] .interp PROGBITS 08048134 000134 000013 00 A 0 0 1
[ 2] .note.ABI-tag NOTE 08048148 000148 000020 00 A 0 0 4
[ 3] .gnu.hash GNU_HASH 08048168 000168 000030 04 A 4 0 4
[ 4] .dynsym DYNSYM 08048198 000198 0000d0 10 A 5 1 4
[ 5] .dynstr STRTAB 08048268 000268 000183 00 A 0 0 1
[ 6] .gnu.version VERSYM 080483ec 0003ec 00001a 02 A 4 0 2
[ 7] .gnu.version_r VERNEED 08048408 000408 000060 00 A 5 2 4
[ 8] .rel.dyn REL 08048468 000468 000010 08 A 4 0 4
[ 9] .rel.plt REL 08048478 000478 000048 08 A 4 11 4
[10] .init PROGBITS 080484c0 0004c0 000017 00 AX 0 0 4
[11] .plt PROGBITS 080484d8 0004d8 0000a0 04 AX 0 0 4
[12] .text PROGBITS 08048580 000580 000268 00 AX 0 0 16
[13] .fini PROGBITS 080487e8 0007e8 00001c 00 AX 0 0 4
[14] .rodata PROGBITS 08048804 000804 00001a 00 A 0 0 4
[15] .eh_frame_hdr PROGBITS 08048820 000820 000044 00 A 0 0 4
[16] .eh_frame PROGBITS 08048864 000864 00010c 00 A 0 0 4
[17] .ctors PROGBITS 08049970 000970 00000c 00 WA 0 0 4
[18] .dtors PROGBITS 0804997c 00097c 000008 00 WA 0 0 4
[19] .jcr PROGBITS 08049984 000984 000004 00 WA 0 0 4
[20] .dynamic DYNAMIC 08049988 000988 0000e0 08 WA 5 0 4
[21] .got PROGBITS 08049a68 000a68 000004 04 WA 0 0 4
[22] .got.plt PROGBITS 08049a6c 000a6c 000030 04 WA 0 0 4
[23] .data PROGBITS 08049a9c 000a9c 000004 00 WA 0 0 4
[24] .bss NOBITS 08049aa0 000aa0 000098 00 WA 0 0 8
[25] .comment PROGBITS 00000000 000aa0 000114 00 0 0 1
[26] .shstrtab STRTAB 00000000 000bb4 0000e9 00 0 0 1
[27] .symtab SYMTAB 00000000 001128 000510 10 28 53 4
[28] .strtab STRTAB 00000000 001638 0003f4 00 0 0 1
Key to Flags:
W (write), A (alloc), X (execute), M (merge), S (strings)
I (info), L (link order), G (group), x (unknown)
O (extra OS processing required) o (OS specific), p (processor specific)
```
这里main是可执行文件不含调试信息。 
**查看一个包含调试信息的可执行的elf文件的节信息**
```
[root@localhost test]$ readelf -S main.debug
There are 37 section headers, starting at offset 0x88c8:
Section Headers:
[Nr] Name Type Addr Off Size ES Flg Lk Inf Al
[ 0] NULL 00000000 000000 000000 00 0 0 0
[ 1] .interp PROGBITS 08048134 000134 000013 00 A 0 0 1
[ 2] .note.ABI-tag NOTE 08048148 000148 000020 00 A 0 0 4
[ 3] .gnu.hash GNU_HASH 08048168 000168 000030 04 A 4 0 4
[ 4] .dynsym DYNSYM 08048198 000198 0000d0 10 A 5 1 4
[ 5] .dynstr STRTAB 08048268 000268 000183 00 A 0 0 1
[ 6] .gnu.version VERSYM 080483ec 0003ec 00001a 02 A 4 0 2
[ 7] .gnu.version_r VERNEED 08048408 000408 000060 00 A 5 2 4
[ 8] .rel.dyn REL 08048468 000468 000010 08 A 4 0 4
[ 9] .rel.plt REL 08048478 000478 000048 08 A 4 11 4
[10] .init PROGBITS 080484c0 0004c0 000017 00 AX 0 0 4
[11] .plt PROGBITS 080484d8 0004d8 0000a0 04 AX 0 0 4
[12] .text PROGBITS 08048580 000580 000268 00 AX 0 0 16
[13] .fini PROGBITS 080487e8 0007e8 00001c 00 AX 0 0 4
[14] .rodata PROGBITS 08048804 000804 00001a 00 A 0 0 4
[15] .eh_frame_hdr PROGBITS 08048820 000820 000044 00 A 0 0 4
[16] .eh_frame PROGBITS 08048864 000864 00010c 00 A 0 0 4
[17] .ctors PROGBITS 08049970 000970 00000c 00 WA 0 0 4
[18] .dtors PROGBITS 0804997c 00097c 000008 00 WA 0 0 4
[19] .jcr PROGBITS 08049984 000984 000004 00 WA 0 0 4
[20] .dynamic DYNAMIC 08049988 000988 0000e0 08 WA 5 0 4
[21] .got PROGBITS 08049a68 000a68 000004 04 WA 0 0 4
[22] .got.plt PROGBITS 08049a6c 000a6c 000030 04 WA 0 0 4
[23] .data PROGBITS 08049a9c 000a9c 000004 00 WA 0 0 4
[24] .bss NOBITS 08049aa0 000aa0 000098 00 WA 0 0 8
[25] .comment PROGBITS 00000000 000aa0 000114 00 0 0 1
[26] .debug_aranges PROGBITS 00000000 000bb4 000020 00 0 0 1
[27] .debug_pubnames PROGBITS 00000000 000bd4 000028 00 0 0 1
[28] .debug_info PROGBITS 00000000 000bfc 0067aa 00 0 0 1
[29] .debug_abbrev PROGBITS 00000000 0073a6 000726 00 0 0 1
[30] .debug_line PROGBITS 00000000 007acc 0003e1 00 0 0 1
[31] .debug_frame PROGBITS 00000000 007eb0 00009c 00 0 0 4
[32] .debug_str PROGBITS 00000000 007f4c 000735 00 0 0 1
[33] .debug_loc PROGBITS 00000000 008681 0000f3 00 0 0 1
[34] .shstrtab STRTAB 00000000 008774 000151 00 0 0 1
[35] .symtab SYMTAB 00000000 008e90 000590 10 36 61 4
[36] .strtab STRTAB 00000000 009420 0003f4 00 0 0 1
Key to Flags:
W (write), A (alloc), X (execute), M (merge), S (strings)
I (info), L (link order), G (group), x (unknown)
O (extra OS processing required) o (OS specific), p (processor specific)
```
可见,相对非调试版本的可执行文件,多了".debug*"段的信息。 
**查看一个目标文件的elf文件的节信息**
```
[root@localhost test]$ readelf -S myfile.o
There are 15 section headers, starting at offset 0x204:
Section Headers:
[Nr] Name Type Addr Off Size ES Flg Lk Inf Al
[ 0] NULL 00000000 000000 000000 00 0 0 0
[ 1] .text PROGBITS 00000000 000034 00009e 00 AX 0 0 4
[ 2] .rel.text REL 00000000 000744 000060 08 13 1 4
[ 3] .data PROGBITS 00000000 0000d4 000000 00 WA 0 0 4
[ 4] .bss NOBITS 00000000 0000d4 000001 00 WA 0 0 4
[ 5] .ctors PROGBITS 00000000 0000d4 000004 00 WA 0 0 4
[ 6] .rel.ctors REL 00000000 0007a4 000008 08 13 5 4
[ 7] .rodata PROGBITS 00000000 0000d8 000006 00 A 0 0 1
[ 8] .eh_frame PROGBITS 00000000 0000e0 00008c 00 A 0 0 4
[ 9] .rel.eh_frame REL 00000000 0007ac 000028 08 13 8 4
[10] .comment PROGBITS 00000000 00016c 00002e 00 0 0 1
[11] .note.GNU-stack PROGBITS 00000000 00019a 000000 00 0 0 1
[12] .shstrtab STRTAB 00000000 00019a 00006a 00 0 0 1
[13] .symtab SYMTAB 00000000 00045c 000180 10 14 14 4
[14] .strtab STRTAB 00000000 0005dc 000166 00 0 0 1
Key to Flags:
W (write), A (alloc), X (execute), M (merge), S (strings)
I (info), L (link order), G (group), x (unknown)
O (extra OS processing required) o (OS specific), p (processor specific)
```
**查看一个静态库文件的elf文件的节信息**
```
[root@localhost test]$ readelf -S libmy.a
File: libmy.a(myfile.o)
There are 15 section headers, starting at offset 0x204:
Section Headers:
[Nr] Name Type Addr Off Size ES Flg Lk Inf Al
[ 0] NULL 00000000 000000 000000 00 0 0 0
[ 1] .text PROGBITS 00000000 000034 00009e 00 AX 0 0 4
[ 2] .rel.text REL 00000000 000744 000060 08 13 1 4
[ 3] .data PROGBITS 00000000 0000d4 000000 00 WA 0 0 4
[ 4] .bss NOBITS 00000000 0000d4 000001 00 WA 0 0 4
[ 5] .ctors PROGBITS 00000000 0000d4 000004 00 WA 0 0 4
[ 6] .rel.ctors REL 00000000 0007a4 000008 08 13 5 4
[ 7] .rodata PROGBITS 00000000 0000d8 000006 00 A 0 0 1
[ 8] .eh_frame PROGBITS 00000000 0000e0 00008c 00 A 0 0 4
[ 9] .rel.eh_frame REL 00000000 0007ac 000028 08 13 8 4
[10] .comment PROGBITS 00000000 00016c 00002e 00 0 0 1
[11] .note.GNU-stack PROGBITS 00000000 00019a 000000 00 0 0 1
[12] .shstrtab STRTAB 00000000 00019a 00006a 00 0 0 1
[13] .symtab SYMTAB 00000000 00045c 000180 10 14 14 4
[14] .strtab STRTAB 00000000 0005dc 000166 00 0 0 1
Key to Flags:
W (write), A (alloc), X (execute), M (merge), S (strings)
I (info), L (link order), G (group), x (unknown)
O (extra OS processing required) o (OS specific), p (processor specific)
```
**查看一个动态库文件的elf文件的节信息**
```
[root@localhost test]$ readelf -S libmy.so
There are 27 section headers, starting at offset 0xad0:
Section Headers:
[Nr] Name Type Addr Off Size ES Flg Lk Inf Al
[ 0] NULL 00000000 000000 000000 00 0 0 0
[ 1] .gnu.hash GNU_HASH 000000d4 0000d4 00003c 04 A 2 0 4
[ 2] .dynsym DYNSYM 00000110 000110 000120 10 A 3 1 4
[ 3] .dynstr STRTAB 00000230 000230 000199 00 A 0 0 1
[ 4] .gnu.version VERSYM 000003ca 0003ca 000024 02 A 2 0 2
[ 5] .gnu.version_r VERNEED 000003f0 0003f0 000050 00 A 3 2 4
[ 6] .rel.dyn REL 00000440 000440 0000b0 08 A 2 0 4
[ 7] .rel.plt REL 000004f0 0004f0 000010 08 A 2 9 4
[ 8] .init PROGBITS 00000500 000500 000017 00 AX 0 0 4
[ 9] .plt PROGBITS 00000518 000518 000030 04 AX 0 0 4
[10] .text PROGBITS 00000550 000550 0001c4 00 AX 0 0 16
[11] .fini PROGBITS 00000714 000714 00001c 00 AX 0 0 4
[12] .rodata PROGBITS 00000730 000730 000006 00 A 0 0 1
[13] .eh_frame_hdr PROGBITS 00000738 000738 00002c 00 A 0 0 4
[14] .eh_frame PROGBITS 00000764 000764 000090 00 A 0 0 4
[15] .ctors PROGBITS 000017f4 0007f4 00000c 00 WA 0 0 4
[16] .dtors PROGBITS 00001800 000800 000008 00 WA 0 0 4
[17] .jcr PROGBITS 00001808 000808 000004 00 WA 0 0 4
[18] .data.rel.ro PROGBITS 0000180c 00080c 000004 00 WA 0 0 4
[19] .dynamic DYNAMIC 00001810 000810 0000e0 08 WA 3 0 4
[20] .got PROGBITS 000018f0 0008f0 00000c 04 WA 0 0 4
[21] .got.plt PROGBITS 000018fc 0008fc 000014 04 WA 0 0 4
[22] .bss NOBITS 00001910 000910 00000c 00 WA 0 0 4
[23] .comment PROGBITS 00000000 000910 0000e6 00 0 0 1
[24] .shstrtab STRTAB 00000000 0009f6 0000da 00 0 0 1
[25] .symtab SYMTAB 00000000 000f08 000410 10 26 48 4
[26] .strtab STRTAB 00000000 001318 000333 00 0 0 1
Key to Flags:
W (write), A (alloc), X (execute), M (merge), S (strings)
I (info), L (link order), G (group), x (unknown)
O (extra OS processing required) o (OS specific), p (processor specific)
```

@ -1,4 +1,4 @@
rpm
# **rpm**
===
RPM软件包的管理工具
@ -7,72 +7,125 @@ 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软件包。
### 实例
**如何安装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`可以忽略所有依赖关系和文件问题,什么包都能安装上,但这种强制安装的软件包不能保证完全发挥功能。
**如何安装.src.rpm软件包**
有些软件包是以.src.rpm结尾的这类软件包是包含了源代码的rpm包在安装时需要进行编译。这类软件包有两种安装方法
方法一:
```
## 选项
```markdown
用法: rpm [选项...]
查询/验证软件包选项:
-a, --all 查询/验证所有软件包
-f, --file 查询/验证文件属于的软件包
-g, --group 查询/验证组中的软件包
-p, --package 查询/验证一个软件包
--pkgid query/verify package(s) with package identifier
--hdrid query/verify package(s) with header identifier
--triggeredby query the package(s) triggered by the package
--whatrequires query/verify the package(s) which require a dependency
--whatprovides 查询/验证提供相关依赖的软件包
--nomanifest 不把非软件包文件作为清单处理
查询选项(用 -q 或 --query
-c, --configfiles 列出所有配置文件
-d, --docfiles 列出所有程序文档
-L, --licensefiles list all license files
--dump 转储基本文件信息
-l, --list 列出软件包中的文件
--queryformat=QUERYFORMAT 使用这种格式打印信息
-s, --state 显示列出文件的状态
验证选项(用 -V 或 --verify
--nofiledigest 不验证文件摘要
--nofiles 不验证软件包中文件
--nodeps 不验证包依赖
--noscript 不执行验证脚本
安装/升级/擦除选项:
--allfiles 安装全部文件,包含配置文件,否则配置文件会被跳过。
--allmatches 移除所有符合 <package> 的软件包(如果 <package> 被指定未多个软件包,常常会导致错误出现)
--badreloc 对不可重定位的软件包重新分配文件位置
-e, --erase=<package>+ 清除 (卸载) 软件包
--excludedocs 不安装程序文档
--excludepath=<path> 略过以 <path> 开头的文件
--force --replacepkgs --replacefiles 的缩写
-F, --freshen=<packagefile>+ 如果软件包已经安装,升级软件包
-h, --hash 软件包安装的时候列出哈希标记 (和 -v 一起使用效果更好)
--ignorearch 不验证软件包架构
--ignoreos 不验证软件包操作系统
--ignoresize 在安装前不检查磁盘空间
-i, --install 安装软件包
--justdb 更新数据库,但不修改文件系统
--nodeps 不验证软件包依赖
--nofiledigest 不验证文件摘要
--nocontexts 不安装文件的安全上下文
--noorder 不对软件包安装重新排序以满足依赖关系
--noscripts 不执行软件包脚本
--notriggers 不执行本软件包触发的任何脚本
--nocollections 请不要执行任何动作集
--oldpackage 更新到软件包的旧版本(带 --force 自动完成这一功能)
--percent 安装软件包时打印百分比
--prefix=<dir> 如果可重定位,便把软件包重定位到 <dir>
--relocate=<old>=<new> 将文件从 <old> 重定位到 <new>
--replacefiles 忽略软件包之间的冲突的文件
--replacepkgs 如果软件包已经有了,重新安装软件包
--test 不真正安装,只是判断下是否能安装
-U, --upgrade=<packagefile>+ 升级软件包
--reinstall=<packagefile>+ reinstall package(s)
所有 rpm 模式和可执行文件的通用选项:
-D, --define=“MACRO EXPR” 定义值为 EXPR 的 MACRO
--undefine=MACRO undefine MACRO
-E, --eval=“EXPR” 打印 EXPR 的宏展开
--macros=<FILE:> 从文件 <FILE:...> 读取宏,不使用默认文件
--noplugins don't enable any plugins
--nodigest 不校验软件包的摘要
--nosignature 不验证软件包签名
--rcfile=<FILE:> 从文件 <FILE:...> 读取宏,不使用默认文件
-r, --root=ROOT 使用 ROOT 作为顶级目录 (default: "/")
--dbpath=DIRECTORY 使用 DIRECTORY 目录中的数据库
--querytags 显示已知的查询标签
--showrc 显示最终的 rpmrc 和宏配置
--quiet 提供更少的详细信息输出
-v, --verbose 提供更多的详细信息输出
--version 打印使用的 rpm 版本号
Options implemented via popt alias/exec:
--scripts list install/erase scriptlets from package(s)
--setperms set permissions of files in a package
--setugids set user/group ownership of files in a package
--conflicts list capabilities this package conflicts with
--obsoletes list other packages removed by installing this package
--provides list capabilities that this package provides
--requires list capabilities required by package(s)
--info list descriptive information from package(s)
--changelog list change logs for this package
--xml list metadata in xml
--triggers list trigger scriptlets from package(s)
--last list package(s) by install time, most recent first
--dupes list duplicated packages
--filesbypkg list all files from each package
--fileclass list file names with classes
--filecolor list file names with colors
--fscontext list file names with security context from file system
--fileprovide list file names with provides
--filerequire list file names with requires
--filecaps list file names with POSIX1.e capabilities
```
## 实例
```bash
rpm -qa # 列出所有安装过的包
rpm -q mysql # 获取mysql软件包全名
rpm -qa --qf '%10{SIZE}\t%{NAME}\n' | sort -k1,1n # 显示所有在rpm发布版上安装的包并以包字节大小为序
rpm -ivh your-package.rpm # 安装rpm包
rpm -ivh --force your-package.rpm # 强制安装rpm包
rpm -ivh --nodeps your-package.rpm # 忽略依赖安装rpm包
rpm -e 包名 # 卸载软件包,包名可以包含版本号等信息,但是不可以有后缀.rpm
# 有些软件包是以.src.rpm结尾的这类软件包是包含了源代码的rpm包在安装时需要进行编译。这类软件包有两种安装方法
# 方法一:
rpm -i your-package.src.rpm
cd /usr/src/redhat/SPECS
rpmbuild -bp your-package.specs #一个和你的软件包同名的specs文件
@ -80,134 +133,36 @@ 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`即可安装完成。
**如何卸载rpm软件包**
使用命令`rpm -e`包名,包名可以包含版本号等信息,但是不可以有后缀.rpm比如卸载软件包proftpd-1.2.8-1可以使用下列格式
# /usr/src/redhat/RPM/i386/`根据具体包的不同也可能是i686,noarch等等目录下执行安装命令
rpm -i new-package.rpm
```
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强制卸载
**如何不安装但是获取rpm包中的文件**
使用工具rpm2cpio和cpio
```
# 使用工具rpm2cpio和cpio
rpm2cpio xxx.rpm | cpio -vi
rpm2cpio xxx.rpm | cpio -idmv
rpm2cpio xxx.rpm | cpio --extract --make-directories
```
参数i和extract相同表示提取文件。v表示指示执行进程d和make-directory相同表示根据包中文件原来的路径建立目录m表示保持文件的更新时间。
**如何查看与rpm包相关的文件和其他信息**
下面所有的例子都假设使用软件包mysql-3.23.54a-11
1、我的系统中安装了那些rpm软件包。
```
rpm -qa 讲列出所有安装过的包
```
如果要查找所有安装过的包含某个字符串sql的软件包
```
rpm -qa | grep sql
```
2、如何获得某个软件包的文件全名。
```
rpm -q mysql
```
可以获得系统中安装的mysql软件包全名从中可以获得当前软件包的版本等信息。这个例子中可以得到信息mysql-3.23.54a-11
3、一个rpm包中的文件安装到那里去了
```
rpm -ql 包名
```
注意这里的是不包括.rpm后缀的软件包的名称也就是说只能用mysql或者mysql-3.23.54a-11而不是mysql-3.23.54a-11.rpm。如果只是想知道可执行程序放到那里去了也可以用which比如
```
which mysql
```
4、一个rpm包中包含那些文件。
# 一个rpm包中包含那些文件
rpm -qlp **** .rpm # 没有安装过的软件包
rpm -ql **** .rpm # 已经安装过的软件包,还可以使用``
* 一个没有安装过的软件包,使用`rpm -qlp **** .rpm`
* 一个已经安装过的软件包,还可以使用`rpm -ql **** .rpm`
# 获取关于一个软件包的版本,用途等相关信息
rpm -qip **** .rpm # 没有安装过的软件包
rpm -qi **** .rpm # 已经安装过的软件包
5、如何获取关于一个软件包的版本用途等相关信息
* 一个没有安装过的软件包,使用`rpm -qip **** .rpm`
* 一个已经安装过的软件包,还可以使用`rpm -qi **** .rpm`
6、某个程序是哪个软件包安装的或者哪个软件包包含这个程序。
```
rpm -qf `which 程序名` #返回软件包的全名
rpm -qif `which 程序名` #返回软件包的有关信息
rpm -qlf `which 程序名` #返回软件包的文件列表
```
注意,这里不是引号,而是`,就是键盘左上角的那个键。也可以使用`rpm -qilf`,同时输出软件包信息和文件列表。
7、某个文件是哪个软件包安装的或者哪个软件包包含这个文件。
注意前一个问题中的方法只适用与可执行的程序而下面的方法不仅可以用于可执行程序也可以用于普通的任何文件。前提是知道这个文件名。首先获得这个程序的完整路径可以用whereis或者which然后使用`rpm -qf`例如:
```
whereis ftptop
ftptop: /usr/bin/ftptop /usr/share/man/man1/ftptop.1.gz
# 查看某个程序是哪个软件包安装的,或者哪个软件包包含这个程序,此方法只适用于可执行程序
rpm -qf `which nginx` # 返回软件包nginx的全名
rpm -qif `which nginx` # 返回软件包nginx的有关信息
rpm -qlf `which nginx` # 返回软件包nginx的文件列表
rpm -qilf `which nginx` # 同时输出软件包nginx信息和文件列表
# 查看某个文件是哪个软件包安装的,或者哪个软件包包含这个文件,此方法适用于可执行程序和任何普通文件
rpm -qf /usr/bin/ftptop
proftpd-1.2.8-1
rpm -qf /var/log/dmesg
rpm -qf /usr/share/doc/proftpd-1.2.8/rfc/rfc0959.txt
proftpd-1.2.8-1
```

@ -31,41 +31,8 @@ scp [-12346BCpqrv] [-c cipher] [-F ssh_config] [-i identity_file]
## 实例
从远程复制到本地的scp命令与上面的命令雷同只要将从本地复制到远程的命令后面2个参数互换顺序就行了。
**从远处复制文件到本地目录**
```
scp root@10.10.10.10:/opt/soft/nginx-0.5.38.tar.gz /opt/soft/
```
从10.10.10.10机器上的`/opt/soft/`的目录中下载nginx-0.5.38.tar.gz 文件到本地`/opt/soft/`目录中。
**从远处复制到本地**
```
scp -r root@10.10.10.10:/opt/soft/mongodb /opt/soft/
```
从10.10.10.10机器上的`/opt/soft/`中下载mongodb目录到本地的`/opt/soft/`目录来。
**上传本地文件到远程机器指定目录**
```bash
scp /opt/soft/nginx-0.5.38.tar.gz root@10.10.10.10:/opt/soft/scptest
# 添加断开 2222
scp -rp -P 2222 /opt/soft/nginx-0.5.38.tar.gz root@10.10.10.10:/opt/soft/scptest
```
复制本地`/opt/soft/`目录下的文件nginx-0.5.38.tar.gz到远程机器10.10.10.10的`opt/soft/scptest`目录。
**上传本地目录到远程机器指定目录**
scp -r root@10.10.10.10:/opt/soft/mongodb /opt/soft/ # 从远端复制到本地
scp /opt/soft/file root@10.10.10.10:/opt/soft/scptest # 上传本地文件到远程机器指定目录
```
scp -r /opt/soft/mongodb root@10.10.10.10:/opt/soft/scptest
```
上传本地目录`/opt/soft/mongodb`到远程机器10.10.10.10上`/opt/soft/scptest`的目录中去。

@ -1,31 +1,31 @@
screen
===
用于命令行终端切换
# screen
## 说明
**Screen** 是一款由GNU计划开发的用于命令行终端切换的自由软件。用户可以通过该软件同时连接多个本地或远程的命令行会话并在其间自由切换。GNU Screen可以看作是窗口管理器的命令行界面版本。它提供了统一的管理多个会话的界面和相应的功能。
**Screen** 是一款由GNU计划开发的用于命令行终端切换的自由软件。用户可以通过该软件同时连接多个本地或远程的命令行会话
并在其间自由切换。GNU Screen可以看作是窗口管理器的命令行界面版本。它提供了统一的管理多个会话的界面和相应的功能
**会话恢复**
只要Screen本身没有终止在其内部运行的会话都可以恢复。这一点对于远程登录的用户特别有用——即使网络连接中断用户也不会失去对已经打开的命令行会话的控制。只要再次登录到主机上执行screen -r就可以恢复会话的运行。同样在暂时离开的时候也可以执行分离命令detach在保证里面的程序正常运行的情况下让Screen挂起切换到后台。这一点和图形界面下的VNC很相似。
只要Screen本身没有终止在其内部运行的会话都可以恢复。这一点对于远程登录的用户特别有用——即使网络连接中断用户也不
会失去对已经打开的命令行会话的控制。只要再次登录到主机上执行screen -r就可以恢复会话的运行。同样在暂时离开的时候也可
以执行分离命令detach在保证里面的程序正常运行的情况下让Screen挂起切换到后台。这一点和图形界面下的VNC很相似
**多窗口**
在Screen环境下所有的会话都独立的运行并拥有各自的编号、输入、输出和窗口缓存。用户可以通过快捷键在不同的窗口下切换并可以自由的重定向各个窗口的输入和输出。Screen实现了基本的文本操作如复制粘贴等还提供了类似滚动条的功能可以查看窗口状况的历史记录。窗口还可以被分区和命名还可以监视后台窗口的活动。 会话共享 Screen可以让一个或多个用户从不同终端多次登录一个会话并共享会话的所有特性比如可以看到完全相同的输出。它同时提供了窗口访问权限的机制可以对窗口进行密码保护。
在Screen环境下所有的会话都独立的运行并拥有各自的编号、输入、输出和窗口缓存。用户可以通过快捷键在不同的窗口下切换
并可以自由的重定向各个窗口的输入和输出。Screen实现了基本的文本操作如复制粘贴等还提供了类似滚动条的功能可以查看
窗口状况的历史记录。窗口还可以被分区和命名,还可以监视后台窗口的活动。 会话共享 Screen可以让一个或多个用户从不同终端
多次登录一个会话,并共享会话的所有特性(比如可以看到完全相同的输出)。它同时提供了窗口访问权限的机制,可以对窗口进行
密码保护
GNU's Screen 官方站点http://www.gnu.org/software/screen/
### 语法
```
# screen -AmRvx -[ls -wipe][-d <作业名称>][-h <行数>][-r <作业名称>][-s ][-S <作业名称>]
```
## 选项
```markdown
screen -AmRvx -[ls -wipe][-d <作业名称>][-h <行数>][-r <作业名称>][-s ][-S <作业名称>]
```
-A  将所有的视窗都调整为目前终端机的大小。
-d <作业名称>  将指定的screen作业离线。
-h <行数>  指定视窗的缓冲区行数。
@ -40,19 +40,20 @@ GNU's Screen 官方站点http://www.gnu.org/software/screen/
-wipe  检查目前所有的screen作业并删除已经无法使用的screen作业。
```
### 常用screen参数
## 实例
```
screen -S yourname -> 新建一个叫yourname的session
screen -ls -> 列出当前所有的session
screen -r yourname -> 回到yourname这个session
screen -d yourname -> 远程detach某个session
screen -d -r yourname -> 结束当前session并回到yourname这个session
```bash
# 常用screen参数
screen -S yourname # 新建一个叫yourname的session
screen -ls # 列出当前所有的session
screen -r yourname # 回到yourname这个session
screen -d yourname # 远程detach某个session
screen -d -r yourname # 结束当前session并回到yourname这个session
```
在每个screen session 下,所有命令都以 ctrl+a(C-a) 开始。
```markdown
# 在每个screen session 下,所有命令都以 ctrl+a(C-a) 开始
```
C-a ? -> 显示所有键绑定信息
C-a c -> 创建一个新的运行shell的窗口并切换到该窗口
C-a n -> Next切换到下一个 window
@ -61,7 +62,9 @@ C-a 0..9 -> 切换到第 0..9 个 window
Ctrl+a [Space] -> 由视窗0循序切换到视窗9
C-a C-a -> 在两个最近使用的 window 间切换
C-a x -> 锁住当前的 window需用用户密码解锁
C-a d -> detach暂时离开当前session将目前的 screen session (可能含有多个 windows) 丢到后台执行,并会回到还没进 screen 时的状态,此时在 screen session 里,每个 window 内运行的 process (无论是前台/后台)都在继续执行,即使 logout 也不影响。
C-a d -> detach暂时离开当前session将目前的 screen session (可能含有多个 windows) 丢到后台执行,并会回到还没进
screen 时的状态,此时在 screen session 里,每个 window 内运行的 process (无论是前台/后台)都在继续执行,
即使 logout 也不影响
C-a z -> 把当前session放到后台执行用 shell 的 fg 命令则可回去。
C-a w -> 显示所有窗口列表
C-a t -> time显示当前时间和系统的 load
@ -80,24 +83,14 @@ C-a -> 进入 copy mode在 copy mode 下可以回滚、搜索、复制就像
C-a ] -> paste把刚刚在 copy mode 选定的内容贴上
```
### 使用 screen
**安装screen**
流行的Linux发行版例如Red Hat Enterprise Linux通常会自带screen实用程序如果没有的话可以从GNU screen的官方网站下载。
## 使用screen
```
[root@TS-DEV ~]# yum install screen
[root@TS-DEV ~]# rpm -qa|grep screen
screen-4.0.3-4.el5
[root@TS-DEV ~]#
```
```bash
**创建一个新的窗口**
安装完成后直接敲命令screen就可以启动它。但是这样启动的screen会话没有名字实践上推荐为每个screen会话取一个名字方便分辨
```
[root@TS-DEV ~]# screen -S david
```

@ -93,308 +93,194 @@ x\{m,n\} 重复字符x至少m次不多于n次/0\{5,10\}/匹配5
## 实例
```bash
sed -n 's/.*<title\>\.*\<\/title>.*/\1/ip;T;q' file # 输出HTML文件的<title></title>字段中的 内容
sed -n 's/test/TEST/p' file # -n选项和p命令一起使用表示只打印那些发生替换的行
sed -i 's/book/books/g' file # 直接编辑文件选项-i会匹配file文件中每一行book,g匹配全部替换为books
echo sksksksksksk | sed 's/sk/SK/2g' # 从第2个匹配项开始替换当需要从第N处匹配开始替换时可以使用/Ng
sed 's/book/books/' file # 替换操作s命令;替换文本中的字符串
# 字符/在sed中作为定界符使用也可以使用任意的定界符
sed 's:test:TEXT:g' # 将test替换成TEXT此处定界符为:
sed 's|test|TEXT|g' # 将test替换成TEXT此处定界符为|
sed 's/\/bin/\/usr\/local\/bin/g' # 定界符出现在样式内部时,需要进行转义
sed '/^$/d' file # 删除操作d命令删除空白行
ifconfig eth0 | grep "inet addr" | awk -F: '{print $2,$4}'| > awk '{print $1,$3}' # 只显示IP地址和子网掩码
sed '2d' file # 删除文件的第2行
sed '2,$d' file # 删除文件的第2行到末尾所有行
sed '$d' file # 删除文件最后一行
sed '/^test/'d file # 删除文件中所有开头是test的行
echo this is a test line | sed 's/\w\+/[&]/g' # 已匹配字符串标记&;正则表达式\w\+匹配每一个单词,使用[&]替换它,&对应于之前所匹配到的单词,输出:[this] [is] [a] [test] [line]
echo this is digit 7 in a number | sed 's/digit \([0-9]\)/\1/' # 子串匹配标记\1匹配给定样式的其中一部分,输出:this is 7 in a number
sed 's/book/books/' file # 替换操作s命令;替换文本中的字符串
sed 's/^192.168.0.1/&localhost/' file # 所有以192.168.0.1开头的行都会被替换成它自已加localhost输出192.168.0.1localhost
echo aaa BBB | sed 's/\([a-z]\+\) \([A-Z]\+\)/\2 \1/' # 输出BBB aaa
sed -i 's/book/books/g' file # 直接编辑文件选项-i会匹配file文件中每一行book,g匹配全部替换为books
sed -n 's/.*<title\>\.*\<\/title>.*/\1/ip;T;q' file # 输出HTML文件的<title></title>字段中的 内容
sed -n 's/test/TEST/p' file # -n选项和p命令一起使用表示只打印那些发生替换的行
sed -n 's/\(love\)able/\1rs/p' file # love被标记为1所有loveable会被替换成lovers并打印出来
sed '/test/r file' filename # r命令从文件读取读取file内容并显示在与test匹配的行后若匹配多行则显示在所有匹配行后
sed -n '/test/w file' example # w命令写入文件在example中所有含有test的行都被写入file中
sed '/^this/i\test line' file # i\命令表示追加到匹配行的行上面将test line追加到以this开头的行的行上面
sed '/^this/a\test line' file # a\命令表示追加到匹配行的行下面将test line追加到以this开头的行下面
sed -i '2a\test line' file # 在file文件的第二行插入test line
sed -i '5i\test line' file # 在file文件第5行插入test line
sed '/test/{ n; s/aa/bb/; }' file # 若匹配到test则移动到匹配行的下一行替换这行的aa为bb并打印接着继续执行
sed '1,10y/abcde/ABCDE/' file # y变形命令将1至10行所有abcde转为大写但正则表达式元字符不能使用该命令
sed '10q' file # q退出命令打印完第10行后退出sed命令
# 已匹配字符串标记&;正则表达式\w\+匹配每一个单词,使用[&]替换它,&对应于之前所匹配到的单词,输出:[this] [is] [a] [test] [line]
echo this is a test line | sed 's/\w\+/[&]/g'
# 子串匹配标记\1匹配给定样式的其中一部分,输出:this is 7 in a number
echo this is digit 7 in a number | sed 's/digit \([0-9]\)/\1/'
# 组合多个表达式;引用sed表达式可以使用单引号来引用但是如果表达式内部包含变量字符串就需要使用双引号
sed '表达式' | sed '表达式' 等价于sed '表达式;表达式'
echo sksksksksksk | sed 's/sk/SK/2g' # 从第2个匹配项开始替换当需要从第N处匹配开始替换时可以使用/Ng
echo aaa BBB | sed 's/\([a-z]\+\) \([A-Z]\+\)/\2 \1/' # 输出BBB aaa
# 选定行的范围:,(逗号)
sed -n '/test/,/check/p' file # 所有在模板test和check所确定的范围内的行都被打印
sed -n '5,/^test/p' file # 打印从第5行开始到第一个包含以test开始的行之间的所有行
# 字符/在sed中作为定界符使用也可以使用任意的定界符
sed 's:test:TEXT:g' # 将test替换成TEXT此处定界符为:
sed 's|test|TEXT|g' # 将test替换成TEXT此处定界符为|
sed 's/\/bin/\/usr\/local\/bin/g' # 定界符出现在样式内部时,需要进行转义
sed '/test/,/west/s/$/aaa bbb/' file # 对于模板test和west之间的行每行的末尾用字符串aaa bbb替换
# 多点编辑e命令
sed -e '1,5d' -e 's/test/check/' file # -e选项允许在同一行里执行多条命令
# 上面sed表达式的第一条命令删除1至5行第二条命令用check替换test。命令的执行顺序对结果有影响。如果两个命令都是替换命令那么第一个替换命令将影响第二个替换命令的结果。
sed -e '1,5d' -e 's/test/check/' file # -e选项允许在同一行里执行多条命令,此命令第一条删除1至5行第二条check替换test
sed --expression='s/test/check/' --expression='/love/d' file # 和-e 等价的命令是 --expression
# 从文件读入r命令
sed '/test/r file' filename # file里的内容被读进来显示在与test匹配的行后面如果匹配多行则file的内容将显示在所有匹配行的下面
```
### 写入文件w命令
在example中所有包含test的行都被写入file里
```sh
sed -n '/test/w file' example
```
### 追加行下a\命令
将 this is a test line 追加到 以test 开头的行后面:
```sh
sed '/^test/a\this is a test line' file
```
在 test.conf 文件第2行之后插入 this is a test line
```sh
sed -i '2a\this is a test line' test.conf
```
### 插入行上i\命令
将 this is a test line 追加到以test开头的行前面
```sh
sed '/^test/i\this is a test line' file
```
在test.conf文件第5行之前插入this is a test line
```sh
sed -i '5i\this is a test line' test.conf
```
### 下一个n命令
如果test被匹配则移动到匹配行的下一行替换这一行的aa变为bb并打印该行然后继续
```sh
sed '/test/{ n; s/aa/bb/; }' file
```
### 变形y命令
把1~10行内所有abcde转变为大写注意正则表达式元字符不能使用这个命令
```sh
sed '1,10y/abcde/ABCDE/' file
```
### 退出q命令
打印完第10行后退出sed
```sh
sed '10q' file
```
### 保持和获取h命令和G命令
在sed处理文件的时候每一行都被保存在一个叫模式空间的临时缓冲区中除非行被删除或者输出被取消否则所有被处理的行都将 打印在屏幕上。接着模式空间被清空,并存入新的一行等待处理。
```sh
sed -e '/test/h' -e '$G' file
```
在这个例子里匹配test的行被找到后将存入模式空间h命令将其复制并存入一个称为保持缓存区的特殊缓冲区内。第二条语句的意思是当到达最后一行后G命令取出保持缓冲区的行然后把它放回模式空间中且追加到现在已经存在于模式空间中的行的末尾。在这个例子中就是追加到最后一行。简单来说任何包含test的行都被复制并追加到该文件的末尾。
### 保持和互换h命令和x命令
: << comment
保持和获取h命令和G命令
在sed处理文件的时候每一行都被保存在一个叫模式空间的临时缓冲区中除非行被删除或者输出被取消否则所有被处理的行都将 打
印在屏幕上。接着模式空间被清空,并存入新的一行等待处理
互换模式空间和保持缓冲区的内容。也就是把包含test与check的行互换
此例子里匹配test的行被找到后将存入模式空间h命令将其复制并存入一个称为保持缓存区的特殊缓冲区内。第二条语句的意思是
当到达最后一行后G命令取出保持缓冲区的行然后把它放回模式空间中且追加到现在已经存在于模式空间中的行的末尾。此例中就
是追加到最后一行。简单来说任何包含test的行都被复制并追加到该文件的末尾
comment
```sh
sed -e '/test/h' -e '/check/x' file
```
### 脚本scriptfile
sed脚本是一个sed的命令清单启动Sed时以-f选项引导脚本文件名。Sed对于脚本中输入的命令非常挑剔在命令的末尾不能有任何空白或文本如果在一行中有多个命令要用分号分隔。以#开头的行为注释行,且不能跨行。
: << comment
保持和互换h命令和x命令
互换模式空间和保持缓冲区的内容。此例也就是把包含test与check的行互换
comment
```sh
: << comment
# 脚本scriptfile
sed [options] -f scriptfile file(s)
```
### 打印奇数行或偶数行
方法1
sed脚本是一个sed的命令清单启动Sed时以-f选项引导脚本文件名。Sed对于脚本中输入的命令非常挑剔在命令的末尾不能有任何空白
或文本,如果在一行中有多个命令,要用分号分隔。以#开头的行为注释行,且不能跨行
comment
```sh
# 打印奇数行或偶数行
# 方法1
sed -n 'p;n' test.txt #奇数行
sed -n 'n;p' test.txt #偶数行
```
方法2
```sh
# 方法2
sed -n '1~2p' test.txt #奇数行
sed -n '2~2p' test.txt #偶数行
```
### 打印匹配字符串的下一行
```sh
# 打印匹配字符串的下一行
grep -A 1 SCC URFILE
sed -n '/SCC/{n;p}' URFILE
awk '/SCC/{getline; print}' URFILE
```
## sed one line
### sed one line
```sh
# 文本间隔
#### 文本间隔
sed G # 在每一行后面增加一空行
```bash
sed G # 在每行后增加一空行
sed '/^$/d' file # 删除操作d命令删除空白行
sed '/^ *#/d; /^ *$/d' # 删除空白行和注释
sed '/^$/d;G' # 将原来的所有空行删除并在每一行后面增加一空行,这样在输出的文本中每一行后面将有且只有一空行
sed 'G;G' # 在每一行后面增加两行空行
将第一个脚本所产生的所有空行删除(即删除所有偶数行)
sed 'n;d'
在匹配式样“regex”的行之前插入一空行
sed '/regex/{x;p;x;}'
在匹配式样“regex”的行之后插入一空行
sed '/regex/G'
在匹配式样“regex”的行之前和之后各插入一空行
sed '/regex/{x;p;x;G;}'
sed 'n;d' # 将第一个脚本所产生的所有空行删除(即删除所有偶数行)
sed '/regex/{x;p;x;}' # 在匹配式样“regex”的行之前插入一空行
sed '/regex/G' # 在匹配式样“regex”的行之后插入一空行
sed '/regex/{x;p;x;G;}' # 在匹配式样“regex”的行之前和之后各插入一空行
```
### 编号
```sh
#### 编号
为文件中的每一行进行编号简单的左对齐方式。这里使用了“制表符”tab见本文末尾关于'\t'的用法的描述)而不是空格来对齐边缘。
sed = filename | sed 'N;s/\n/\t/'
对文件中的所有行编号(行号在左,文字右端对齐)。
sed = filename | sed 'N; s/^/ /; s/ *\(.\{6,\}\)\n/\1 /'
对文件中的所有行编号,但只显示非空白行的行号。
sed '/./=' filename | sed '/./N; s/\n/ /'
计算行数 (模拟 "wc -l"
sed -n '$='
```bash
sed = filename | sed 'N;s/\n/\t/' # 对每行进行编号简单的左对齐方式使用制表符tab而不是空格来对齐边缘
sed = filename | sed 'N; s/^/ /; s/ *\(.\{6,\}\)\n/\1 /' # 对文件中的所有行编号(行号在左,文字右端对齐)
sed '/./=' filename | sed '/./N; s/\n/ /' # 对文件中的所有行编号,但只显示非空白行的行号
sed -n '$=' # 计算行数 (模拟 "wc -l"
```
### 文本转换和替换
```sh
#### 文本转换和替换
Unix环境转换DOS的新行符CR/LF为Unix格式。
```bash
# Unix环境转换DOS的新行符CR/LF为Unix格式
sed 's/.$//' # 假设所有行以CR/LF结束
sed 's/^M$//' # 在bash/tcsh中将按Ctrl-M改为按Ctrl-V
sed 's/\x0D$//' # ssed、gsed 3.02.80,及更高版本
Unix环境转换Unix的新行符LF为DOS格式。
sed 's/^[ \t]*//' # 将每一行前面的空白字符(空格,制表符)删除使其左对齐
sed 's/[ \t]*$//' # 将每一行尾部的空白字符(空格,制表符)删除
sed 's/^[ \t]*//;s/[ \t]*$//' # 将每一行中的前导和拖尾的空白字符删除
sed -e :a -e 's/^.\{1,78\}$/ &/;ta' # 78个字符外加最后的一个空格,以79个字符为宽度将所有文本右对齐
sed '/\n/!G;s/\(.\)\(.*\n\)/&\2\1/;//D;s/.//' # 将行中的字符逆序排列第一个字成为最后一字……模拟“rev”
sed '$!N;s/\n/ /' # 将每两行连接成一行类似“paste”
sed -e :a -e '/\\$/N; s/\\\n//; ta' # 如果当前行以反斜杠“\”结束,则将下一行并到当前行末尾并去掉原来行尾的反斜杠
sed -e :a -e '$!N;s/\n=/ /;ta' -e 'P;D' # 如果当前行以等号开头,将当前行并到上一行末尾并以单个空格代替原来行头的“=”
sed ':a; /\\$/N; s/\\\n//; ta' # 连接结尾有\符号的行和其下一行
sed '/baz/s/foo/bar/g' # 只在行中出现字串“baz”的情况下将“foo”替换成“bar”
sed '/baz/!s/foo/bar/g' # 将“foo”替换成“bar”并且只在行中未出现字串“baz”的情况下替换
gsed -r ':a;s/(^|[^0-9.])([0-9]+)([0-9]{3})/\1\2,\3/g;ta' # 为带有小数点和负号的数值增加逗号分隔符GNU sed
sed 's/\[\\`\\"$\\\\]\/\\\1/g' # 在所有转义字符之前添加\符号
# Unix环境转换Unix的新行符LF为DOS格式
sed "s/$/`echo -e \\\r`/" # 在ksh下所使用的命令
sed 's/$'"/`echo \\\r`/" # 在bash下所使用的命令
sed "s/$/`echo \\\r`/" # 在zsh下所使用的命令
sed 's/$/\r/' # gsed 3.02.80 及更高版本
DOS环境转换Unix新行符LF为DOS格式。
# DOS环境转换Unix新行符LF为DOS格式
sed "s/$//" # 方法 1
sed -n p # 方法 2
DOS环境转换DOS新行符CR/LF为Unix格式。下面的脚本只对UnxUtils sed 4.0.7 及更高版本有效。要识别UnxUtils版本的sed可以通过其特有的“--text”选项。你可以使用帮助选项“--help”看其中有无一个“--text”项以此来判断所使用的是否是UnxUtils版本其它DOS版本的的sed则无法进行这一转换。但可以用“tr”来实现这一转换。
# DOS环境转换DOS新行符CR/LF为Unix格式。要识别UnxUtils版本的sed可以通过其特有的“--text”选项。看其中有无一个
# “--text”项以此来判断所使用的是否是UnxUtils版本,其它DOS版本的的sed则无法进行这一转换。但可以用“tr”来实现这一转换
sed "s/\r//" infile >outfile # UnxUtils sed v4.0.7 或更高版本
tr -d \r <infile >outfile # GNU tr 1.22 或更高版本
将每一行前导的“空白字符”(空格,制表符)删除
使之左对齐
sed 's/^[ \t]*//'
将每一行拖尾的“空白字符”(空格,制表符)删除
sed 's/[ \t]*$//'
将每一行中的前导和拖尾的空白字符删除
sed 's/^[ \t]*//;s/[ \t]*$//'
在每一行开头处插入5个空格使全文向右移动5个字符的位置
sed 's/^/ /'
以79个字符为宽度将所有文本右对齐
sed -e :a -e 's/^.\{1,78\}$/ &/;ta' 78个字符外加最后的一个空格
以79个字符为宽度使所有文本居中。在方法1中为了让文本居中每一行的前头和后头都填充了空格。 在方法2中在居中文本的过程中只在文本的前面填充空格并且最终这些空格将有一半会被删除。此外每一行的后头并未填充空格。
# 以79个字符为宽度使所有文本居中。在方法1中为了让文本居中每一行的前头和后头都填充了空格。 在方法2中在居中文本的过
# 程中只在文本的前面填充空格,并且最终这些空格将有一半会被删除。此外每一行的后头并未填充空格
sed -e :a -e 's/^.\{1,77\}$/ & /;ta' # 方法1
sed -e :a -e 's/^.\{1,77\}$/ &/;ta' -e 's/\( *\)\1/\1/' # 方法2
在每一行中查找字串“foo”并将找到的“foo”替换为“bar”
# 在每一行中查找字串“foo”并将找到的“foo”替换为“bar”
sed 's/foo/bar/' # 只替换每一行中的第一个“foo”字串
sed 's/foo/bar/4' # 只替换每一行中的第四个“foo”字串
sed 's/foo/bar/g' # 将每一行中的所有“foo”都换成“bar”
sed 's/\(.*\)foo\(.*foo\)/\1bar\2/' # 替换倒数第二个“foo”
sed 's/\(.*\)foo/\1bar/' # 替换最后一个“foo”
只在行中出现字串“baz”的情况下将“foo”替换成“bar”
sed '/baz/s/foo/bar/g'
将“foo”替换成“bar”并且只在行中未出现字串“baz”的情况下替换
sed '/baz/!s/foo/bar/g'
不管是“scarlet”“ruby”还是“puce”一律换成“red”
# 不管是“scarlet”“ruby”还是“puce”一律换成“red”
sed 's/scarlet/red/g;s/ruby/red/g;s/puce/red/g' # 对多数的sed都有效
gsed 's/scarlet\|ruby\|puce/red/g' # 只对GNU sed有效
倒置所有行第一行成为最后一行依次类推模拟“tac”。由于某些原因使用下面命令时HHsed v1.5会将文件中的空行删除
sed '1!G;h;$!d' 方法1
sed -n '1!G;h;$p' 方法2
将行中的字符逆序排列第一个字成为最后一字……模拟“rev”
sed '/\n/!G;s/\(.\)\(.*\n\)/&\2\1/;//D;s/.//'
将每两行连接成一行类似“paste”
sed '$!N;s/\n/ /'
如果当前行以反斜杠“\”结束,则将下一行并到当前行末尾并去掉原来行尾的反斜杠
sed -e :a -e '/\\$/N; s/\\\n//; ta'
如果当前行以等号开头,将当前行并到上一行末尾并以单个空格代替原来行头的“=”
sed -e :a -e '$!N;s/\n=/ /;ta' -e 'P;D'
# 倒置所有行第一行成为最后一行依次类推模拟“tac”。由于某些原因使用下面命令时HHsed v1.5会将文件中的空行删除
sed '1!G;h;$!d' # 方法1
sed -n '1!G;h;$p' # 方法2
为数字字串增加逗号分隔符号将“1234567”改为“1,234,567”
# 为数字字串增加逗号分隔符号将“1234567”改为“1,234,567”
gsed ':a;s/\B[0-9]\{3\}\>/,&/;ta' # GNU sed
sed -e :a -e 's/\(.*[0-9]\)\([0-9]\{3\}\)/\1,\2/;ta' # 其他sed
为带有小数点和负号的数值增加逗号分隔符GNU sed
gsed -r ':a;s/(^|[^0-9.])([0-9]+)([0-9]{3})/\1\2,\3/g;ta'
在每5行后增加一空白行 在第5101520等行后增加一空白行
# 在每5行后增加一空白行 在第5101520等行后增加一空白行
gsed '0~5G' # 只对GNU sed有效
sed 'n;n;n;n;G;' # 其他sed
```
### 选择性显示特定行
```sh
# 显示文件中的前10行 模拟“head”的行为
sed 10q
# 显示文件中的第一行 模拟“head -1”命令
sed q
# 显示文件中的最后10行 模拟“tail”
sed -e :a -e '$q;N;11,$D;ba'
#### 选择性显示特定行
# 显示文件中的最后2行模拟“tail -2”命令
sed '$!N;$!D'
```bash
sed 10q # 显示文件中的前10行 模拟“head”的行为
sed q # 显示文件中的第一行 模拟“head -1”命令
sed -e :a -e '$q;N;11,$D;ba' # 显示文件中的最后10行 模拟“tail”
sed '$!N;$!D' # 显示文件中的最后2行模拟“tail -2”命令
sed -n '/regexp/{g;1!p;};h' # 查找“regexp”并将匹配行的上一行显示出来但并不显示匹配行
sed -n '/regexp/{n;p;}' # 查找“regexp”并将匹配行的下一行显示出来但并不显示匹配行
sed '/AAA/!d; /BBB/!d; /CCC/!d' # 字串的次序不影响结果,显示包含“AAA”、“BBB”或“CCC”的行任意次序
sed '/AAA.*BBB.*CCC/!d' # 显示包含“AAA”、“BBB”和“CCC”的行固定次序
sed -e '/./{H;$!d;}' -e 'x;/AAA/!d;' # 显示包含“AAA”的段落 (段落间以空行分隔)
sed -e '/./{H;$!d;}' -e 'x;/AAA/!d;/BBB/!d;/CCC/!d' # 显示包含“AAA”“BBB”和“CCC”三个字串的段落 (任意次序)
sed -e '/./{H;$!d;}' -e 'x;/AAA/b' -e '/BBB/b' -e '/CCC/b' -e d # 显示包含AAA、BBB、CCC三者中任一字串的段落任意次序
sed -n '/^.\{65\}/p' # 显示包含65个或以上字符的行
sed -n '/regexp/,$p' # 显示部分文本——从包含正则表达式的行开始到最后一行结束
sed -n '/Iowa/,/Montana/p' # 区分大小写方式,显示两个正则表达式之间的文本(包含)
# 显示文件中的最后一行模拟“tail -1”
sed '$!d' # 方法1
@ -413,47 +299,17 @@ sed '/regexp/!d' # 方法2
sed -n '/regexp/!p' # 方法1与前面的命令相对应
sed '/regexp/d' # 方法2类似的语法
# 查找“regexp”并将匹配行的上一行显示出来但并不显示匹配行
sed -n '/regexp/{g;1!p;};h'
# 查找“regexp”并将匹配行的下一行显示出来但并不显示匹配行
sed -n '/regexp/{n;p;}'
# 显示包含“regexp”的行及其前后行并在第一行之前加上“regexp”所
# 在行的行号 类似“grep -A1 -B1”
# 显示包含“regexp”的行及其前后行并在第一行之前加上“regexp”所在行的行号 类似“grep -A1 -B1”
sed -n -e '/regexp/{=;x;1!p;g;$!N;p;D;}' -e h
# 显示包含“AAA”、“BBB”或“CCC”的行任意次序
sed '/AAA/!d; /BBB/!d; /CCC/!d' # 字串的次序不影响结果
# 显示包含“AAA”、“BBB”和“CCC”的行固定次序
sed '/AAA.*BBB.*CCC/!d'
# 显示包含“AAA”“BBB”或“CCC”的行 模拟“egrep”
sed -e '/AAA/b' -e '/BBB/b' -e '/CCC/b' -e d # 多数sed
gsed '/AAA\|BBB\|CCC/!d' # 对GNU sed有效
# 显示包含“AAA”的段落 (段落间以空行分隔)
# HHsed v1.5 必须在“x;”后加入“G;”接下来的3个脚本都是这样
sed -e '/./{H;$!d;}' -e 'x;/AAA/!d;'
# 显示包含“AAA”“BBB”和“CCC”三个字串的段落 (任意次序)
sed -e '/./{H;$!d;}' -e 'x;/AAA/!d;/BBB/!d;/CCC/!d'
# 显示包含“AAA”、“BBB”、“CCC”三者中任一字串的段落 (任意次序)
sed -e '/./{H;$!d;}' -e 'x;/AAA/b' -e '/BBB/b' -e '/CCC/b' -e d
gsed '/./{H;$!d;};x;/AAA\|BBB\|CCC/b;d' # 只对GNU sed有效
# 显示包含65个或以上字符的行
sed -n '/^.\{65\}/p'
# 显示包含65个以下字符的行
sed -n '/^.\{65\}/!p' # 方法1与上面的脚本相对应
sed '/^.\{65\}/d' # 方法2更简便一点的方法
# 显示部分文本——从包含正则表达式的行开始到最后一行结束
sed -n '/regexp/,$p'
# 显示部分文本——指定行号范围从第8至第12行含8和12行
sed -n '8,12p' # 方法1
sed '8,12!d' # 方法2
@ -467,35 +323,22 @@ sed '52q;d' # 方法3, 处理大文件时更有效率
gsed -n '3~7p' # 只对GNU sed有效
sed -n '3,${p;n;n;n;n;n;n;}' # 其他sed
# 显示两个正则表达式之间的文本(包含)
sed -n '/Iowa/,/Montana/p' # 区分大小写方式
```
### 选择性的删除特定行
```sh
# 显示通篇文档,除了两个正则表达式之间的内容
sed '/Iowa/,/Montana/d'
# 删除文件中相邻的重复行模拟“uniq”
# 只保留重复行中的第一行,其他行删除
sed '$!N; /^\(.*\)\n\1$/!P; D'
# 删除文件中的重复行不管有无相邻。注意hold space所能支持的缓存
# 大小或者使用GNU sed。
sed -n 'G; s/\n/&&/; /^\([ -~]*\n\).*\n\1/d; s/\n//; h; P'
# 删除除重复行外的所有行模拟“uniq -d”
sed '$!N; s/^\(.*\)\n\1$/\1/; t; D'
#### 选择性的删除特定行
# 删除文件中开头的10行
sed '1,10d'
# 删除文件中的最后一行
sed '$d'
# 删除文件中的最后两行
sed 'N;$!P;$!D;$d'
```bash
sed '/Iowa/,/Montana/d' # 显示通篇文档,除了两个正则表达式之间的内容
sed '$!N; /^\(.*\)\n\1$/!P; D' # 删除文件中相邻的重复行模拟“uniq”只保留重复行中的第一行其他行删除
sed -n 'G; s/\n/&&/; /^\([ -~]*\n\).*\n\1/d; s/\n//; h; P' # 删除文件重复行不管有无相邻。注意hold space能支持缓存大小
sed '$!N; s/^\(.*\)\n\1$/\1/; t; D' # 删除除重复行外的所有行模拟“uniq -d”
sed '1,10d' # 删除文件中开头的10行
sed '$d' # 删除文件中的最后一行
sed 'N;$!P;$!D;$d' # 删除文件中的最后两行
sed '/^$/N;/\n$/N;//D' # 只保留多个相邻空行的前两行
sed '/./,$!d' # 删除文件顶部的所有空行
sed '/pattern/d' # 删除含pattern的行。当然pattern可以换成任何有效的正则表达式
sed -n '/^$/{p;h;};/./{x;/./p;}' # 删除每个段落的最后一行
# 删除文件中的最后10行
sed -e :a -e '$d;N;2,10ba' -e 'P;D' # 方法1
@ -505,165 +348,112 @@ sed -n -e :a -e '1,10!{P;N;D;};N;ba' # 方法2
gsed '0~8d' # 只对GNU sed有效
sed 'n;n;n;n;n;n;n;d;' # 其他sed
# 删除匹配式样的行
sed '/pattern/d' # 删除含pattern的行。当然pattern # 可以换成任何有效的正则表达式
# 删除文件中的所有空行与“grep '.' ”效果相同)
sed '/^$/d' # 方法1
sed '/./!d' # 方法2
# 只保留多个相邻空行的第一行。并且删除文件顶部和尾部的空行。
# 模拟“cat -s”
# 只保留多个相邻空行的第一行。并且删除文件顶部和尾部的空行。模拟“cat -s”
sed '/./,/^$/!d' #方法1删除文件顶部的空行允许尾部保留一空行
sed '/^$/N;/\n$/D' #方法2允许顶部保留一空行尾部不留空行
# 只保留多个相邻空行的前两行。
sed '/^$/N;/\n$/N;//D'
# 删除文件顶部的所有空行
sed '/./,$!d'
# 删除文件尾部的所有空行
sed -e :a -e '/^\n*$/{$d;N;ba' -e '}' # 对所有sed有效
sed -e :a -e '/^\n*$/N;/\n$/ba' # 同上,但只对 gsed 3.02.*有效
```
# 删除每个段落的最后一行
sed -n '/^$/{p;h;};/./{x;/./p;}'
#### 特殊应用
```bash
# 移除手册页man page中的nroff标记。在Unix System V或bash shell下使用'echo'命令时可能需要加上 -e 选项
sed "s/.`echo \\\b`//g" # 外层的双括号是必须的Unix环境
sed 's/.^H//g' # 在bash或tcsh中, 按 Ctrl-V 再按 Ctrl-H
sed 's/.\x08//g' # sed 1.5GNU sedssed所使用的十六进制的表示方法
sed '/^$/q' # 删除第一行空行后的所有内容,可用于提取新闻组或 e-mail 的邮件头
sed '1,/^$/d' # 删除第一行空行之前的所有内容,可用于提取新闻组或e-mail的正文部分
sed '/^Subject: */!d; s///;q' # 从邮件头提取“Subject”标题栏字段并移除开头的“Subject:”字样
sed '/^Reply-To:/q; /^From:/h; /./d;g;q' # 从邮件头获得回复地址
sed 's/ *(.*)//; s/>.*//; s/.*[:<] *//' # 获取邮件地址。在上一个脚本所产生的那一行邮件头的基础上进一步的将非电邮地址的部分剃除。(见上一脚本)
sed 's/^/> /' # 在每一行开头加上一个尖括号和空格(引用信息)
sed 's/^> //' # 将每一行开头处的尖括号和空格删除(解除引用)
sed -e :a -e 's/<[^>]*>//g;/</N;//ba' # 移除大部分的HTML标签包括跨行标签
# 将分成多卷的uuencode文件解码。移除文件头信息只保留uuencode编码部分。文件必须以特定顺序传给sed。下面第一种版本的脚本
# 可以直接在命令行下输入;
# 第二种版本则可以放入一个带执行权限的shell脚本中。由Rahul Dhesi的一个脚本修改而来。
sed '/^end/,/^begin/d' file1 file2 ... fileX | uudecode # vers1
sed '/^end/,/^begin/d' "$@" | uudecode # vers2
# 将文件中的段落以字母顺序排序。段落间以一行或多行空行分隔。GNU sed使用字元“\v”来表示垂直制表符这里用它来作为换
# 行符的占位符——当然你也可以用其他未在文件中使用的字符来代替它
sed '/./{H;d;};x;s/\n/={NL}=/g' file | sort | sed '1s/={NL}=//;s/={NL}=/\n/g'
gsed '/./{H;d};x;y/\n/\v/' file | sort | sed '1s/\v//;y/\v/\n/'
# 分别压缩每个.TXT文件压缩后删除原来的文件并将压缩后的.ZIP文件命名为与原来相同的名字只是扩展名不同
# DOS环境“dir /b”显示不带路径的文件名
echo @echo off >zipup.bat
dir /b *.txt | sed "s/^\(.*\)\.TXT/pkzip -mo \1 \1.TXT/" >>zipup.bat
: << comment
使用SEDSed接受一个或多个编辑命令并且每读入一行后就依次应用这些命令。当读入第一行输入后sed对其应用所有的命令然后
将结果输出。接着再读入第二行输入对其应用所有的命令……并重复这个过程。上一个例子中sed由标准输入设备即命令解释器
常是以管道输入的形式获得输入。在命令行给出一个或多个文件名作为参数时这些文件取代标准输入设备成为sed的输入。sed的输出
将被送到标准输出(显示器)。因此:
comment
cat filename | sed '10q' # 使用管道输入
sed '10q' filename # 同样效果,但不使用管道输入
sed '10q' filename > newfile # 将输出转移(重定向)到磁盘上
```
### 特殊应用
#### 其他
```sh
# 移除手册页man page中的nroff标记。在Unix System V或bash shell下使
# 用'echo'命令时可能需要加上 -e 选项。
sed "s/.`echo \\\b`//g" # 外层的双括号是必须的Unix环境
sed 's/.^H//g' # 在bash或tcsh中, 按 Ctrl-V 再按 Ctrl-H
sed 's/.\x08//g' # sed 1.5GNU sedssed所使用的十六进制的表示方法
```bash
# 速度优化当由于某种原因比如输入文件较大、处理器或硬盘较慢等需要提高命令执行速度时可以考虑在替换命令s/.../.../
# 前面加上地址表达式来提高速度。举例来说:
sed 's/foo/bar/g' filename # 标准替换命令
sed '/foo/ s/foo/bar/g' filename # 速度更快
sed '/foo/ s//bar/g' filename # 简写形式
# 提取新闻组或 e-mail 的邮件头
sed '/^$/q' # 删除第一行空行后的所有内容
# 只需显示文件前面的部分或需要删除后面的内容时可以在脚本中使用q命令退出命令。在处理大文件时会节省大量时间。因此
sed -n '45,50p' filename # 显示第45到50行
sed -n '51q;45,50p' filename # 一样,但快得多
# 提取新闻组或 e-mail 的正文部分
sed '1,/^$/d' # 删除第一行空行之前的所有内容
sed -n '1000p;1000q' # 输出第一千行
sed -n '10,20p;20q' # 输出第10-20行
# 从邮件头提取“Subject”标题栏字段并移除开头的“Subject:”字样
sed '/^Subject: */!d; s///;q'
```
# 从邮件头获得回复地址
sed '/^Reply-To:/q; /^From:/h; /./d;g;q'
# 获取邮件地址。在上一个脚本所产生的那一行邮件头的基础上进一步的将非电邮
# 地址的部分剃除。(见上一脚本)
sed 's/ *(.*)//; s/>.*//; s/.*[:<] *//'
# 在每一行开头加上一个尖括号和空格(引用信息)
sed 's/^/> /'
# 将每一行开头处的尖括号和空格删除(解除引用)
sed 's/^> //'
# 移除大部分的HTML标签包括跨行标签
sed -e :a -e 's/<[^>]*>//g;/</N;//ba'
# 将分成多卷的uuencode文件解码。移除文件头信息只保留uuencode编码部分。
# 文件必须以特定顺序传给sed。下面第一种版本的脚本可以直接在命令行下输入
# 第二种版本则可以放入一个带执行权限的shell脚本中。由Rahul Dhesi的一
# 个脚本修改而来。)
sed '/^end/,/^begin/d' file1 file2 ... fileX | uudecode # vers. 1
sed '/^end/,/^begin/d' "$@" | uudecode # vers. 2
# 将文件中的段落以字母顺序排序。段落间以一行或多行空行分隔。GNU sed使用
# 字元“\v”来表示垂直制表符这里用它来作为换行符的占位符——当然你也可以
# 用其他未在文件中使用的字符来代替它。
sed '/./{H;d;};x;s/\n/={NL}=/g' file | sort | sed '1s/={NL}=//;s/={NL}=/\n/g'
gsed '/./{H;d};x;y/\n/\v/' file | sort | sed '1s/\v//;y/\v/\n/'
# 分别压缩每个.TXT文件压缩后删除原来的文件并将压缩后的.ZIP文件
# 命名为与原来相同的名字只是扩展名不同DOS环境“dir /b”
# 显示不带路径的文件名)。
echo @echo off >zipup.bat
dir /b *.txt | sed "s/^\(.*\)\.TXT/pkzip -mo \1 \1.TXT/" >>zipup.bat
使用SEDSed接受一个或多个编辑命令并且每读入一行后就依次应用这些命令。
当读入第一行输入后sed对其应用所有的命令然后将结果输出。接着再读入第二
行输入对其应用所有的命令……并重复这个过程。上一个例子中sed由标准输入设
备(即命令解释器,通常是以管道输入的形式)获得输入。在命令行给出一个或多
个文件名作为参数时这些文件取代标准输入设备成为sed的输入。sed的输出将被
送到标准输出(显示器)。因此:
cat filename | sed '10q' # 使用管道输入
sed '10q' filename # 同样效果,但不使用管道输入
sed '10q' filename > newfile # 将输出转移(重定向)到磁盘上
```
### 其他
```sh
括号语法前面的例子对sed命令基本上都使用单引号'...')而非双引号
"..."这是因为sed通常是在Unix平台上使用。单引号下Unix的shell命令
解释器)不会对美元符($)和后引号(`...`)进行解释和执行。而在双引号下
美元符会被展开为变量或参数的值,后引号中的命令被执行并以输出的结果代替
后引号中的内容。而在“csh”及其衍生的shell中使用感叹号!)时需要在其前
面加上转义用的反斜杠(就像这样:\!)以保证上面所使用的例子能正常运行
包括使用单引号的情况下。DOS版本的Sed则一律使用双引号"...")而不是
引号来圈起命令。
'\t'的用法:为了使本文保持行文简洁,我们在脚本中使用'\t'来表示一个制表
符。但是现在大部分版本的sed还不能识别'\t'的简写方式,因此当在命令行中为
脚本输入制表符时你应该直接按TAB键来输入制表符而不是输入'\t'。下列的工
具软件都支持'\t'做为一个正则表达式的字元来表示制表符awk、perl、HHsed、
sedmod以及GNU sed v3.02.80。
不同版本的SED不同的版本间的sed会有些不同之处可以想象它们之间在语法上
会有差异。具体而言,它们中大部分不支持在编辑命令中间使用标签(:name或分
支命令b,t除非是放在那些的末尾。
速度优化:当由于某种原因(比如输入文件较大、处理器或硬盘较慢等)需要提高
命令执行速度时可以考虑在替换命令“s/.../.../”)前面加上地址表达式来
提高速度。举例来说:
sed 's/foo/bar/g' filename # 标准替换命令
sed '/foo/ s/foo/bar/g' filename # 速度更快
sed '/foo/ s//bar/g' filename # 简写形式
当只需要显示文件的前面的部分或需要删除后面的内容时可以在脚本中使用“q”
命令(退出命令)。在处理大的文件时,这会节省大量时间。因此:
sed -n '45,50p' filename # 显示第45到50行
sed -n '51q;45,50p' filename # 一样,但快得多
```
① 显示password内容将2~5行删除后显示
cat -n /etc/passwd | sed '2,5d'
② 在文件第二行后面加上hello语句。
cat -n /etc/passwd | sed '2a hello'
③ 在文件第二行后面加上两行字,
cat -n /etc/passwd | sed '2a hello? \ zhangfneg ?'
④ 将2~5行的内容替换成“我是好人”
cat -n /etc/passwd | sed '3,37c我是好人'
⑤ 只显示文件5~7行
cat -n /etc/passwd | sed -n '5,7p'
利用此表达方式也可以很轻松的分析日志:
cat /var/log/secure | sed -n '/12:12:50/,/12:13:50/p'
⑥ 只显示IP地址和子网掩码
⑦ ifconfig eth0 | grep "inet addr" | awk -F: '{print $2,$4}'| > awk '{print $1,$3}'
192.168.12.231 255.255.255.0
⑧ 修改文件中第3行中的while为root。
sed -i '3s/root/while/g' zhang.sh
打印出奇数行:
sed -n '1~2p' file
打印出偶数行:
sed -n '2~2p' file
```

@ -18,59 +18,16 @@
## 实例
**-f选项指定格式**
```bash
seq -f"%3g" 9 11 # -f选项指定格式,`%`后面指定数字的位数 默认是`%g``%3g`那么数字位数不足部分是空格
seq 10 | tr '\n' +; echo 0 | bc # 输出1+2+3+4+5+6+7+8+9+10+0
```
#seq -f"%3g" 9 11
9
10
11
```
`%`后面指定数字的位数 默认是`%g``%3g`那么数字位数不足部分是空格。
```
#sed -f"%03g" 9 11
#seq -f"str%03g" 9 11
str009
str010
str011
```
这样的话数字位数不足部分是0`%`前面制定字符串。
**-w选项指定输出数字同宽**
```
seq -w 98 101
098
099
100
101
```
不能和`-f`一起用,输出是同宽的。
**-s选项指定分隔符默认是回车**
# 下面这样的话数字位数不足部分是0`%`前面制定字符串
sed -f"%03g" 9 11
seq -f"str%03g" 9 11
seq -w 98 101 # -w选项指定输出数字同宽不能和`-f`一起用,输出是同宽的
seq -s" " -f"str%03g" 9 11 # -s选项指定分隔符(默认是回车)
seq -s"`echo -e "/t"`" 9 11 # 要指定`/t`做为分隔符号:
seq -s"`echo -e "\n"`" 9 11 # 指定`\n`作为分隔符号会得到错误结果,因为它默认的就是回车作为分隔符
```
seq -s" " -f"str%03g" 9 11
str009 str010 str011
```
要指定`/t`做为分隔符号:
```
seq -s"`echo -e "/t"`" 9 11
```
指定`\n`作为分隔符号:
```
seq -s"`echo -e "\n"`" 9 11
19293949596979899910911
```
得到的是个错误结果,不过一般也没有这个必要,它默认的就是回车作为分隔符。

@ -1,21 +1,12 @@
set
===
显示或设置shell特性及shell变量
# **set**
## 说明
**set命令** 作用主要是显示系统中已经存在的shell变量以及设置shell变量的新变量值。使用set更改shell特性时符号"+"和"-"的作用分别是打开和关闭指定的模式。set命令不能够定义新的shell变量。如果要定义新的变量可以使用declare命令以`变量名=值`的格式进行定义即可。
### 语法
```
set(选项)(参数)
```
## 选项
```
```markdown
-a标示已修改的变量以供输出至环境变量。
-b使被中止的后台程序立刻回报执行状态。
-C转向所产生的文件无法覆盖已存在的文件。
@ -36,11 +27,7 @@ set(选项)(参数)
-x执行指令后会先显示该指令及所下的参数。
```
### 参数
取消某个set曾启动的参数。
### 实例
## 实例
使用declare命令定义一个新的环境变量"mylove",并且将其值设置为"Visual C++",输入如下命令:

@ -1,21 +1,12 @@
smbclient
===
交互方式访问samba服务器
# smbclient
## 说明
**smbclient命令** 属于samba套件它提供一种命令行使用交互式方式访问samba服务器的共享资源。
### 语法
```
smbclient(选项)(参数)
```
**smbclient命令** 属于samba套件它提供一种命令行使用交互式方式访问samba服务器的共享资源
## 选项
```
```markdown
-B<ip>传送广播数据包时所用的IP地址
-d<排错层级>:指定记录文件所记载事件的详细程度;
-E将信息送到标准错误输出设备
@ -37,49 +28,19 @@ smbclient(选项)(参数)
-w<工作群组>:指定工作群组名称。
```
### 参数
smb服务器指定要连接的smb服务器。
### 实例
**列出某个IP地址所提供的共享文件夹**
```
smbclient -L 198.168.0.1 -U username%password
```
**像ftp客户端一样使用smbclient**
```
smbclient //192.168.0.1/tmp -U username%password
```
执行smbclient命令成功后进入smbclient环境出现提示符`smb:/>`
## 实例
这里有许多命令和ftp命令相似如cd 、lcd、get、megt、put、mput等。通过这些命令我们可以访问远程主机的共享资源。
```bash
smbclient -L 198.168.0.1 -U username%password # 列出某个IP地址所提供的共享文件夹
smbclient //192.168.0.1/tmp -U username%password # 像ftp客户端一样使用smbclient,执行成功后进入smbclient环境
**直接一次性使用smbclient命令**
```
smbclient -c "ls" //192.168.0.1/tmp -U username%password
```
: << comment
直接一次性使用smbclient命令
这里有许多命令和ftp命令相似如cd 、lcd、get、megt、put、mput等。通过这些命令可以访问远程主机的共享资源
comment
```
smbclient //192.168.0.1/tmp -U username%password
smb:/>ls
```
功能一样的。
**创建一个共享文件夹**
```
# 创建一个共享文件夹.如果用户共享`//192.168.0.1/tmp`的方式是只读的,会提示"NT_STATUS_ACCESS_DENIED xxx"
smbclient -c "mkdir share1" //192.168.0.1/tmp -U username%password
```
如果用户共享`//192.168.0.1/tmp`的方式是只读的,会提示`NT_STATUS_ACCESS_DENIED making remote directory /share1`
```

@ -2,8 +2,8 @@
## 说明
**sort命令** 是在Linux里非常有用它将文件进行排序并将排序结果标准输出。sort命令既可以从特定的文件也可以从stdin中获取输入
awk 'EXPRESSION { PROGRAM }' file(s)
**sort命令** 是在Linux里非常有用它将文件进行排序并将排序结果标准输出。sort命令既可以从特定的文件也可以从stdin中获
取输入awk 'EXPRESSION { PROGRAM }' file(s)
```markdown
用法sort [选项]... [文件]...
@ -60,8 +60,7 @@ SIZE may be followed by the following multiplicative suffixes:
如果不指定文件,或者文件为"-",则从标准输入读取数据。
*** 警告 ***
本地环境变量会影响排序结果。
如果希望以字节的自然值获得最传统的排序结果请设置LC_ALL=C。
本地环境变量会影响排序结果。如果希望以字节的自然值获得最传统的排序结果请设置LC_ALL=C
```
@ -69,13 +68,19 @@ SIZE may be followed by the following multiplicative suffixes:
```bash
# sort将文件/文本的每一行作为一个单位相互比较比较原则是从首字符向后依次按ASCII码值进行比较最后默认按按升序输出
sort -t. -k1,1n -k2,2n -k3,3n -k4,4n # 排序IPV4地址
# 以下命令如果是英文文本的话export LANG=C可以提高速度
sort -u file1 file2 # 两个未排序文件的并集
sort file1 file2 | uniq -d # 两个未排序文件的交集
sort file1 file1 file2 | uniq -u # 两个未排序文件的差集
sort file1 file2 | uniq -u # 两个未排序文件的对称差集
# 忽略相同行使用-u选项或者uniq
sort -u sort.txt
sort -u sort.txt
uniq sort.txt
sort -nk 2 -t: sort.txt # 将:字符作为分隔符,按其后的第二个字符的数字从小到大排序
# -n是按照数字大小排序-r是以相反顺序-k是指定需要爱排序的栏位-t指定栏位分隔符为冒号
: << comment

@ -1,62 +1,52 @@
split
===
分割任意大小的文件
# split
## 说明
**split命令** 可以将一个大文件分割成很多个小文件,有时需要将文件分割成更小的片段,比如为提高可读性,生成日志等。
**split命令** 可以将一个大文件分割成很多个小文件,有时需要将文件分割成更小的片段,比如为提高可读性,生成日志等
```
-b值为每一输出档案的大小单位为 byte
```markdown
-b
-C每一输出档中单行的最大 byte 数。
-d使用数字作为后缀。
-l值为每一输出档的列数大小。
-a指定后缀长度(默认为2)。
```
-d
-l
-a(默认为2)。
### 实例
用法split [选项] [输入 [前缀]]
输出固定大小的INPUT到PREFIX; 默认大小为1000行默认PREFIX为“x”。 没有INPUT或INPUT为 - 时,读取标准输入
生成一个大小为100KB的测试文件
-a, --suffix-length=N 指定后缀长度 (default 2)
--additional-suffix=SUFFIX append an additional SUFFIX to file names
-b, --bytes=SIZE 值为每一输出档案的大小;单位为 byte
-C, --line-bytes=SIZE 每个输出文件最多放置SIZE字节行数,单行最大byte数
-d, --numeric-suffixes[=FROM] 取代字母使用数字作为后缀FROM changes the start value (default 0)
-e, --elide-empty-files do not generate empty output files with '-n'
--filter=COMMAND write to shell COMMAND; file name is $FILE
-l, --lines=NUMBER 值为每一输出档的列数大小
-n, --number=CHUNKS generate CHUNKS output files; see explanation below
-u, --unbuffered immediately copy input to output with '-n r/...'
--verbose 在每个输出文件打开前输出文件特征
```
[root@localhost split]# dd if=/dev/zero bs=100k count=1 of=date.file
1+0 records in
1+0 records out
102400 bytes (102 kB) copied, 0.00043 seconds, 238 MB/s
```
使用split命令将上面创建的date.file文件分割成大小为10KB的小文件
```
[root@localhost split]# split -b 10k date.file
[root@localhost split]# ls
date.file xaa xab xac xad xae xaf xag xah xai xaj
```
SIZE是一个整数加上可选的单位(例如: 10M is 10*1024*1024)
单位有K, M, G, T, P, E, Z, Y (powers of 1024) or KB, MB, ... (powers of 1000).
文件被分割成多个带有字母的后缀文件,如果想用数字后缀可使用-d参数同时可以使用-a length来指定后缀的长度
CHUNKS may be:
N split into N files based on size of input
K/N output Kth of N to stdout
l/N split into N files without splitting lines
l/K/N output Kth of N to stdout without splitting lines
r/N like 'l' but use round robin distribution
r/K/N likewise but only output Kth of N to stdout
```
[root@localhost split]# split -b 10k date.file -d -a 3
[root@localhost split]# ls
date.file x000 x001 x002 x003 x004 x005 x006 x007 x008 x009
```
为分割后的文件指定文件名的前缀:
```
[root@localhost split]# split -b 10k date.file -d -a 3 split_file
[root@localhost split]# ls
date.file split_file000 split_file001 split_file002 split_file003 split_file004 split_file005 split_file006 split_file007 split_file008 split_file009
```
## 实例
使用-l选项根据文件的行数来分割文件例如把文件分割成每个包含10行的小文件
```bash
dd if=/dev/zero bs=100k count=1 of=date.file # 生成一个大小为100KB的测试文件
split -b 10k date.file # 使用split命令将上面创建的date.file文件分割成大小为10KB的小文件
split -b 10k date.file -d -a 3 # file分割成多个后缀文件若想用数字后缀可使用-d参数同时可使用-a length来指定后缀长度
split -b 10k date.file -d -a 3 split_file # 为分割后的文件指定文件名的前缀
split -l 10 date.file # 使用-l选项根据文件的行数来分割文件例如把文件分割成每个包含10行的小文件
```
split -l 10 date.file
```

@ -40,55 +40,11 @@ ssh [-1246AaCfGgKkMNnqsTtVvXxYy] [-b bind_address] [-c cipher_spec]
## 实例
```bash
#### 如何更改 SSH 服务的端口号
SSH 服务器是默认运行在 22 号端口上的。然而,由于某些原因需要,它也可以运行在别的端口上。比如为了方便测试使用,又比如在同一个宿主机上运行多个不同的配置。当然,极少情况下,不使用 root 权限运行它也可以,比如某些必须运行在非特权的端口的情况(端口号大于等于 1024
端口号可以在配置文件 /etc/ssh/sshd_config 中将 Port 22 更改。也可以使用 -p 选项运行 sshd。SSH 客户端和 sftp 程序也可以使用 -p 选项。
#### 配置 SSH 协议穿越防火墙
SSH 是少数通常被许可穿越防火墙的协议之一。通常的做法是不限制出站的 SSH 连接,尤其常见于一些较小的或者比较技术型的组织中,而入站的 SSH 连接通常会限制到一台或者是少数几台服务器上。
#### 出站的 SSH 连接
在防火墙中配置出站的 SSH 连接十分简单。如果完全限制了外发连接,那么只需要创建一个允许 TCP 端口 22 可以外发的规则即可。如果你想限制目标地址,你可以限制该规则仅允许访问你的组织放在云端的外部服务器或保护该云端的跳板服务器即可。
#### 反向通道是有风险的
其实不限制出站的 SSH 连接虽然是可以的但是是存在风险的SSH 协议是支持 通道访问 的。最初的想法是在外部服务器搭建一个 SSH 服务监听来自各处的连接,将进入的连接转发到组织,并让这个连接可以访问某个内部服务器。
在某些场景下这当然非常的方便。开发者和系统管理员经常使用它打开一个通道以便于他们可以远程访问,比如在家里或者在旅行中使用笔记本电脑等场景。
然而通常来讲这些做法是违背安全策略的,跳过了防火墙管理员和安全团队保护的控制无疑是违背安全策略的,比如这些: PCI、HIPAA、NIST SP 800-53 等。它可以被黑客和外国情报机构用来在组织内留下后门。
CryptoAuditor 是一款可以控制通道穿过防火墙或者一组云端服务器入口的产品。该款产品可以配合 通用 SSH 密钥管理器Universal SSH Key Manager 来获得对 主机密钥host keys的访问以在启用防火墙并阻挡未授权转发的场景中解密 SSH 会话。
#### 入站的 SSH 访问
对于入站访问而言,这里有几点需要说一下:
配置防火墙,并转发所有去往 22 端口的连接只能流向到一个特定的内部网络 IP 地址或者一个 DMZ 主机。在该 IP 上运行 CryptoAuditor 或者跳板机来控制和审查所有访问该组织的连接。
在防火墙上使用不同的端口访问不同的服务器。
只允许使用 IPsec 协议这样的 VPN虚拟专用网登录后连接 SSH 服务。
#### 通过 iptables 服务限制 SSH 访问
iptables 是一款内建在 Linux 内核的宿主防火墙。通常配置用于保护服务器以防止被访问那些未明确开启的端口。
如果服务器上启用了 iptables使用下面的命令将可以允许进入的 SSH 访问,当然命令需要以 root 身份运行。
```
iptables -A INPUT -p tcp --dport 22 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -p tcp --sport 22 -m conntrack --ctstate ESTABLISHED -j ACCEPT
```
如果你想将上述命令创建的规则持久地保存,在某些系统版本中,可使用如下命令:
```
service iptables save
ssh $USER@$HOST command # 在$Host主机上以$User用户运行命令默认命令为Shell
ssh -f -Y $USER@$HOSTNAME xeyes # 在名为$HOSTNAME的主机上以$USER用户运行GUI命令
scp -p -r $USER@$HOST: file dir/ # 拷贝到$HOST主机$USER'用户的目录下
ssh -g -L 8080:localhost:80 root@$HOST # 由本地主机的8080端口转发到$HOST主机的80端口
ssh -R 1434:imap:143 root@$HOST # 由主机的1434端口转发到imap的143端口
```

@ -295,10 +295,9 @@ tar -xf archive.tar # 展开归档文件 archive.tar中的所有文件
压缩gzip [原文件名].tar
解压gunzip [原文件名].tar.gz
方式二:一次性打包并压缩、解压并解包
方式二:一次性打包并压缩、解压并解包z代表用gzip算法来压缩/解压
打包并压缩: tar -zcvf [目标文件名].tar.gz [原文件名/目录名]
解压并解包: tar -zxvf [原文件名].tar.gz
z代表用gzip算法来压缩/解压。
## tar.bz2格式
@ -306,10 +305,9 @@ tar -xf archive.tar # 展开归档文件 archive.tar中的所有文件
压缩bzip2 [原文件名].tar
解压bunzip2 [原文件名].tar.bz2
方式二:一次性打包并压缩、解压并解包
方式二:一次性打包并压缩、解压并解包小写j代表用bzip2算法来压缩/解压
打包并压缩: tar -jcvf [目标文件名].tar.bz2 [原文件名/目录名]
解压并解包: tar -jxvf [原文件名].tar.bz2
小写j代表用bzip2算法来压缩/解压
## tar.xz格式
@ -317,10 +315,9 @@ tar -xf archive.tar # 展开归档文件 archive.tar中的所有文件
压缩xz [原文件名].tar
解压unxz [原文件名].tar.xz
方式二:一次性打包并压缩、解压并解包
方式二:一次性打包并压缩、解压并解包大写J代表用xz算法来压缩/解压
打包并压缩: tar -Jcvf [目标文件名].tar.xz [原文件名/目录名]
解压并解包: tar -Jxvf [原文件名].tar.xz
大写J代表用xz算法来压缩/解压。
## tar.Z格式已过时
@ -331,7 +328,7 @@ tar -xf archive.tar # 展开归档文件 archive.tar中的所有文件
方式二:一次性打包并压缩、解压并解包
打包并压缩: tar -Zcvf [目标文件名].tar.Z [原文件名/目录名]
解压并解包: tar -Zxvf [原文件名].tar.Z
大写Z代表用ncompress算法来压缩/解压。另ncompress是早期Unix系统的压缩格式但由于ncompress的压缩率太低现已过时
大写Z代表用ncompress算法来压缩/解压。另ncompress是早期Unix系统的压缩格式但由于ncompress的压缩率太低现已过时
## jar格式

@ -1,21 +1,13 @@
tcpdump
===
一款sniffer工具是Linux上的抓包工具嗅探器。
# **tcpdump**
## 说明
**tcpdump命令** 是一款抓包,嗅探器工具,它可以打印所有经过网络接口的数据包的头信息,也可以使用`-w`选项将数据包保存到文件中,方便以后分析。
### 语法
```
tcpdump(选项)
```
**tcpdump命令** 是一款抓包,嗅探器工具,它可以打印所有经过网络接口的数据包的头信息,也可以使用`-w`选项将数据包保存到文件
中,方便以后分析
## 选项
```
```markdown
-a尝试将网络和广播地址转换成名称
-c<数据包数目>:收到指定的数据包数目后,就停止进行倾倒操作;
-d把编译过的数据包编码转换成可阅读的格式并倾倒到标准输出
@ -43,123 +35,23 @@ tcpdump(选项)
-w<数据包文件>:把数据包数据写入指定的文件。
```
### 实例
**直接启动tcpdump将监视第一个网络接口上所有流过的数据包**
```
tcpdump
```
**监视指定网络接口的数据包**
```
tcpdump -i eth1
```
如果不指定网卡默认tcpdump只会监视第一个网络接口一般是eth0下面的例子都没有指定网络接口。
**监视指定主机的数据包**
打印所有进入或离开sundown的数据包。
```
tcpdump host sundown
```
也可以指定ip,例如截获所有210.27.48.1 的主机收到的和发出的所有的数据包
```
tcpdump host 210.27.48.1
```
打印helios 与 hot 或者与 ace 之间通信的数据包
```
tcpdump host helios and \( hot or ace \)
```
截获主机210.27.48.1 和主机210.27.48.2 或210.27.48.3的通信
```
tcpdump host 210.27.48.1 and \ (210.27.48.2 or 210.27.48.3 \)
```
打印ace与任何其他主机之间通信的IP 数据包, 但不包括与helios之间的数据包.
```
tcpdump ip host ace and not helios
```
如果想要获取主机210.27.48.1除了和主机210.27.48.2之外所有主机通信的ip包使用命令
```
tcpdump ip host 210.27.48.1 and ! 210.27.48.2
```
抓取eth0网卡上的包使用:
```
sudo tcpdump -i eth0
```
截获主机hostname发送的所有数据
```
tcpdump -i eth0 src host hostname
```
监视所有送到主机hostname的数据包
```
tcpdump -i eth0 dst host hostname
```
**监视指定主机和端口的数据包**
如果想要获取主机210.27.48.1接收或发出的telnet包使用如下命令
```
tcpdump tcp port 23 host 210.27.48.1
```
对本机的udp 123 端口进行监视 123 为ntp的服务端口
```
tcpdump udp port 123
```
**监视指定网络的数据包**
打印本地主机与Berkeley网络上的主机之间的所有通信数据包
```
tcpdump net ucb-ether
```
ucb-ether此处可理解为“Berkeley网络”的网络地址此表达式最原始的含义可表达为打印网络地址为ucb-ether的所有数据包
打印所有通过网关snup的ftp数据包
```
tcpdump 'gateway snup and (port ftp or ftp-data)'
```
注意表达式被单引号括起来了这可以防止shell对其中的括号进行错误解析
打印所有源地址或目标地址是本地主机的IP数据包
```
tcpdump ip and not net localnet
```
如果本地网络通过网关连到了另一网络,则另一网络并不能算作本地网络。
抓取80端口的HTTP报文以文本形式展示
## 实例
```bash
sudo tcpdump -i any port 80 -A
```
tcpdump # 直接启动tcpdump将监视第一个网络接口上所有流过的数据包
tcpdump -i eth1 # 监视指定接口eth1的数据包
tcpdump host 210.27.48.1 # 指定ip,例如截获所有210.27.48.1 的主机收到的和发出的所有的数据包
tcpdump host helios and \( hot or ace \) # 打印helios 与 hot 或者与 ace 之间通信的数据包
tcpdump host 210.27.48.1 and \ (210.27.48.2 or 210.27.48.3 \) # 截获主机210.27.48.1和主机210.27.48.2或210.27.48.3的通信
tcpdump ip host ace and not helios # 打印ace与任何其他主机之间通信的IP 数据包, 但不包括与helios之间的数据包.
tcpdump ip host 210.27.48.1 and ! 210.27.48.2 # 获取主机210.27.48.1除了和主机210.27.48.2之外所有主机通信的ip包
tcpdump -i eth0 src host hostname # 截获主机hostname发送的所有数据
tcpdump -i eth0 dst host hostname # 监视所有送到主机hostname的数据包
tcpdump tcp port 23 host 210.27.48.1 # 监视指定主机和端口的数据包
tcpdump udp port 123 # 对本机的udp 123 端口进行监视 123 为ntp的服务端口
tcpdump net ucb-ether # 监视指定网络的数据包,打印网络地址为ucb-ether的所有数据包
tcpdump 'gateway snup and (port ftp or ftp-data)' # 打印所有通过网关snup的ftp数据包,gateway后必须是网关名称
tcpdump ip and not net localnet # 打印所有源地址或目标地址是本地主机的IP数据包
tcpdump -i any port 80 -A # 抓取80端口的HTTP报文并以文本形式展示
```

@ -5,6 +5,8 @@
**top命令** 可以实时动态地查看系统的整体运行情况是一个综合了多方信息监测系统性能和运行信息的实用工具。通过top命令所提
供的互动式界面,用热键可以管理
## 选项
```markdown
-b 以批处理模式操作
-c 显示完整的治命令
@ -19,62 +21,70 @@
-k 关闭指定进程号
```
## top交互命令
## top交互命令
在top命令执行过程中可以使用的一些交互命令。这些命令都是单字母的如果在命令行中使用了-s选项 其中一些命令可能会被屏蔽
在top命令执行过程中可以使用的一些交互命令。这些命令都是单字母的如果在命令行中使用了-s选项 其中一些命令可能会被屏蔽
```markdown
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文件中。
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文件中
```
## 实例
```
```markdown
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
%Cpu(s): 0.1 us, 0.0 sy, 0.0 ni, 99.8 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
Swap: 5144568k total, 1245456k used, 5144512k free, 2013180k cached
```
**解释:**
```markdown
# 输出解释
top - 09:44:56 当前系统时间
16 days 系统已经运行了16天
1 user 1个用户当前登录
load average: 9.59, 4.75, 1.92 系统负载即任务队列的平均长度此处是1分钟5分钟10分钟的平均负载
Tasks: 145 total 总进程数
2 running 正在运行的进程数
143 sleeping 睡眠的进程数
0 stopped 停止的进程数
0 zombie 冻结进程数
Cpu(s): Linux使用nice值来确定进程的优先级显示在各项任务上花费的CPU时间百分
0.1 us, user CPU花费在用户空间执行进程的时间占用百分比--(time running un-niced user processes)
0.1 sy, system CPU在内核空间执行进程所花费的时间百分比--(time running kernel processes)
0.0 ni, nice 用户进程空间内改变过优先级的进程占用CPU百分比--(time running niced user processes)
0.2 id, idle 空闲CPU百分比--(time spent in the kernel idle handler)
0.0 wa, IO-wait 等待输入输出(I/O)的CPU时间百分比--(time waiting for I/O completion)
0.0 hi 处理硬件中断所花费时间的百分比--(time spent servicing hardware interrupts)
0.0 si 处理软件中断所花费时间的百分比--(time spent servicing software interrupts)
0.0 st 虚拟化环境中部分CPU资源提供给虚拟机操作系统检测是否有任务执行但由于忙于其他VM因此无法执行他们
以此方损失的时间占用的百分比叫st--(time stolen from this vm by the hypervisor)
Mem: 4147888k total 物理内存总量
2493092k used 使用的物理内存总量
1654796k free 空闲内存总量
158188k buffers 用作内核缓存的内存量
Swap:  5144568k total 交换区总量
1215456k used 使用的交换区总量
5144512k free 空闲交换区总量
2013180k cached 缓冲的交换区总量
```
* 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[缓冲的交换区总量],

@ -1,21 +1,13 @@
touch
===
创建新的空文件
# **touch**
## 说明
**touch命令** 有两个功能:一是用于把已存在文件的时间标签更新为系统当前的时间(默认方式),它们的数据将原封不动地保留下来;二是用来创建新的空文件。
### 语法
**touch命令** 有两个功能:一是用于把已存在文件的时间标签更新为系统当前的时间(默认方式),它们的数据将原封不动地
保留下来;二是用来创建新的空文件
```
touch(选项)(参数)
```
## 选项
```
```markdown
-a或--time=atime或--time=access或--time=use 只更改存取时间;
-c或--no-create 不建立任何文件;
-d<时间日期> 使用指定的日期时间,而非现在的时间;
@ -23,20 +15,34 @@ touch(选项)(参数)
-m或--time=mtime或--time=modify 只更该变动时间;
-r<参考文件或目录> 把指定文件或目录的日期时间,统统设成和参考文件或目录的日期时间相同;
-t<日期时间> 使用指定的日期时间,而非现在的时间;
--help在线帮助
--version显示版本信息。
```
### 参数
文件:指定要设置时间属性的文件列表。
### 实例
用法touch [选项]... 文件...
Update the access and modification times of each FILE to the current time.
A FILE argument that does not exist is created empty, unless -c or -h
is supplied.
A FILE argument string of - is handled specially and causes touch to
change the times of the file associated with standard output.
Mandatory arguments to long options are mandatory for short options too.
-a 只更改访问时间
-c, --no-create 不创建任何文件
-d, --date=字符串 使用指定字符串表示时间而非当前时间
-f (忽略)
-h, --no-dereference 会影响符号链接本身,而非符号链接所指示的目的地
(当系统支持更改符号链接的所有者时,此选项才有用)
-m 只更改修改时间
-r, --reference=FILE use this file's times instead of current time
-t STAMP use [[CC]YY]MMDDhhmm[.ss] instead of current time
--time=WORD change the specified time:
WORD is access, atime, or use: equivalent to -a
WORD is modify or mtime: equivalent to -m
请注意,-d 和-t 选项可接受不同的时间/日期格式
```
touch ex2
```
在当前目录下建立一个空文件ex2然后利用`ls -l`命令可以发现文件ex2的大小为0表示它是空文件。
## 实例
```bash
touch -c -t 0304050607 file # 改变文件file的时间标签
```

@ -2,7 +2,7 @@
## 说明
**tr命令** 可以对来自标准输入的字符进行替换、压缩和删除。它可以将一组字符变成另一组字符,经常用来编写优美的单行命令,作用很强大
**tr命令** 可以对来自标准输入的字符进行替换、压缩和删除。它可以将一组字符变成另一组字符,经常用来编写优美的单行命令
## 选项
@ -56,9 +56,11 @@ SET 是一组字符串,一般都可按照字面含义理解。解析序列如
## 实例
```bash
echo "HELLO WORLD" | tr 'A-Z' 'a-z' # 将输入字符由大写转换为小写
echo "HELLO WORLD" | tr 'A-Z' 'a-z' # 将输入字符由大写转换为小写
echo 'Test' | tr '[:lower:]' '[:upper:]' # 将Test转换为大写
echo "hello 123 world 456" | tr -d '0-9' # 使用tr删除字符
cat text | tr '\t' ' ' # 将制表符转换为空格
cat text | tr '\t' ' ' # 将制表符转换为空格
tr -dc '[:print:]' < /dev/urandom # 过滤掉不能打印的内容
# 字符集补集从输入文本中将不在补集中的所有字符删除此例中补集中包含了数字0~9、空格和换行符\n所以没有被删除其他字
# 符全部被删除了

@ -24,5 +24,5 @@
## 实例
```bash
uname -a # 查询内核/操作系统/CPU信息
```

@ -42,5 +42,9 @@ FreeBSD和Linux下watch命令的不同在Linux下watch是周期性的执
如:`watch -n 1 -d netstat -ant`而在FreeBSD下的watch命令是查看其它用户的正在运行的操作
watch允许你偷看其它terminal正在做什么该命令只能让超级用户使用
## 实例
```bash
watch -n 1 'cat /proc/interrupts' # 检测文件/proc/interrupts的变化
```

@ -208,101 +208,40 @@ WARC 选项:
-np, --no-parent 不追溯至父目录
```
## 实例
## 实例
```sh
# 下载并以不同的文件名保存
wget -O wordpress.zip http://www.jsdig.com/download.aspx?id=1080
# wget默认会以最后一个符合`/`的后面的字符来命令,对于动态链接的下载通常文件名会不正确。
错误:下面的例子会下载一个文件并以名称`download.aspx?id=1080`保存:
wget http://www.jsdig.com/download?id=1
即使下载的文件是zip格式它仍然以`download.php?id=1080`命令。
正确:为了解决这个问题,我们可以使用参数`-O`来指定一个文件名:
wget -O wordpress.zip http://www.jsdig.com/download.aspx?id=1080
# wget限速下载当你执行wget的时候它默认会占用全部可能的宽带下载。但是当你准备下载一个大文件而你还需要下载其它文件时就有必要限速了。
wget--limit-rate=300k http://www.jsdig.com/testfile.zip
# 使用wget断点续传使用`wget -c`重新启动下载中断的文件,对于我们下载大文件时突然由于网络等原因中断非常有帮助,我们可以继续接着下载而不是重新下载一个文件。需要继续中断的下载时可以使用`-c`参数。
# 使用wget后台下载,对于下载非常大的文件的时候,我们可以使用参数`-b`进行后台下载,你可以使用以下命令来察看下载进度:
wget -b http://www.jsdig.com/testfile.zip
Continuing in background, pid 1840
tail -f wget-log
# 伪装代理名称下载
wget--user-agent="Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/534.16 (KHTML, like Gecko) Chrome/10.0.648.204 Safari/534.16" http://www.jsdig.com/testfile.zip
# 有些网站能通过根据判断代理名称不是浏览器而拒绝你的下载请求。不过你可以通过`--user-agent`参数伪装。
# 测试下载链接,当你打算进行定时下载,你应该在预定时间测试下载链接是否有效。我们可以增加`--spider`参数进行检查。
wget--spider URL
# 如果下载链接正确,将会显示:
Spider mode enabled. Check if remote file exists.
HTTP request sent, awaiting response... 200 OK
Length: unspecified [text/html]
Remote file exists and could contain further links,
but recursion is disabled-- not retrieving.
# 这保证了下载能在预定的时间进行,但当你给错了一个链接,将会显示如下错误:
wget--spider url
Spider mode enabled. Check if remote file exists.
HTTP request sent, awaiting response... 404 Not Found
Remote file does not exist-- broken link!!!
# 你可以在以下几种情况下使用`--spider`参数:
* 定时下载之前进行检查
* 间隔检测网站是否可用
* 检查网站页面的死链接
# 增加重试次数
wget--tries=40 URL
# 如果网络有问题或下载一个大文件也有可能失败。wget默认重试20次连接下载文件。如果需要你可以使用`--tries`增加重试次数。
wget -i filelist.txt # 下载多个文件
wget -m -p --convert-links -P ./LOCAL URL # 下载整个网站到本地;`--miror`镜像下载。`-p`下载所有为了html页面显示正常的文件。`--convert-links`下载后,转换成本地的链接。`-P ./LOCAL`保存所有文件和目录到本地指定目录。
```bash
wget--limit-rate=300k http://www.jsdig.com/testfile.zip # wget限速下载
wget -bc http://www.jsdig.com/testfile.zip # -b进行后台下载-c实现断点续传
# 过滤指定格式下载
wget--reject=gif ur
# 下载一个网站,但你不希望下载图片,可以使用这条命令。
# 把下载信息存入日志文件,不希望下载信息直接显示在终端而是在一个日志文件,可以使用
wget -o download.log URL
# 限制总下载文件大小,当你想要下载的文件超过5M而退出下载你可以使用。注意这个参数对单个文件下载不起作用只能递归下载时才有效
wget -Q5m -i filelist.txt
# 下载指定格式文件,可以在以下情况使用该功能:
下载一个网站的所有图片。
下载一个网站的所有视频。
下载一个网站的所有PDF文件。
wget -r -A.pdf url
# FTP下载
wget ftp-url
wget--ftp-user=USERNAME--ftp-password=PASSWORD url
# 可以使用wget来完成ftp链接的下载
# 使用wget匿名ftp下载
wget ftp-url
# 使用wget用户名和密码认证的ftp下载
wget--ftp-user=USERNAME--ftp-password=PASSWORD url
cd cmdline && wget -nd -pHEKk <http://www.pixelbeat.org/cmdline.html> # 在当前目录中下载指定网页及其相关的文件使其可完全浏览
wget -c <http://www.example.com/large.file #
wget -m -p --convert-links -P ./LOCAL URL # 下载整个网站到本地
cd path && wget -nd -pHEKk <http://www.pixelbeat.org/cmdline.html> # cd到目录中下载指定网页及其相关的文件使其可完全浏览
wget --user-agent="Mozilla/5.0" http://www.jsdig.com/testfile.zip # 伪装代理名称下载
wget --mirror http://www.example.com/ # 更新网站的本地拷贝可以方便地用于cron
wget -r -nd -np -l1 -A '*.jpg' http://www.example.com/ # 批量下载文件到当前目录中
wget --tries=40 URL # 增加重试次数
wget -i filelist.txt # 下载多个文件
wget --reject=gif url # 过滤指定格式下载
wget -o download.log URL # 把下载信息存入日志文件,不希望下载信息直接显示在终端而是在一个日志文件
wget -Q5m -i filelist.txt # 限制总下载文件大小,注意:这个参数对单个文件下载不起作用,只能递归下载时才有效
wget -r -A.pdf url # 下载一个网站的所有PDF文件
wget ftp-url # wget匿名ftp下载
wget --ftp-user=USERNAME--ftp-password=PASSWORD url # 使用wget用户名和密码认证的ftp下载
wget ftp://remote/file[1-9].iso/ # 下载FTP站上的整个目录
wget -q -O- http://www.pixelbeat.org/timeline.html | grep 'a href' | head # 匹配后直接处理输出
echo 'wget url' | at 01:00 # 在下午一点钟下载指定文件到当前目录
wget --limit-rate=20k url # 限制下载速度这里限制到20KB/s
wget --spider URL # 测试下载链接是否有效,--spider`参数进行检查。正确会返回200状态码
wget -nv --spider --force-html -i bookmarks.html # 检查文件中的链接是否存在
wget --mirror http://www.example.com/ # 更新网站的本地拷贝可以方便地用于cron
: << comment
可以在以下几种情况下使用`--spider`参数:
定时下载之前进行检查
间隔检测网站是否可用
检查网站页面的死链接
comment
# wget默认会以最后一个符合`/`的后面的字符来命令,对于动态链接的下载通常文件名会不正确
wget http://www.jsdig.com/download.aspx?id=1080 # 错误:此例会下载一个文件并以名称`download.aspx?id=1080`保存
wget -O wordpress.zip http://www.jsdig.com/download.aspx?id=1080 # 正确:为解决此问题,使用参数`-O`来指定一个文件名
```

@ -0,0 +1,50 @@
# whois
## 说明
**whois** whois目录服务的客户端
## 选项
```markdown
用法: whois 【选项】 …… 对象 ……
-h HOST, --host HOST 连接到服务器 HOST
-p PORT, --port PORT 连接到端口 PORT
-H 隐藏法律声明
--verbose 解释正在做什么
--help 显示帮助并退出
--version 输出版本信息并退出
这些标志是由 whois.ript.net 和 RIPE-like 服务器支持的:
-l 寻找有更少具体匹配的一个级别
-L 寻找所有更少具体匹配的级别
-m 寻找有更加具体匹配的一个级别
-M 寻找有更加具体的匹配的所有级别
-c 寻找包含 mnt-irt 属性的最小匹配
-x 精确匹配
-b return brief IP address ranges with abuse contact
-B 关闭对象过滤(显示 email 地址)
-G 关闭相关联对象的分组
-d 返回 DNS 反解授权对象
-i ATTR[,ATTR]... 对特定的属性( ATTR )进行逆向查询
-T TYPE[,TYPE]... 只寻找 TYPE 的对象
-K 只返回主键
-r 关闭联系信息的递归查询
-R 强制显示域对象的本地副本,即使
它包含引用
-a 一并搜索所有的数据库镜像
-s SOURCE[,SOURCE]... 从 SOURCE 中搜索数据库镜像
-g SOURCE:FIRST-LAST 从串行的 FIRST 到 LAST 的 SOURCE 中查找更新
-t TYPE 请求 TYPE 对象的模板
-v TYPE 请求 TYPE 对象的详细模板
-q [version|sources|types] 询问制定服务器信息
```
## 实例
```bash
whois linuxde.net # 查询域名信息
```
Loading…
Cancel
Save