Unix-like Tools

Table of Contents

1 cal

cal可在终端显示日历,不带参数运行cal可显示当前月份的日历。

实例:显示某一整年的日历:

$ cal -y 2000
                            2000
      January               February               March
Su Mo Tu We Th Fr Sa  Su Mo Tu We Th Fr Sa  Su Mo Tu We Th Fr Sa
                   1         1  2  3  4  5            1  2  3  4
 2  3  4  5  6  7  8   6  7  8  9 10 11 12   5  6  7  8  9 10 11
 9 10 11 12 13 14 15  13 14 15 16 17 18 19  12 13 14 15 16 17 18
16 17 18 19 20 21 22  20 21 22 23 24 25 26  19 20 21 22 23 24 25
23 24 25 26 27 28 29  27 28 29              26 27 28 29 30 31
30 31

       April                  May                   June
Su Mo Tu We Th Fr Sa  Su Mo Tu We Th Fr Sa  Su Mo Tu We Th Fr Sa
                   1      1  2  3  4  5  6               1  2  3
 2  3  4  5  6  7  8   7  8  9 10 11 12 13   4  5  6  7  8  9 10
 9 10 11 12 13 14 15  14 15 16 17 18 19 20  11 12 13 14 15 16 17
16 17 18 19 20 21 22  21 22 23 24 25 26 27  18 19 20 21 22 23 24
23 24 25 26 27 28 29  28 29 30 31           25 26 27 28 29 30
30

        July                 August              September
Su Mo Tu We Th Fr Sa  Su Mo Tu We Th Fr Sa  Su Mo Tu We Th Fr Sa
                   1         1  2  3  4  5                  1  2
 2  3  4  5  6  7  8   6  7  8  9 10 11 12   3  4  5  6  7  8  9
 9 10 11 12 13 14 15  13 14 15 16 17 18 19  10 11 12 13 14 15 16
16 17 18 19 20 21 22  20 21 22 23 24 25 26  17 18 19 20 21 22 23
23 24 25 26 27 28 29  27 28 29 30 31        24 25 26 27 28 29 30
30 31

      October               November              December
Su Mo Tu We Th Fr Sa  Su Mo Tu We Th Fr Sa  Su Mo Tu We Th Fr Sa
 1  2  3  4  5  6  7            1  2  3  4                  1  2
 8  9 10 11 12 13 14   5  6  7  8  9 10 11   3  4  5  6  7  8  9
15 16 17 18 19 20 21  12 13 14 15 16 17 18  10 11 12 13 14 15 16
22 23 24 25 26 27 28  19 20 21 22 23 24 25  17 18 19 20 21 22 23
29 30 31              26 27 28 29 30        24 25 26 27 28 29 30
                                            31

2 colrm

colrm 可以删除标准输入中指定的列。如:

$ printf "abcde\n123456\n" | colrm 1 3    # 从第1列删到第3列
de
456
$ printf "abcde\n123456\n" | colrm 4      # 删除第4列及以后的列
abc
123

3 column(列对齐输出)

column 常常用来进行列对齐后再输出。下面例子中,第2列和第3列在输出时被对齐了:

$ printf "abcdef ab a\n1 2 3\n4 5 6\n" | column -t
abcdef  ab  a
1       2   3
4       5   6

默认输入数据中的分隔符为空格,如果不是,可以通过 -s sep 来指定输入数据的分隔符,如:

$ printf "abcdef:ab:a\n1:2:3\n4:5:6\n" | column -t -s":"
abcdef  ab  a
1       2   3
4       5   6

4 comm(求两个有序文件的不同)

comm 可以求出两个有序文件的交集和差集等。

comm file1 file2 的输出包含三列(tab分隔),第1列是仅出现在file1的行,第2列是仅出现在file2中的行,第3列是同时出现在file1和file2中的行。

首先,生成两个测试文件file1和file2:

$ sed -n '100p;2000p;3000p;4000p;5000p;6000p;7000p' /usr/share/dict/words |sort >file1
$ sed -n '10p;2000p;4000p;7000p;9000p' /usr/share/dict/words |sort >file2
$ cat file1
Abbadide
Alsophila
Amoy
actinomere
advisableness
agitate
alef
$ cat file2
Aaron
Amoy
actinomere
agitate
annulation

运行命令 comm file1 file2 的结果如下(第1列是仅出现在file1的行,第2列是仅出现在file2中的行,第3列是同时出现在file1和file2中的行):

$ comm file1 file2
	Aaron
Abbadide
Alsophila
		Amoy
		actinomere
advisableness
		agitate
alef
	annulation

comm命令的常用实例如表 1 所示。

Table 1: comm命令常用实例
命令 说明
comm -2 -3 file1 file2 显示file1中独有的行(即不显示2,3列)
comm -1 -3 file1 file2 显示file2中独有的行(即不显示1,3列)
comm -1 -2 file1 file2 显示同时出现在file1和file2中的行(即不显示1,2列)
comm -3 file1 file2 | tr -d '\t' 显示仅出现在一个文件中的行(即不显示第3列,删除tab,假定file1和file2中没有tab)

测试如下:

$ comm -2 -3 file1 file2              # 显示file1中独有的行
Abbadide
Alsophila
advisableness
alef
$ comm -1 -3 file1 file2              # 显示file2中独有的行
Aaron
annulation
$ comm -1 -2 file1 file2              # 显示同时出现在file1和file2中的行
Amoy
actinomere
agitate
$ comm -3 file1 file2 | tr -d '\t'    # 显示仅出现在一个文件中的行
Aaron
Abbadide
Alsophila
advisableness
alef
annulation

参考: man comm

5 cron和crontab(定时执行任务)

cron 是Unix/Linux系统中的一个deamon程序,用于周期性地执行任务(注:它每隔一分钟检查一次是否有任务需要执行)。使用工具 crontab 可以方便地查看、增加或删除定时任务。crontab的基本使用如表 2 所示。

Table 2: crontab命令
crontab命令 功能
crontab -l 列出当前用户的定时任务
crontab -e 增加(或编辑)当前用户的定时任务(会启动EDITOR所指定编辑器,默认为vi)
crontab -r 删除当前用户的定时任务

5.1 增加定时任务

使用 crontab -e 可以增加(或编辑已有的)定时任务。定时任务的格式如下:

# Example of job definition:
# .---------------- minute (0 - 59)
# |  .------------- hour (0 - 23)
# |  |  .---------- day of month (1 - 31)
# |  |  |  .------- month (1 - 12) OR jan,feb,mar,apr ...
# |  |  |  |  .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
# |  |  |  |  |
# *  *  *  *  *  command to be executed

定时任务分为6个字段(使用空格或者制表符分隔),前5个字段用来指定时间周期,最后一个字段是想要执行的命令。

下面重点介绍一下前5个字段。 除了使用具体数字外,还有几个特殊符号: *-, 。其中星号 * 代表所有有效数字,连字符 - 代表从某个数字到某个数字,逗号 , 代表几个离散的数字(注:很多实现还支持用特殊符号 / 表示“每”的含义,不过POSIX标准中并没有包含它)。

3 是crontab的几个实例。

Table 3: crontab实例
crontab实例 说明
* * * * * echo 'Test' >> /tmp/file1 每分钟执行 echo 'Test' >> /tmp/file1
0 * * * * myCommand 每小时0分钟(整点)执行myCommand
0 0 * * * myCommand 每天零点执行myCommand
25,45 8-11 * * * myCommand 每天上午8点到11点的第25和第45分钟执行myCommand
15 1 * * 6,0 myCommand 每周六、周日的1:15执行myCommand

参考: man 5 crontab

6 date和tzselect

date除查看当前时区时间外,还可查看其它时区时间。

如果计算机的locate时区不是你所在时区,如何查看你所在时区的时间呢?可以通过在运行date前,先设置TZ变量的实现。

假设,当前计算机默认时区为Pacific Standard Time,如:

bash-3.2$ date
2012年 12月 24日 星期一 18:59:01 PST

上面显示的时区为PST(Pacific Standard Time),要查看China Standard Time,怎么办?

在运行date前设置TZ=UTC,可以查看协调世界时(UTC)

bash-3.2$ TZ=UTC date
2012年 12月 25日 星期二 02:59:06 UTC

对应的China Standard Time就是UTC加8个小时,即10:59:06了。

能不能直接得到China Standard Time呢?看下文。
尝试1:设置TZ为CST:

bash-3.2$ TZ=CST date
2012年 12月 25日 星期二 02:59:31 CST

可以发现设置TZ=CST和TZ=UTC,得到的结果是一样的(仅秒钟不一样,这是运行命令有先后造成的)
这是在这里CST是Central Standard Time的缩写(而不是China Standard Time的缩写)。

尝试2:设置TZ为Asia/Shanghai

bash-3.2$ TZ='Asia/Shanghai' date
2012年 12月 25日 星期二 10:59:36 CST

终于得到了北京时间!
除了设置为Asia/Shanghai外,设置为Asia/Harbin等得到的结果也一样,但是却不能设置为Asia/Beijing,为什么呢?网上很多人也在报怨,可以是历史原因吧。
这些字符串都太长了,难输入,可以直接TZ=PRC,同样得到北京时间!

查询某地区所使用的时区tzselect:

bash-3.2$ tzselect
Please identify a location so that time zone rules can be set correctly.
Please select a continent or ocean.
 1) Africa
 2) Americas
 3) Antarctica
 4) Arctic Ocean
 5) Asia
 6) Atlantic Ocean
 7) Australia
 8) Europe
 9) Indian Ocean
10) Pacific Ocean

一步一步提示你输入,直到定位到某地区。

注:
时区相关的文件在/usr/share/zoneinfo

6.1 按指定格式显示时间

可以指定date的时间显示格式。如:

$ date -u +"%Y-%m-%d %H:%M:%S"
2014-05-20 03:58:48

上面例子中“-u”表示显示协调世界时(UTC)。

参考:http://pubs.opengroup.org/onlinepubs/9699919799/utilities/date.html

7 dconf-editor和gconf-editor

dconf速度更快。因为dconf使用binary格式保存配置,而gconf使用xml格式。
dconf正在逐渐取代gconf。

它们分别对应的设置工具为:dconf-editor和gconf-editor

参考:
http://askubuntu.com/questions/91403/when-to-use-gconf-vs-dconf
http://askubuntu.com/questions/34490/what-are-the-differences-between-gconf-and-dconf

7.1 对特定网址忽略代理

Firstly, run dconf-edior
Then, manually navigate to system -> http_proxy -> ignore_hosts

参考:
http://askubuntu.com/questions/135089/proxy-exceptions-in-12-04-lts

8 diff和patch

生成某个文件patch文件:

$ diff -u old.c new.c >old.patch

对单个文件应用patch:

$ patch old.c <old.patch

取消patch(-R选项):

$ patch -R  old.c  <old.patch

8.1 应用patch的实例

最常见的用法:

$ patch  -p num  <file.patch

实例说明:

$ diff -u ./dir1/dir2/calc.dot  ./dir1/dir2/calc.dot.new  >file.patch

得到的file.patch的前两行内容类似于:
— dir1/dir2/calc.dot 2013-07-25 13:11:26.228482262 0800
++
dir1/dir2/calc.dot.new 2013-07-25 13:01:32.084468140 +0800

如果你在当前目录下运行patch,可以运行(指定-p0):

$ patch -p0 <file.patch

如果file.patch被你移动到./dir1里面了,你在./dir1里运行patch时,应该这样运行(指定-p1):

$ patch -p1 <file.patch

-p1的意思去掉file.patch文件中的1个/符号(及其左边部分),这样patch理解的就是下面内容:
— dir2/calc.dot 2013-07-25 13:11:26.228482262 0800
++
dir2/calc.dot.new 2013-07-25 13:01:32.084468140 +0800

8.2 左右对比查看(diff -y或sdiff)

用diff -y或sdiff可左右对比查看两个文件的不同。
假设有下面两个文件:

$ cat file1
a
b
c
d
e
f
g
$ cat file2
a
x
c
d

用diff -y或sdiff的输出如下:

$ diff -y file1 file2
a                                                               a
b                                                             | x
c                                                               c
d                                                               d
e                                                             <
f                                                             <
g                                                             <
$ sdiff file1 file2
a                                                               a
b                                                             | x
c                                                               c
d                                                               d
e                                                             <
f                                                             <
g                                                             <

8.3 对两个目录进行比较

diff可以直接对目录进行比较。

8.3.1 递归比较子目录(-r)

$ diff -r dir1 dir2

8.3.2 忽略CVS相关文件(-x)

$ diff -x "*CVS*" -r dir1 dir2

8.3.3 同时显示相同的文件(-s)

$ diff -s -r dir1 dir2

8.3.4 目录比较实例

假设在下面两个目录dir1和dir2,其中file1是不同的,file5只存在于dir2中。

$ find dir1
dir1
dir1/sub
dir1/sub/file1
dir1/sub/file2
dir1/sub/file3
dir1/sub/file4
$ find dir2
dir2
dir2/sub
dir2/sub/file1
dir2/sub/file2
dir2/sub/file3
dir2/sub/file4
dir2/sub/file5

递归比较两个目录,如:

$ diff -r dir1 dir2
diff -r dir1/sub/file1 dir2/sub/file1
2c2
< ABC
---
> ABCD
Only in dir2/sub: file5

同时显示所有相同文件的列表,如:

$ diff -s -r dir1 dir2
diff -s -r dir1/sub/file1 dir2/sub/file1
2c2
< ABC
---
> ABCD
Files dir1/sub/file2 and dir2/sub/file2 are identical
Files dir1/sub/file3 and dir2/sub/file3 are identical
Files dir1/sub/file4 and dir2/sub/file4 are identical
Only in dir2/sub: file5

用diff的'-q'选项可以只显示不同文件的文件名,而不是显示具体哪些不同,如:

$ diff -q -r dir1 dir2
Files dir1/sub/file1 and dir2/sub/file1 differ
Only in dir2/sub: file5

9 djvused(编辑djvu文件)

要对djvu文件进行编辑,推荐工具:djvused

书签相关操作:
把书签dump到一个文件中:

$ djvused 1.djvu -e "print-outline" >bookmarks.txt

设置书签:

$ djvused 1.djvu -e "set-outline bookmarks.txt" -s

书签文件的格式实例:

(bookmarks
("Title" "#1")
("My Chapter 1" "#5"
("Sub Chapter 1" "#5")
("Sub Chapter 2" "#15"))
)

关于它的格式的说明可以参考 man djvused

下面是一个把一般格式的页码内容转换为djvused可识别的页码格式的小程序:

# format_djvu_bookmarks.awk
# 功能:把一般格式的页码内容转换为djvused可识别的页码格式。
# 假设28为逻辑页码为实际页码的差值。
$NF>0 {
$NF=$NF+28;
$1=sprintf("\(\"%s",$1);
$(NF-1)=sprintf("%s\"\n",$(NF-1));
if (length($NF)<=2){
  $NF=sprintf("\"#0%s\"\)",$NF);
} else {
  $NF=sprintf("\"#%s\"\)",$NF);
}
print;
}

页面title相关操作可以认为是“逻辑页码”,如果页面设置了title,在较新的djvu阅读器中,页码处会优先显示页面的title而不是页码。这样可以实现类似于pdf文件的逻辑页码的效果。

10 ed

ed编辑器是以行为单位对文本进行操作的编辑器,也就是说它一次编辑一行(很多vi命令都来自ed)。

当ed打开一文本文件时,将复制文件的内容到ed命令的缓存中,在ed中的所有命令操作只作用于缓存中的内容,而不会对源文件有任何影响,除非对源文件进行 w(写)操作。

10.1 ed两种模式(命令模式和输入模式)

ed有命令模式和输入模式两种模式,类似于vi的两种模式,ed在命令模式下输入的是命令,这些命令用来指定对编辑文本的操作;ed在输入模式下输入的是文本,这些文本将依照命令模式下输入的命令被添加或替换到文本中。

当第一次被调用时,ed默认进入命令模式,当输入 a, ci 命令后即进入输入模式。
在输入模式下,单行输入单个点号(.)然后回车,则回到命令模式(说明:这使得你无法用ed直接插入仅含有单个点的一行)。

参考:http://bbs.chinaunix.net/thread-1262996-1-1.html

11 env和set

env用来查看所有环境变量(environmental variables),set用来查看所有本地变量(local variables)。

环境变量和本地变量的区别:
1、环境变量可用于所有子进程,可以包括编辑器、脚本和其他应用程序。
2、本地变量在用户现在的shell生命期的脚本中使用。只在用户当前shell生命期有意义,如果在shell中启动另一个进程此值将无效,也就是本地变量不会传递到子进程中去。

一般来说,set的输出会比env的输出多,在Ubuntu 12.04中PS1,PS2等都在本地变量中,不要环境变量中。

Tips 1: 可以用readonly命令设置环境变量或本地变量为只读。
Tips 2: 可以用unset命令来清除环境变量或本地变量。

12 expand和unexpand(空格和tab互转)

expand 命令将制表符变成空格。unexpand 将空格变成制表符。
这两个命令都接受stdin输入以及命令行指定文件的输入。使用-t选项可以设置一个或多个制表符停止位。

13 expect

Expect is a tool for automating interactive applications such as telnet, ftp, passwd, fsck, rlogin, tip, etc.

Following three expect commands are used when automating any interactive processes.

  • send – to send the strings to the process
  • expect – wait for the specific string from the process
  • spawn – to start the command

参考:
6 Expect Script Examples: http://www.thegeekstuff.com/2010/10/expect-examples/
expect学习笔记及实例详解:http://blog.itpub.net/27042095/viewspace-745589/

13.1 输出debug信息

文件第一行加个-d

#!/usr/bin/expect -d

13.2 访问环境变量

Expect is an extension of Tcl. Tcl access enviroment variables via the global env array:
如访问PATH变量: $env(PATH)

参考:http://stackoverflow.com/questions/12695474/how-to-access-environment-variables-in-an-expect-script

13.3 实例:和scp交互

$ cat getfile.exp
#!/bin/expect -f
set timeout -1

set ip [lindex $argv 0]
set user [lindex $argv 1]
set password [lindex $argv 2]

set remotefile [lindex $argv 3]
set localfile [lindex $argv 4]

spawn scp $user@$ip:$remotefile $localfile
expect {
"*yes/no" { send "yes\r"; exp_continue}
"*password:" { send "$password\r" }
}

expect eof
# expect eof在此的作用是在命令scp的输出中搜索文件结束符。
# http://bbs.chinaunix.net/thread-1859692-2-1.html

14 fc-list和fc-cache

列出当前系统中所有可用字体:

$ fc-list

更新字体,重新建立缓存:

$ fc-cache -fv

注1,字体的配置文件:

/etc/fonts/fonts.conf

注2,默认字体位置:

/usr/share/fonts
/usr/local/share/fonts
/home/<username>/.fonts

14.1 实例:列出系统中所有的中文字体

使用命令 fc-list :lang=zh 可以列出系统中所有的中文字体,如:

$ fc-list :lang=zh        # 列出系统中所有的中文字体
/usr/share/fonts/wqy-microhei/wqy-microhei.ttc: WenQuanYi Micro Hei Mono,文泉驛等寬微米黑,文泉驿等宽微米黑:style=Regular
/usr/share/fonts/wqy-zenhei/wqy-zenhei.ttc: WenQuanYi Zen Hei Sharp,文泉驛點陣正黑,文泉驿点阵正黑:style=Regular
/usr/share/fonts/wqy-microhei/wqy-microhei.ttc: WenQuanYi Micro Hei,文泉驛微米黑,文泉驿微米黑:style=Regular
/usr/share/fonts/cjkuni-uming/uming.ttc: AR PL UMing TW MBE:style=Light
/usr/share/fonts/wqy-zenhei/wqy-zenhei.ttc: WenQuanYi Zen Hei Mono,文泉驛等寬正黑,文泉驿等宽正黑:style=Regular
/usr/share/fonts/wqy-zenhei/wqy-zenhei.ttc: WenQuanYi Zen Hei,文泉驛正黑,文泉驿正黑:style=Regular
/usr/share/fonts/cjkuni-uming/uming.ttc: AR PL UMing TW:style=Light
/usr/share/fonts/cjkuni-uming/uming.ttc: AR PL UMing HK:style=Light
/usr/share/fonts/cjkuni-uming/uming.ttc: AR PL UMing CN:style=Light

15 fcrackzip(zip密码破解)

fcrackzip, a fast/free zip password cracker.

参考:
Linux下用fcrackzip破解zip密码:http://longxiaz.blog.163.com/blog/static/131452420201282844545197/

16 fdupes(按md5值删除重复文件)

Debian系统中可以这样安装:

$ sudo apt-get install fdupes

16.1 实例:删除当前文件夹下重复文件

删除当前文件夹中的相同文件,遇到相同文件时提示保留哪些文件:

$ fdupes -d .

删除当前文件夹中的相同文件,不提示用户选择,直接仅保留第一个文件:

$ fdupes -d -N .

17 ffmpeg(音频视频编辑)

FFmpeg is a free software project that produces libraries and programs for handling multimedia data.

参考:
man for ffmpeg: http://ffmpeg.org/ffmpeg.html

17.1 ffmpeg实例

下面内容摘自:“玩转FFmpeg的7个小技巧” http://wowubuntu.com/7-tricks-with-ffmpeg.html

1 音频转换

$ ffmpeg -i my_audio.wav my_audio.mp3

-i 后为要转换的音频文件,my_audio.mp3为目的音频文件。

2 视频转换

$ ffmpeg -i my_video.mpeg -s 500×500 my_video.flv

-i 后为源视频文件,-s 表示设置目标视频文件的分辨率,my_video.flv为目的视频文件。

3 从视频中截取图片

$ ffmpeg -i test.mpg image%d.jpg

默认1s截取25张图片,可以通过-r设置每秒截取的图片数量

4 从视频中采集音频

$ ffmpeg -i video.avi -f mp3 audio.mp3

-f 强制选择格式

用下面命令也可从视频中采集音频:

$ ffmpeg -i video.avi -vn audio.mp3

-vn 取消截取视频(也就是只输出音频文件)

5 创建截屏视频

$ ffmpeg -f x11grab -r 25 -s wxga -i :0.0 /tmp/outputFile.mpg

0.0 是你X11 server的屏幕显示号吗,和DISPLAY一样样的.
此条命令以每秒25帧的速率来截取wxga屏幕视频,当然这里可以用-s 来设置视频分辨率,输出文件是/tmp/outputFile.mpg

6 用图片制作视频

$ ffmpeg -f image2 -i img%d.jpg /tmp/a.mpg

将'img001.jpg', 'img002.jpg'这种顺序排列的图片文件转制作为视频

7 从webcam中截取视频

$ ffmpeg -f video4linux2 -s 320x240 -i /dev/video0 out.mpg

同时截取音频和视频:

$ ffmpeg -f oss -i /dev/dsp -f video4linux2 -s 320x240 -i /dev/video0 out.mpg 

/dev/video0为视频设备 /dev/dsp为音频设备

18 find

18.1 实例:查找多种后缀的文件

如查找以pl和pm为后缀的文件:

$ find . -name "*.pl" -o -name "*.pm"
$ find . -regex ".*\.\(pl\|pm\)"

第一种方法利用了选项-o(含义为“或者”),写法比较直观。
第二种方法利用正则表达式,但需要很多转义,比较麻烦。

注意:删除以pl和pm为后缀的文件,下面方法不可行!

$ find . -name "*.pl" -o -name "*.pm" -print0 |xargs -0 rm    # Wrong!

这个命令只会删除pm为后缀的文件,正确的命令是:

$ find . \( -name "*.pm" -o -name "*.pl" \) -print0 |xargs -0 rm

注意,左括号和右括号都要进行转义,且左括号的右一个字符和右括号的左一个字符必须是空格。
也可以是下面命令:

find . -name "*.pl" -print0 -o -name "*.pm" -print0 |xargs -0 rm

18.2 实例:查找文件夹软链接中的文件

假设B是目录A的链接,默认 find B -name 1.txt 并不会去A文件夹中查找文件1.txt。
要使用 -L 才会查找文件夹软链接中的文件,如:

$ find -L B -name 1.txt

18.3 实例:按大小查找文件

查找大于100M的文件:

$ find . -size +100M

18.4 实例:按权限查找文件

查找权限为777的文件:

$ find . -perm 777

18.5 实例:查找4天内修改过的文件

查找当前目录中4天内修改过的文件:

$ find . -mtime -4

特别注意:-mtime参数中4和+4意义完全不一样!

atime 最后一次访问时间, 如ls, more等, 但chmod, chown, ls, stat等不会修改些时间, 使用ls -utl可以按此时间顺序查看;
ctime 最后一次状态修改时间, 如chmod, chown等状态时间改变但修改时间不会改变,使用 stat file可以查看;
mtime 最后一次内容修改时间,如vi保存后等,修改时间发生改变的话,atime和ctime也相应跟着发生改变。
注意:linux里是不会记录文件的创建时间的,除非这个文件自创建以来没有发生改变,那么它的创建时间就是它的最后一次修改时间。

18.6 实例:查找无效的软链接(目标不存在的软链接)

$ find . -L -type l

18.7 实例:find后接-exec选项

find后接-exec选项,可对找到的文件执行相应的命令。如:

$ find . -name "*.txt" -exec cat {} \;

说明1: {} 是一个占位符,会被正在处理的符合条件的文件名替代。
说明2:在shell中运行时,分号前一定要用反斜线转义,因为find需要得到这个分号来知道-exec的结束,如果不转义,分号会被shell吃掉!

如果find . -name "*.txt"能得到下面文件:
H1.txt
H2.txt
H3.txt
则find . -exec cat {} \;相当于
cat H1.txt
cat H2.txt
cat H3.txt

这个用法有两个缺点:
缺点1. 它有性能问题,对找到的每个文件都执行一遍命令!如果find找到1000个文件,则会执行-exec后的命令1000遍。
缺点2. 它可能有安全问题,因为-exec后命令执行的“启动目录”就是运行find命令的目录。

对缺点1进行改进:
用+标记命令结束,这样可以一次提交所有找到的文件

$ find . -name "*.txt" -exec cat {} +

以前面例子为例,上面命令相当于:
cat H1.txt H2.txt H3.txt

对缺点2进行改进:
用execdir代替exec
Like -exec, but the specified command is run from the subdirectory containing the matched file

$ find . -name "*.txt" -execdir cat {} \;

18.7.1 xargs和-exec选项比较

用xargs和find配合,也可以实现find加-exec选项的功能。
前面的实例可以用xargs实现:

$ find . -name "*.txt" |xargs cat

选项-exec有性能问题,尽管这个问题已经被解决(通过使用加号+来一次提交所有文件),但它只在较新的系统上才能使用。

19 fold(超过指定列数后换行)

fold 默认限制每行最多显示80列,超过部分换行显示。

-w选项:设置每行最多显示的列数。
-s选项:在空格处断开。

实例:

$ cat file1
123456789abc
123 456 789
$ fold -w3 file1
123
456
789
abc
123
 45
6 7
89
$ fold -sw3 file1
123
456
789
abc
123

456

789

20 fuser(找出使用文件的进程)

fuser 显示使用指定文件或者文件系统的进程的pid ,默认会在每个pid后面加上一个字符表示访问的方式。

字符代表的访问方式的含义如下:
c :表示 current directory,表示该目录是进程的当前目录;
e :表示是可执行的程序;
f :打开文件。默认不显示;
F:打开文件(以写方式打开),默认不显示;
r :root 目录,表示该目录是该进程的root目录(如果不明白,可以查看chroot命令);
m:表示 mmap 过的文件或者共享库。

常用选项:
-u:表示在进程pid后加上对应用户名;
-v:详细地显示信息;
-m:测试文件所在的文件系统;
-k:杀死找到的相关进程,除非使用-signal修改信号,否则将发送SIGKILL信号。

参考:
Linux调试工具fuser的深入分析:http://home.lupaworld.com/home-space-uid-56821-do-blog-id-232572.html

20.1 实例:查找谁在使用vim

$ sudo fuser -uv /usr/bin/vim
                     USER        PID ACCESS COMMAND
/usr/bin/vim:        user1      1979 ...e. (user1)vim
                     user2      9768 ...e. (user2)vim
                     user3      9838 ...e. (user3)vim

说明:用其它方法也可以找到谁在使用vim,但用fuser可以精确地找到使用/usr/bin/vim(而不是/usr/vim或其它)的进程。

20.2 实例:解决无法umout光驱的问题

找到使用光驱的进程,再kill即可。

$ fuser -uvm /mnt/cdrom

20.3 实例:看有哪些程序正在使用libc.so.6

首先找到本机libc.so.6的位置,随便ldd一个程序即可,如ldd /bin/cat,可以找出本机libc.so.6的位置。

再用fuser查看有哪些程序正在使用libc.so.6,如:

$ fuser -uv /lib64/libc.so.6
                     USER        PID ACCESS COMMAND
/lib64/libc.so.6:    user1      3975 ....m (user1)bash
                     user1     12974 ....m (user1)sleep

21 getconf

我们时常需要查询系统相关的信息,比如页面大小,整数大小之类,如果编写程序去计算会比较繁琐。

有一个很有用的命令,可以用来获取系统相关信息。它就是getconf。

$ getconf PAGE_SIZE
4096
$ getconf INT_MAX
2147483647

显示所有可配置项及其当前值:

$ getconf -a

22 graphviz

Graphviz is open source graph visualization software.

参考:
官方例子的中文版:http://www.cnblogs.com/sld666666/archive/2010/06/25/1765510.html
用 Graphviz 可视化函数调用:http://www.ibm.com/developerworks/cn/linux/l-graphvis/
布局方式:http://www.iteye.com/topic/433278

22.1 DOT Language

The following is an abstract grammar defining the DOT language. Terminals are shown in bold font and nonterminals in italics. Literal characters are given in single quotes. Parentheses ( and ) indicate grouping when needed. Square brackets [ and ] enclose optional items. Vertical bars | separate alternatives.

     graph : [ strict ] (graph | digraph) [ ID ] '{' stmt_list '}'
 stmt_list : [ stmt [ ';' ] stmt_list ]
      stmt : node_stmt
           | edge_stmt
           | attr_stmt
           | ID '=' ID
           | subgraph
 attr_stmt : (graph | node | edge) attr_list
 attr_list : '[' [ a_list ] ']' [ attr_list ]
    a_list : ID '=' ID [ (';' | ',') ] [ a_list ]
 edge_stmt : (node_id | subgraph) edgeRHS [ attr_list ]
   edgeRHS : edgeop (node_id | subgraph) [ edgeRHS ]
 node_stmt : node_id [ attr_list ]
   node_id : ID [ port ]
      port : ':' ID [ ':' compass_pt ]
           | ':' compass_pt
  subgraph : [ subgraph [ ID ] ] '{' stmt_list '}'
compass_pt : (n | ne | e | se | s | sw | w | nw | c | _)

The keywords node, edge, graph, digraph, subgraph, and strict are case-independent. Note also that the allowed compass point values are not keywords, so these strings can be used elsewhere as ordinary identifiers and, conversely, the parser will actually accept any identifier.

参考:http://www.graphviz.org/content/dot-language

22.2 dot命令

dot 一般用于绘制有向图,无向图则可用 neato 或者 fdp,可以互相通用,差别在于 dot 生成的有向图效果要好点, neato 和 fdp 生成的无向图效果要好点。其他的如辐射状的图形可用 twopi,圆形的可用 circo。它们的命令行参数都是一致的,只是所用的算法不一而已。

实例:无向图(graph)

$ cat example1.dot
graph example1 {
Server1 -- Server2
Server2 -- Server3
Server3 -- Server1
}
$ dot -Tpng  example1.dot  -o dot_example1.png

生成的图片dot_example1.png如图 1 所示。

dot_example1.png

Figure 1: dot绘制无向图

实例:有向图(digraph)

$ cat example2.dot
digraph example1 {
Server1 -> Server2
Server2 -> Server3
Server3 -> Server1
}
$ dot -Tpng  example2.dot  -o dot_example2.png

生成的图片dot_example2.png如图 2 所示。

dot_example2.png

Figure 2: dot绘制有向图

23 grep系列

grep 用来在文件中查找信息。

基本用法:

$ grep pattern files

23.1 grep支持三种正则表达式

基本的正则表达式,扩展的正则表达式,perl兼容的正则表达式。
这分别可以通过选项 -G, -E, -P 来指定grep使用哪种正则表达式(默认地,grep使用基本的正则表达式,也就是说grep相当于grep -G)。

三种正则表达式的区别:
对于“perl兼容的正则表达式”,可以通过man pcrepattern(比较全面), man pcresyntax(仅是摘要)得到,这里不介绍。
对于基本的正则表达式,?, +, {, |, (, )仅是表达其相应的字面字符,如果要表达其特殊的含义必须对其进行转义(不过需要说明的是:?和+不被基本的正则表达式支持)。
对于扩展的正则表达式,直接支持?, +, {, |, (, )的特殊含义。

例:在文件test.txt中查找a或b。

$ grep "a\|b" <test.txt     ## grep "a|b" <test.txt 会直接查找a|b,而不是查找a或b。
$ grep -E "a|b" <test.txt   ## 相当于egrep "a|b" <test.txt。

23.2 egrep

egrep使用扩展的正则表达式,相当于 grep -E

23.3 fgrep

固化表达式的搜索,取消所有的转义,特殊字符串一般化。相当于grep -F(f是fixed的含义)。

$ fgrep '$PATH..[a-z]' <test.txt
$ grep -F '$PATH..[a-z]' <test.txt      ## 和上面相同

将会找到test.txt中的字符串"$PATH..[a-z]"
注意:如果用双引号的会$PATH会做变量展开。

23.4 rgrep

在目录中查找,相当于 grep -d recursegrep -r

rgrep实例:
在/home/user1目录(包括其子目录)的所有文件中查找a或b。

$ rgrep "a\|b" /home/user1/
$ grep -d recurse "a\|b" /home/user1/    ## 和上面相同
$ grep -r "a\|b"  /home/user1/           ## 和上面相同

23.5 标记单词的边界

我们知道^和$分别表示一行的开头和结束。怎么表示一个单词的开头和结束呢?
\<\> 即可表示单词的开头和结束。

如:在当前目录的所有文件中查找单词jack:

$ grep "\<jack\>" *

注意:\<jack\>要加上单引号或双引号。

23.6 -w(–word-regexp)选项(精确匹配单词)

–word-regexp用于精确匹配单词。如匹配is时,this,kiss等都不会被匹配。

23.7 -a(–text)选项(强制当作文本文件)

有时grep会误把文本文件当前binary文件。
这样如果找到配置,只会显示下面内容。
Binary file file1 matches

要强制grep把文件当作文本文件,可以指定-a或–text选项。

$ grep -a pattern file1

23.8 -l和-L选项(仅列出匹配或不匹配的文件名)

$ grep -l pattern files      ## 只列出匹配的文件名
$ grep -L pattern files      ## 列出不匹配的文件名

23.9 -Z选项(以NUL字符代替换行符)

-Z选项的含义是输出时以NUL字符代替换行符。它和find的-print0,perl的-0以及sort的-z选项类似。

说明:-Z选项常和-l或-L连用。

23.10 zgrep,zegrep,zfgrep

用zgrep,zegrep,zfgrep可在gzip文件中查找(省去了先解压)。

23.11 bzgrep,bzegrep,bzfgrep

用bzgrep,bzegrep,bzfgrep可在bzip2文件中查找(省去了先解压)。

24 grub-install和update-grub

grub stands for GRand Unified Bootloader

24.1 用live cd修复grub

注:下文讨论的是grub 1.99(Ubuntu 12.04默认安装这个版本的grub)

进入live cd后:

步骤1:进入sudo模式

$ sudo -i

步骤2:查看分区情况

$ fdisk -l

步骤3:挂载分区

$ mount  /dev/sdXX  /mnt

把系统“安装分区”/dev/sdXX挂载到/mnt下(/mnt为live cd中的目录)

如果boot分区是独立的,则还要挂载boot分区

$ mount /dev/sdYY  /mnt/boot

步骤4:挂载live cd中的/dev目录到“安装分区”的相应位置

$ mount  --bind  /dev  /mnt/dev

注:把live cd中的/dev目录挂载到/mnt/dev(注意:/mnt是“安装分区”的挂载处)

步骤5:chroot至系统分区(非常重要)

$ chroot  /mnt

注:步骤3时把系统分区挂载到了/mnt

步骤6:重装grub

$ grub-install  --recheck  /dev/sdX

注意:grub只能安装在磁盘中,而不能安装在磁盘中的某个分区上。因此,grub-install的参数是整个磁盘/dev/sdX,而不是某个分区/dev/sdXX。

步骤7:更新grub

$ update-grub

步骤8:重启机器

参考:http://forum.ubuntu.org.cn/viewtopic.php?t=373208

25 GnuPG

GnuPG(简称GPG)是依照由IETF订定的OpenPGP(RFC4880有描述)技术标准设计,用来代替商业软件PGP。

1、生成密钥

$ gpg --gen-key

在回答一系列问题后,默认生成文件的路径为~/.gnupg/
注:生成的公钥和私钥保存在密钥环里(密钥环包括公钥环pubring.gpg和私钥环secring.gpg,分别用来保存公钥和私钥),如果要把公钥分发给别人,则要从密钥环里把公钥导出,如果要备份私钥,则可从私钥环里把私钥导出。

2、查看所有公钥

$ gpg --list-public-key

或者#gpg -k
把公钥环里保存了的公钥显示出来。

3、查看所有私钥

$ gpg --list-secret-key     # or `gpg -K`

把私钥环里保存了的私钥显示出来。

4、导出公钥(把公钥环里保存的公钥导出来,以便分发给其它用户。)
导出前,先用命令 gpg --list-public-key 查看公钥环里保存有哪些公钥,根据列出的公钥,选择想要导出的公钥进行导出。

$ gpg --armor --export XXXX > file1.asc

说明1:–armor,使导出的文件为ASCII编码,和-a作用相同。
说明2:XXXX为公钥环里你想导出的公钥的标识,例如通过 gpg --list-public-key 命令得到类似如下信息:

$ gpg --list-public-key
------------------------
pub   2048R/0F3D17B4 2011-06-23
uid                  user1 <test@sina.com>
sub   2048R/9DCD5E2E 2011-06-23

从上可知,只有一个公钥,当然就只能导出它了。
XXXX可以写为0F3D17B4,也可以写为user1,也可以写为test@sina.com,得到的公钥文件是相同的.

5、导出私钥(把私钥环里保存的私钥导出来,以便备份私钥)

$ gpg --armor --export-secret-keys XXXX > mysecretkey.asc

和导出公钥类似,只是–export换成了–export-secret-keys

6、导入公钥或私钥到密钥环里。
导入私钥和公钥都用下面的命令

$ gpg --import file1.asc

file1.asc是备份密钥的文件(可以为公钥,也可以为私钥)

7、把公钥或私钥从密钥环中删除
这个没试过,查看帮助可得到下面相关信息。

--delete-keys             remove keys from the public keyring
--delete-secret-keys      remove keys from the secret keyring

8、加密文件
用公钥加密文本文件

$ gpg -ea -r user1 123.txt

-e表示加密,-a表示生成ASCII文件。
这里r是收件人的意思,后面加的对方的密钥,对方给我发就因该加我的密钥标识码。
系统默认将生成一个123.txt.asc文件,这个就是用user1的公钥加密后的文件,我们可以把他发给别人。

9、解密文件
用私钥解密加密的文本文件

$ gpg -o 123.txt -d 123.txt.asc

-o 123.txt表示解密后保存为123.txt
-d 123.txt.asc为待解密的文件。
提示输入密码,这个密码是在生成密钥对时自己输入的。(也就是仅有私钥还不能解密文件,还需要知道私钥的密码,这样就算私钥泄漏了,别人也不能解密,但这个密码不复杂的话可以用暴力破解得到)

10、验证签名
一些开源软件,往往带有一个相应的签名文件(常以sig或asc为后缀),如emacs-24.2.tar.xz,相应就有emacs-24.2.tar.xz.sig。

$ gpg --verify emacs-24.2.tar.xz.sig  emacs-24.2.tar.xz

如果签名文件名以sig或asc为后缀,也可只输入签名文件名,它会自动匹配待验证的文件:

$ gpg --verify emacs-24.2.tar.xz.sig

如果公钥环里有签名时的公钥,则会提示gpg: Good signature from "Chong Yidong <cyd@stupidchicken.com>",如果公钥环没有相应公钥则会输出信息:
gpg: Signature made 2012年08月27日 星期一 14时28分56秒 CST using DSA key ID BC40251C
gpg: Can't check signature: public key not found
提示找不到ID为BC40251C的公钥,如何下载?用–recv-keys选项即可,具体操作请看下文。

11、下载公钥
下载ID为BC40251C的公钥:

$ gpg --recv-keys BC40251C

用命令 gpg -k ,查看密钥环可发现多个密钥。

26 hexdump

hexdump 能以16进制显示文件内容。

26.1 实例:同时显示16进制和ASCII值

-C是最常用的选项,以16进制方式显示,并显示对应的ASCII值:

$ hexdump -C file1
00000000  31 32 33 34 35 36 37 38  39 30 71 77 65 72 74 79  |1234567890qwerty|
00000010  75 69 6f 70 61 73 64 66  67 68 6a 6b 6c 7a 78 63  |uiopasdfghjklzxc|
00000020  76 62 6e 6d 0a                                    |vbnm.|
00000025

26.2 实例:不用星号代替相同内容(-v)

默认地,hexdump会用星号代替相同内容:

$ ( echo "abcdefghijklmno"; echo "abcdefghijklmno" ) | hexdump -C
00000000  61 62 63 64 65 66 67 68  69 6a 6b 6c 6d 6e 6f 0a  |abcdefghijklmno.|
*
00000020

加上-v选项,就不会出现*代替相同内容:

$ ( echo "abcdefghijklmno"; echo "abcdefghijklmno" ) | hexdump -v -C
00000000  61 62 63 64 65 66 67 68  69 6a 6b 6c 6d 6e 6f 0a  |abcdefghijklmno.|
00000010  61 62 63 64 65 66 67 68  69 6a 6b 6c 6d 6e 6f 0a  |abcdefghijklmno.|
00000020

26.3 定制输出信息的格式(-e)

The -e argument has 5 parts separated by whitespace.

  1. An optional starting string (in quotes) which is printed beforeeach conversion. In the first example below we are printing x beforeeach hex character ("x").
  2. An interation count which defaults to 1 if not supplied but hasto be supplied if you want a byte count. This tells how many times todo the conversion before we print the end string. So if you weredecoding 4 things, each of 1 byte, you'd say 4/1.
  3. A byte count which is separated from the interation count by a /.I don't think there is a way to specify a byte count without aninteration count. This specifies how many bytes are in each item thatis being decoded.
  4. A sprintf format. The manual is somewhat useful here. Somestandard ones apply and there are _ extensions. In the first examplebelow this is "%02X" which prints each byte as a 2 character, 0prefixed capital hex number.
  5. An optional ending string (in quotes) which is printed after theconversion. A space in the first example below (" ").

实例:

$ echo "1234567890qwertyuiopasdfghjklzxcvbnm" | hexdump -v -e '"[" 16/1 "%2X " "]\n" '
[31 32 33 34 35 36 37 38 39 30 71 77 65 72 74 79]
[75 69 6F 70 61 73 64 66 67 68 6A 6B 6C 7A 78 63]
[76 62 6E 6D  A                                 ]

NOTE: the trailing space in "%2X " format will not be printed at the end of each interation.

参考:
http://zagaeski.devio.us/0006.html
http://256.com/gray/docs/misc/hexdump_manual_how_to.html

27 imagemagick(convert)

Image MagicK 是一个强大的图像处理工具包。它提供了几个非常方便的命令行命令: display, animate, import, montage, mogrify, identify等,可以进行图像的显示,缩放,旋转, 调色,加框,加注释等,还能制作GIF动画,图像索引,能自动生成图像。

Ubuntu系统中可以这样安装:

$ sudo apt-get install imagemagick

27.1 Image Magick工具集

Image Magick包含的工具集如表 4 所示。

Table 4: Image Magick包含的工具集
Image Magick工具 说明
convert 转换图像格式和大小,模糊,裁剪,驱除污点,抖动,临近,图片上画图片,加入新图片,生成缩略图等。
identify 描述一个或较多图像文件的格式和特性。
mogrify 按规定尺寸制作一个图像,模糊,裁剪,抖动等。和convert不同,mogrify会直接覆盖原图片文件。
composite 根据一个图片或多个图片组合生成图片。
montage 创建一些分开的要素图像。在含有要素图像任意的装饰图片,如边框、结构、图片名称等。
compare 在算术上和视觉上评估不同的图片及其它的改造图片。
display 如果你拥有一个X server的系统,它可以按次序的显示图片
animate 利用X server显示动画图片
import 在X server或任何可见的窗口上输出图片文件。 你可以捕获单一窗口,整个的荧屏或任何荧屏的矩形部分。
conjure 解释执行 MSL (Magick Scripting Language) 写的脚本。

27.2 convert

27.2.1 转换图像的格式

转换命令对一幅图像执行某项操作,并将其以你指定的名字保存。你能使用它完成的一个最基本的事情是转换你的图像到各种其他的格式。下面的命令将当前目录下的一个叫“howtogeek.png”的PNG文件转换为一个JPEG文件。

$ convert howtogeek.png howtogeek.jpg

你还可以指定JPEG格式图像的压缩级别:

$ convert howtogeek.png -quality 95 howtogeek.jpg

这个数字的必须在1到100之间。在没有指定的情况下,ImageMagick使用原始图像的质量等级(quality level),否则的话ImageMagick取92作为其默认值。

27.2.2 缩放图像

转换命令还可以便捷地调整一幅图像的大小。下面的命令指示ImageMagick将一幅图像调整为200像素宽,100像素高。

$ convert example.png -resize 200×100 example.png

在这个命令里面,我们对输入和输出使用了相同的文件名,这样ImageMagick将会覆盖掉原始文件。

在使用这个命令的时候,ImageMagick会尽量保持图像的纵横比。它将会调整图像以适应200×100的区域,这样图像就不是恰好200×100了。如果你想要强制把图像设置为指定的大小——即使这样做会改变图像的纵横比的话——那么在尺寸参数后面加一个叹号就可以了。

$ convert example.png -resize 200×100! example.png

你还可以只指定特定的宽度或者高度,ImageMagick会在保持纵横比的情况下进行缩放。下面的命令将把一幅图像的宽度缩放为200像素宽:

$ convert example.png -resize 200 example.png

下面的命令会把一幅图像缩放为100像素高:

$ convert example.png -resize x100 example.png

27.2.3 旋转图像

ImageMagick能够快速地旋转图像。下面的命令将一幅叫做“howtogeek.jpg”的图像旋转90度,并将旋转后的图像保存为“howtogeek-rotated.jpg”:

$ convert howtogeek.jpg -rotate 90 howtogeek-rotated.jpg

如果你指定了相同的文件名的话,ImageMagick将会用旋转过的图像覆盖掉原始图像。

27.2.4 转为灰度格式

使用选项 -colorspace Gray 可以把图片转为灰度格式。如:

$ convert source.png -colorspace Gray destination.png
$ mogrify -colorspace Gray source.png                  # 同上,不过它是“原地修改”

28 info

info可查看命令的帮助信息。

28.1 加入自己的info文件

编辑配置文件/usr/share/info/dir
按照已有的格式,在文件的最后加入下面内容:

 My-Info
 * Latex-Manual: (/home/user1/info/latex-manual).      Latex Manual.

29 inkscape(矢量图形编辑软件)

Inkscape 是开源的矢量图形编辑软件。可以直接在命令行中使用它。

实例1,转换svg文件为png文件:

$ inkscape -f FILENAME.svg -e FILENAME.png

实例2,转换svg文件为pdf文件:

$ inkscape -f FILENAME.svg -A FILENAME.pdf

实例3,转换pdf文件为svg文件:

$ inkscape -f FILENAME.pdf -l FILENAME.svg
$ inkscape --file=FILENAME.pdf --export-plain-svg=FILENAME.svg   #和上面命令相同。

要查看帮助,可以使用命令 inkscape --help ,如:

$ inkscape --help
Usage: inkscape-bin [OPTIONS...] [FILE...]

Available options:
  -V, --version                             Print the Inkscape version number
  -z, --without-gui                         Do not use X server (only process
                                            files from console)
  -g, --with-gui                            Try to use X server (even if
                                            $DISPLAY is not set)
  -f, --file=FILENAME                       Open specified document(s) (option
                                            string may be excluded)
  -p, --print=FILENAME                      Print document(s) to specified
                                            output file (use '| program' for
                                            pipe)
  -e, --export-png=FILENAME                 Export document to a PNG file
  -d, --export-dpi=DPI                      Resolution for exporting to bitmap
                                            and for rasterization of filters
                                            in PS/EPS/PDF (default 90)
  -a, --export-area=x0:y0:x1:y1             Exported area in SVG user units
                                            (default is the page; 0,0 is
                                            lower-left corner)
  -D, --export-area-drawing                 Exported area is the entire
                                            drawing (not page)
  -C, --export-area-page                    Exported area is the entire page
      --export-margin=VALUE                 Only for PS/EPS/PDF, sets margin
                                            in mm around exported area
                                            (default 0)
      --export-area-snap                    Snap the bitmap export area
                                            outwards to the nearest integer
                                            values (in SVG user units)
  -w, --export-width=WIDTH                  The width of exported bitmap in
                                            pixels (overrides export-dpi)
  -h, --export-height=HEIGHT                The height of exported bitmap in
                                            pixels (overrides export-dpi)
  -i, --export-id=ID                        The ID of the object to export
  -j, --export-id-only                      Export just the object with
                                            export-id, hide all others (only
                                            with export-id)
  -t, --export-use-hints                    Use stored filename and DPI hints
                                            when exporting (only with
                                            export-id)
  -b, --export-background=COLOR             Background color of exported
                                            bitmap (any SVG-supported color
                                            string)
  -y, --export-background-opacity=VALUE     Background opacity of exported
                                            bitmap (either 0.0 to 1.0, or 1 to
                                            255)
  -l, --export-plain-svg=FILENAME           Export document to plain SVG file
                                            (no sodipodi or inkscape
                                            namespaces)
  -P, --export-ps=FILENAME                  Export document to a PS file
  -E, --export-eps=FILENAME                 Export document to an EPS file
      --export-ps-level=PS Level            Choose the PostScript Level used
                                            to export. Possible choices are 2
                                            (the default) and 3
  -A, --export-pdf=FILENAME                 Export document to a PDF file
      --export-pdf-version=PDF_VERSION      Export PDF to given version.
                                            (hint: make sure to input the
                                            exact string found in the PDF
                                            export dialog, e.g. "PDF 1.4"
                                            which is PDF-a conformant)
      --export-latex                        Export PDF/PS/EPS without text.
                                            Besides the PDF/PS/EPS, a LaTeX
                                            file is exported, putting the text
                                            on top of the PDF/PS/EPS file.
                                            Include the result in LaTeX like:
                                            \input{latexfile.tex}
  -M, --export-emf=FILENAME                 Export document to an Enhanced
                                            Metafile (EMF) File
  -m, --export-wmf=FILENAME                 Export document to a Windows
                                            Metafile (WMF) File
  -T, --export-text-to-path                 Convert text object to paths on
                                            export (PS, EPS, PDF, SVG)
      --export-ignore-filters               Render filtered objects without
                                            filters, instead of rasterizing
                                            (PS, EPS, PDF)
  -X, --query-x                             Query the X coordinate of the
                                            drawing or, if specified, of the
                                            object with --query-id
  -Y, --query-y                             Query the Y coordinate of the
                                            drawing or, if specified, of the
                                            object with --query-id
  -W, --query-width                         Query the width of the drawing or,
                                            if specified, of the object with
                                            --query-id
  -H, --query-height                        Query the height of the drawing
                                            or, if specified, of the object
                                            with --query-id
  -S, --query-all                           List id,x,y,w,h for all objects
  -I, --query-id=ID                         The ID of the object whose
                                            dimensions are queried
  -x, --extension-directory                 Print out the extension directory
                                            and exit
      --vacuum-defs                         Remove unused definitions from the
                                            defs section(s) of the document
      --verb-list                           List the IDs of all the verbs in
                                            Inkscape
      --verb=VERB-ID                        Verb to call when Inkscape opens.
      --select=OBJECT-ID                    Object ID to select when Inkscape
                                            opens.
      --shell                               Start Inkscape in interactive
                                            shell mode.

Help options:
  -?, --help                                Show this help message
      --usage                               Display brief usage message

参考:http://how-to.wikia.com/wiki/How_to_use_Inkscape_in_commandline_mode

30 ip(iproute2)和ifconfig

Linux的ip命令和ifconfig类似,但前者功能更强大,并旨在取代后者。
ifconfig是net-tools中已被废弃使用的一个命令,许多年前就已经没有维护了。
ip是iproute2套件里的工具之一。

Table 5: net-tools vs. iproute2
net-tools iproute2
ifconfig ip l (ip link)
ifconfig -a ip a show (ip address show)
ifconfig eth0 up ip link set eth0 up
netstat ss
netstat -i ip -s link
netstat -l ss -l
netstat -r ip r (ip route)
route [add or del] ip route [add or del]
route -n ip route show
arp -n ip n (ip neighbor)

参考:http://www.linuxeden.com/html/softuse/20140604/152339.html

31 ipcs

ipcs用于查看系统System V IPC(或称XSI IPC)资源的使用情况。

不带任何参数:ipcs,相当于:ipcs -a
仅查看共享内存:ipcs -m
仅查看信号量:ipcs -s
仅查看消息队列:ipcs -q

31.1 显示进程id(-p选项)

ipcs -p option displays creator id, and process id which accessed the corresponding ipc facility very recently.

31.2 显示详细信息(-i选项)

Detailed information about an IPC facility (-i option)
ipcs -i option provides detailed information about an ipc facility.

$ ipcs -q -i 32768
Message Queue msqid=32768
uid=0   gid=0   cuid=0  cgid=0  mode=0644
cbytes=0        qbytes=65536    qnum=0  lspid=0 lrpid=0
send_time=Not set
rcv_time=Not set
change_time=Thu Aug  5 13:30:22 2010

Option -i with -q provides information about a particular message queue. Option -i with -s provides semaphore details. Option -i with -m provides details about a shared memory.

参考:http://www.thegeekstuff.com/2010/08/ipcs-command-examples/

31.3 如何找到关联到共享内存的进程

Q: How do I determine what process is attached to a shared memory segment?

awagner@tree:/home/awagner$ ipcs -m
------ Shared Memory Segments --------
key shmid owner perms bytes nattch status
0x00000000 0 root 777 102400 1
0x00000000 32769 root 774 96 1 dest
0x00000000 98306 awagner 600 393216 2 dest
0x00000000 131075 awagner 600 393216 2 dest

how do I figure out which two processes are attached to segment 98305?

说明:nattch列的数字表示这个共享内存的连接数目,status列,如果显示dest则表示共享内存段已经被删除,但仍然有程序连接着它。

如何找到关联到共享内存的进程?没有标准的方法,请参考:http://stackoverflow.com/questions/5658568/how-to-list-processes-attached-to-a-shared-memory-segment-in-linux

32 join

join用于将两个文件中指定列(默认为第1列)相同的行连接起来。

实例:

$ cat file1
aa 1 2
bb 2 3
xx 4 6

$ cat file2
aa 2 1
bb 8 2
ff 2 4
xx 4 4

$ join file1 file2
aa 1 2 2 1
bb 2 3 8 2
xx 4 6 4 4

32.1 Tips:join多个文件

join只能操作两个文件,如何join多个文件?

$ join file1 file2 | join - file3 | join - file4

参考:http://jjuanxi.blog.163.com/blog/static/17527419720121954756361/

33 Kazam(屏幕录制软件)

Kazam provides a well designed and easy to use interface for capturing screencasts and screenshots. It can record desktop video and multiple audio streams simultaneously with control over audio levels and the screen region being captured.

$ sudo apt-get install Kazam

34 lftp

lftp是一个非常好用的ftp客户端工具。它支持自动补全和历史命令,还支持bt下载。

下载目录:

lftp :~> mirror dir1
lftp :~> mirror --parallel=10 dir1    # 同时下载10个文件(多线程方式)

上传目录:

lftp :~> mirror -R dir

用ascii方式上传文件:

lftp :~> put -a file

清除缓存,刷新文件列表:

lftp :~> rels

注:当服务器上的文件有修改时,ls命令不会马上刷新,这时rels就很有用了。

34.1 多线程下载某个文件

lftp :~> pget -c -n 10 http://download.jboss.org/jbossas/7.1/jboss-as-7.1.1.Final/jboss-as-7.1.1.Final.tar.gz

34.2 同时下载一个目录中的多个文件(–parallel=n)

下面例子将同时下载目录RemoteDir中的10个文件:

lftp :~> mirror --parallel=10 RemoteDir

也可以把每个文件分为5块同时下载(需要服务器支持):

lftp :~> mirror --parallel=10 --use-pget-n=5 RemoteDir

34.3 Tips:解决中文乱码

在用lftp访问国内一些ftp服务器时,往往看到的中文是乱码。这是由于服务器和本地编码不一致造成的。我们只要在主目录下新建一个文件~/.lftprc或者~/.lftp/rc
并在其中加入以下内容:

set ftp:charset GBK     # 解决lftp的目ls时,目录名和文件名的显示乱码问题
set file:charset UTF-8  # 解决下载后的文件名乱码问题

34.4 Tips:查看服务器错误信息

lftp 缺省不会显示 ftp 服务器的欢迎信息和错误信息,这在很多时候不方便,因为你有可能想知道这个服务器到底是因为没开机连不上,还是连接数已满。如果是这样,你可以在 ~/.lftp/rc 里写入一行

debug 3

就可以看到出错信息了。

35 ls

ls 列出目录中内容。

常用的排序选项:
-X 按扩展名排序;
-S 按大小排序;
-t 按修改时间排序;
–group-directories-first 目录优先,即先列出目录,再列出文件;
-r 和其它排序选项配合,可以反转结果;

–group-directories-first好用,但太长不好输入,如果所有文件夹名字中都没有后缀(也就是说点字符没有出现在文件夹中),-X选项也往往符合你的期待。

35.1 实例:仅显示隐藏的文件和文件夹(以点开头)

$ ls -d .*

-d选项的含义是如果是目录则只显示目录名,而不显示其内容。

35.2 实例:直观地显示文件的类型

$ ls -F
1.txt     Documents/  Music/     Public/     test/
Desktop/  Downloads/  Pictures/  Templates/  Videos/

-F选项能够在每个文件名后附上一个字符以说明该文件的类型,“*”表示可执行的文件;“/”表示目录;“@”表示符号链接;“|”表示FIFOs;“=”表示sockets。

35.3 ls -l输出的第2列数字的含义

$ ls -l
total 36
-rw-r--r-- 1 cig01 cig01    0 Nov 21 11:19 1.txt
drwxr-xr-x 2 cig01 cig01 4096 Jul 26 09:37 Desktop
drwxr-xr-x 2 cig01 cig01 4096 Jul  4 14:54 Documents
drwxr-xr-x 3 cig01 cig01 4096 Sep 26 21:58 Downloads
drwxr-xr-x 2 cig01 cig01 4096 Jul  4 14:54 Music
drwxr-xr-x 2 cig01 cig01 4096 Jul  4 14:54 Pictures
drwxr-xr-x 2 cig01 cig01 4096 Jul  4 14:54 Public
drwxr-xr-x 2 cig01 cig01 4096 Jul  4 14:54 Templates
drwxr-xr-x 6 cig01 cig01 4096 Nov  6 22:24 test
drwxr-xr-x 2 cig01 cig01 4096 Jul  4 14:54 Videos

上面输出的第2列表示的是包含硬链接的数量!
对于目录,表示其子目录数(包含两个特殊目录:当前目录'.'和父目录'..'),如果仅算常规子目录的话就要减去2。
如:

$ mkdir -p dir1/sub1
$ mkdir -p dir1/sub2
$ mkdir -p dir1/sub3
$ ls -l
total 40
-rw-r--r-- 1 cig01 cig01    0 Nov 21 11:19 1.txt
drwxr-xr-x 2 cig01 cig01 4096 Jul 26 09:37 Desktop
drwxr-xr-x 5 cig01 cig01 4096 Nov 21 11:37 dir1              # 第2列显示为5,说明这个目录包含5-2个常规子目录
drwxr-xr-x 2 cig01 cig01 4096 Jul  4 14:54 Documents
drwxr-xr-x 3 cig01 cig01 4096 Nov 21 11:35 Downloads
drwxr-xr-x 2 cig01 cig01 4096 Jul  4 14:54 Music
drwxr-xr-x 2 cig01 cig01 4096 Jul  4 14:54 Pictures
drwxr-xr-x 2 cig01 cig01 4096 Jul  4 14:54 Public
drwxr-xr-x 2 cig01 cig01 4096 Jul  4 14:54 Templates
drwxr-xr-x 6 cig01 cig01 4096 Nov  6 22:24 test
drwxr-xr-x 2 cig01 cig01 4096 Jul  4 14:54 Videos

参考:info ls

35.4 改变ls时文件夹显示的颜色

默认文件夹显示为蓝色,对比度不高,ssh连接远程主机后,很难看清楚,如何修改它的颜色?
其实ls时的颜色是通过环境变量LS_COLORS来控制的。
可以通过/etc/DIR_COLORS来配置。
如果不想影响全局配置,可以在~/.dir_colors中设置,也可以在~/.bashrc中设置。

如,下面实例把文件夹颜色改为黄色。
首先生成~/.dir_colors文件

$ cp /etc/DIR_COLORS ~/.dir_colors

编辑文件 ~/.dir_colors,做下面修改:
DIR 01;34 # directory
–>
DIR 01;33 # directory

参考:
http://serverfault.com/questions/463784/changing-colors-of-files-dirs-in-linux-ls
文件/etc/DIR_COLORS中,那些数字的含义:
http://www.bigsoft.co.uk/blog/index.php/2008/04/11/configuring-ls_colors
http://blog.twistedcode.org/2008/04/lscolors-explained.html

说明:文件/etc/DIR_COLORS存在于redhat系列的Linux中,Debian系列Linux中没有这个文件。可用下面命令生成~/.dir_colors文件:

$ dircolors -p >~/.dircolors        # 注:Debian系列Linux中没有这个文件/etc/DIR_COLORS

36 lsof

lsof 是Unix调试的瑞士军刀,某些操作可能需要root权限。

不带任何参数运行lsof会列出所有进程打开的所有文件。

$ lsof

36.1 实例:查找哪个进程在使用某个文件

只需要指定文件的路径,lsof就会列出所有使用这个文件的进程,你也可以列出多个文件,lsof会列出所有使用这些文件的进程。

$ lsof /path/to/file1  /path/to/file2

36.2 实例:查找程序打开的所有文件

列出以apache开头的进程打开的文件:

$ lsof -c apache

也可以指定多个-c参数,如列出所有由apache和python打开的文件:

$ lsof -c apache -c python

列出所有由某个(些)PID对应的进程打开的文件:

$ lsof -p 450,980,333

36.3 实例:列出所有网络连接

lsof的-i选项可以列出所有打开了网络套接字(TCP和UDP)的进程:

$ lsof -i

列出所有TCP网络连接:

$ lsof -i tcp

36.4 实例:找到使用某个端口的进程

列出占用TCP或UDP的25端口的进程:

$ lsof -i :25

也可以找到使用某个tcp端口的进程:

$ lsof -i tcp:80

36.5 实例:找到使用网络的所有进程PID

找到使用网络的所有进程PID:

$ lsof -t -i

其中-t选项输出进程的PID。

37 m4

m4 是一个宏预处理器。
Autoconf中使用m4来得到configure脚本。

m4中的引用字符串是以backtick (`)开始,以single quote (')结束。

定义一个宏的语法是:

define(macro[, expansion])

实例:

$ m4
define(`xxx', `yyy')
Hello xxx world!
⇒Hello yyy world!

37.1 给宏传参数

可以给宏传参数,如:

$ m4
define(`with2args', `The argument are $1 and $2.')
with2args
⇒The argument are  and .
with2args(1,3)
⇒The argument are 1 and 3.

37.2 取消一个宏

可用 undefine 取消一个宏。

37.3 注释和dnl(delete to newline)

注释以#开始,也就是#后面的宏是不会展开的,如:

$ m4
define(`xxx', `yyy')
#xxx
⇒#xxx

xxx不会被展开(原样输出#xxx)。

尽管#后的内容会当作注释,但它仍然会出现在输出中,要想不出现在输出中,应该使用dnl。
dnl会删除它本行之后的内容(包括换行符)。

37.4 管理输出流divert

divert(`1')
This text is diverted.
divert(`0')
⇒
This text is not diverted.
⇒This text is not diverted.
undivert(`1')
⇒
⇒This text is diverted.
⇒

说明:undivert(`1')后,This text is diverted.就显示出来了。

要查阅m4所有内置宏,请参考:m4 maunal 附录C.1 Index for all m4 macros

38 man

man 可以查找命令的帮助文件。

Table 6: man章节代号和说明
代号 说明
1 使用者在shell中可以操作的指令或可执行程序
2 系统调用
3 一些常用的函数(function)与函数库(library),大部分是C的函数库(libc)
4 装置档案的说明,通常在/dev下的档案
5 文件格式和规则
6 游戏及其他
7 惯例与协定等,例如Linux档案系统、网络协定、ASCII code等等的说明
8 系统管理员可用的管理指令
9 跟kernel有关的文件

38.1 根据关键字进行查找(man -k)

man -k keyword 可根据关键字进行查找,相当于命令 apropos keyword

$ man -k printf
asprintf (3)         - print to allocated string
dprintf (3)          - print to a file descriptor
fprintf (3)          - formatted output conversion
fwprintf (3)         - formatted wide-character output conversion
printf (1)           - format and print data
printf (3)           - formatted output conversion
snprintf (3)         - formatted output conversion
sprintf (3)          - formatted output conversion
swprintf (3)         - formatted wide-character output conversion
vasprintf (3)        - print to allocated string
vdprintf (3)         - print to a file descriptor
vfprintf (3)         - formatted output conversion
vfwprintf (3)        - formatted wide-character output conversion
vprintf (3)          - formatted output conversion
vsnprintf (3)        - formatted output conversion
vsprintf (3)         - formatted output conversion
vswprintf (3)        - formatted wide-character output conversion
vwprintf (3)         - formatted wide-character output conversion
wprintf (3)          - formatted wide-character output conversion

38.2 显示所有匹配章节(man -f)

-f 选项可查找所有匹配的章节,相当于 whatis

$ man -f sleep
sleep (3)            - Sleep for the specified number of seconds
sleep (1)            - delay for a specified amount of time

$ whatis sleep
sleep (3)            - Sleep for the specified number of seconds
sleep (1)            - delay for a specified amount of time

-a 选项可显示所有匹配的章节。
默认情况下,会按代号顺序进行搜索,显示最先搜索到的那个,比如,man sleep,只会显示sleep(1)。
如:man -a sleep,会显示所有和sleep有关的文档,即sleep(1)和sleep(3)。
sleep(1)退出后,会提示
–Man– next: sleep(3) [ view (return) | skip (Ctrl-D) | quit (Ctrl-C) ]
接着按回车,又显示了sleep(3)

38.3 显示指定章节

man 后接章节数字可显示指定章节。如:

$ man 3 sleep
$ man 1 sleep

38.4 大小写敏感地搜索

man 使用下面方式(和Emacs类似)来决定是否区分大小写:
1、如果查找关键字全部是小写字母,则不区分大小写;
2、如果查找关键字中含有大写字母,则区分大小写。

参考:https://unix.stackexchange.com/questions/101295/case-insensitive-search-in-man-pages

38.5 指定单词边界

如何在搜索时,指定单词边界?

在Linux中,可以使用 \b 来指定单词边界,如 \bword\b 可以搜索单词“word”。
在Mac(测试版本10.11)中,可以使用 [[:<:]] 来指定单词边界,如 [[:<:]]word[[:<:]] 可以搜索单词“word”。

为什么使用方式不一样呢?这是由于 man 命令默认会调用 less 程序来显示文本, less 的行为在不同平台上不一样。

参考:https://stackoverflow.com/questions/22740476/is-there-a-shortcut-for-word-boundary-in-less

38.6 打印man的输出为pdf文件(-t选项)

先用 man-t 选项输出为ps文件,再用 ps2pdf 输出pdf文件。

$ man -t ascii | ps2pdf - >ascii.pdf

38.7 显示行号

-N 显示行号, -n 取消行号。
注:这两个不是命令行的选项,而是打开 man 后输入的命令。

39 mkisofs和genisoimage

mkisofs可以用来生成ISO文件。
在Ubuntu下,mkisofs只是genisoimage的链接,所以用man mkisofs是没有结果的,要查看帮助文件,可运行man genisoimage。

常用选项
-J 使用Joliet格式,当有中文文件时,建议使用这个选项,这样在Windows下兼容性比较好,一般不会乱码。
-r 使用Rock Ridge格式,这种格式能够保存Linux下文件相关权限等信息。
-V 设置光盘的volume name。

如果光盘中有中文文件名,且要在Windows下使用,则建议使用-J

$ mkisofs -J -o file.iso  dir_to_image/

如果是在Linux下做备份,建议使用-r,这样能保存文件权限。

$ mkisofs -r -o file.iso  dir_to_image/

39.1 ISO光盘文件格式介绍

ISO-9660
ISO-9660是由国际标准化组织在1985年制定的,当前唯一通用的光盘文件系统,任何类型的计算机都支持它,所有的烧录软件也都支持它。而且,若想让所有的CD-ROM都能读取烧录好的光盘,就必须使用ISO 9660或与其兼容的文件系统。

Joliet
Joliet文件系统是扩展文件系统之一,由Microsoft提出和实现。它以ISO9660(1988)标准为基础。

Rock Ridge
针对 UNIX系统的 ISO-9660文件系统 ,支持文件名字母大小写、符号字符以及长文件名 。由于兼容 ISO-9660, 所以即使操作系统不支持 Rock Ridge, 也可以通过ISO-9660 查看。

HFS
HFS全称为混合文件系统 (Hybrid File System),是苹果公司 (Apple)的MAC机所使用的光盘文件系统 ,不支持 DOS、Windows 9x/NT等其他操作系统。

39.2 为什么mkisofs仅是genisoimage的链接

在几年前,genisoimage还没登场,在linux的世界里,大部分发行都是使用cdrtools套件,cdrtools是一位叫Jörg Schilling的老大而mkisofs就是cdrtools里面的一个子工具,由于mkisofs是GPL发行,于是深受各Linux发行喜欢,当然普及也很广了。而当时cdrtools的Debian维护人员最为卖力,跟Jörg Schilling关系非常好。

天有不测风云,Sun搞了个叫CDDL(Common Development and Distribution License)的许可,CDDL跟GPL最大的区别是有些专利保护之类的东西在里面。Jörg Schilling看到有商机,于是把cdrtools一部分改为CDDL许可(不知mkisofs是否也改成CDDL),并且说CDDL跟GPL区别不大,都是免费的嘛。Debian当然不干了,说Sun的人跟他们当面解释过,就别忽悠人了,Jörg Schilling恼羞成怒,不再理会Debian的要求。

对GPL有严格要求的Debian于是让维护组自行开发了一个叫cdrkit新版本,cdrkit是基于cdrtools的,并且把所有非GPL代码全部剔除,里面的mkisofs也用genisoimage代替了。

参考:http://blog.chinaunix.net/uid-20723576-id-1887099.html

40 netstat

Linux下查看tcp网络连接的常用的命令为:

$ sudo netstat -pant

其中:
-a:显示所有连接,包括监听中和非监听中的;
-t:仅显示tcp协议;
-n:直接显示IP地址,不显示域名,加快显示速度;
-p:显示程序的PID和名称。

输出Kernel Interface Table:

$ netstat -ie

这个命令和ifconfig的输出一样。

说明:
netstat在不同系统中的用法可能不一样。
如在mac中,无法显示对应的进程号,显示tcp连接用下面命令:

$ netstat -p tcp

40.1 检查tcp端口是否被占用(netstat -an |grep port)

用下面命令可检查tcp端口(如8080)是否被占用:

$ netstat -an |grep  8080
tcp        0      0 :::8080                     :::*                        LISTEN

上面例子中的输出表明tcp端口8080已经被占用。

说明1:上面命令不需要sudo权限。
说明2:下面例子只能说明tcp端口22已经被占用,tcp端口58280并没有被占用(它仅是连接到其它机器的端口号)。

$ netstat -an |grep  58280
tcp        0      0 10.182.75.76:22             10.182.53.71:58280          ESTABLISHED

40.2 查看路由表(netstat -r或者ip route)

使用 netstat -r 可以查看本机的路由表,如果想显示更快,可以增加 -n 选项。如:

$ netstat -nr
Kernel IP routing table
Destination     Gateway         Genmask         Flags   MSS Window  irtt Iface
192.168.210.0   0.0.0.0         255.255.255.0   U         0 0          0 vmnet8
192.168.98.0    0.0.0.0         255.255.255.0   U         0 0          0 vmnet1
192.168.122.0   0.0.0.0         255.255.255.0   U         0 0          0 virbr0
10.182.72.0     0.0.0.0         255.255.252.0   U         0 0          0 eth0
169.254.0.0     0.0.0.0         255.255.0.0     U         0 0          0 eth0
0.0.0.0         10.182.72.1     0.0.0.0         UG        0 0          0 eth0

也可以使用 ip route 查看路由表。如:

$ ip route
192.168.210.0/24 dev vmnet8  proto kernel  scope link  src 192.168.210.1
192.168.98.0/24 dev vmnet1  proto kernel  scope link  src 192.168.98.1
192.168.122.0/24 dev virbr0  proto kernel  scope link  src 192.168.122.1
10.182.72.0/22 dev eth0  proto kernel  scope link  src 10.182.74.189
169.254.0.0/16 dev eth0  scope link  metric 1002
default via 10.182.72.1 dev eth0

41 od

od - dump files in octal and other formats.

默认以8进制形式显示,可以通过选项控制让其显示16进制形式。

$ od [-abcdfhilovx][-A <字码基数>][-j <字符数目>][-N <字符数目>][-s <字符串字符数>][-t <输出格式>][-w <每列字符数>][--help][--version][文件...]

后面实例中文件file1由下面命令产生。

$ echo "1234567890qwertyuiopasdfghjklzxcvbnm" >file1

如:

$ od file1
0000000 031061 032063 033065 034067 030071 073561 071145 074564
0000020 064565 070157 071541 063144 064147 065552 075154 061570
0000040 061166 066556 000012
0000045

41.1 指定按某进制显示(-t选项)

-t 指定数据的显示格式,主要的参数(这些参数可以同时使用)有:
c ASCII字符或反斜杠序列
d 有符号十进制数
f 浮点数
o 八进制(系统默认值为02)
u 无符号十进制数
x 十六进制数
注:除了选项c以外的其他选项后面都可以跟一个十进制数n,指定每个显示值所包含的字节数。

实例,以16进制显示:

$ od -tx file1
0000000 34333231 38373635 77713039 79747265
0000020 706f6975 66647361 6b6a6867 63787a6c
0000040 6d6e6276 0000000a
0000045

实例,16进制显示,控制每个显示值仅包含1个字节:

$ od -tx1 file1
0000000 31 32 33 34 35 36 37 38 39 30 71 77 65 72 74 79
0000020 75 69 6f 70 61 73 64 66 67 68 6a 6b 6c 7a 78 63
0000040 76 62 6e 6d 0a
0000045

注:注意实例3和实例红色部分的不同!

实例,用ASCII码和十六进制组合的方式能提供更有价值的信息输出:

$ od -Ax -tcx1 file1
000000   1   2   3   4   5   6   7   8   9   0   q   w   e   r   t   y
        31  32  33  34  35  36  37  38  39  30  71  77  65  72  74  79
000010   u   i   o   p   a   s   d   f   g   h   j   k   l   z   x   c
        75  69  6f  70  61  73  64  66  67  68  6a  6b  6c  7a  78  63
000020   v   b   n   m  \n
        76  62  6e  6d  0a
000025

41.2 指定地址的显示格式(-A选项)

-A选项可指定地址基数,包括:
d 十进制
o 八进制(系统默认值)
x 十六进制
n 不打印位移值

实例,以10进制显示地址:

$ od -Ad file1
0000000 031061 032063 033065 034067 030071 073561 071145 074564
0000016 064565 070157 071541 063144 064147 065552 075154 061570
0000032 061166 066556 000012
0000037

实例,不显示地址:

$ od -An file1
031061 032063 033065 034067 030071 073561 071145 074564
064565 070157 071541 063144 064147 065552 075154 061570
061166 066556 000012

42 parcellite

Parcellite is a stripped down, basic-features-only clipboard manager with a small memory footprint for those who like simplicity.

Ubuntu系统中,可以这样安装:

$ sudo apt-get install parcellite

Features:

  • Keeps a clipboard history.
  • Various view options to display items the way you like it.
  • Daemon mode; guard your clipboard contents when you close applications.
  • Perform custom commands using clipboard contents.

说明:
它有一个非常实用的功能:应用程序退出后,剪贴板内容不会丢失!
安装完后,下次重启系统后会自动启动。

43 paste

paste可按列合并文件。

$ cat file1
1
2
$ cat file2
a
b
c
$ paste file1 file2    # 按列合并,默认为tab为分隔符
1	a
2	b
	c

-s选项,把每个文件归为一行!

$ paste -s file1 file2
1	2
a	b	c

43.1 指定不同的分隔符

用-d选项可以指定1个或多个不同的分隔符,如:

$ paste -d,_ file1 file2 file2
1,a_a
2,b_b
,c_c

43.2 实例:将一个文本的所有行用逗号连接起来

$ paste -sd, file2
a,b,c

43.3 实例:对文件的所有行求和

44 pgrep和pwdx

pgrep通过程序名字直接查询进程。

默认只会显示pid,如果想显示进程名字,则可以加个-l选项。

实例:找出java进程

$ pgrep java

44.1 实例:找出root运行的进程名为s开头的所有进程

用pgrep找出root运行的进程名为s开头的所有进程:

$ pgrep -u root "^s"

用ps也可以做到,只是比pgrep使用复杂地:

$ ps -u root | awk '{print $4" "$1}' | grep "^s" | awk '{print $2}'

44.2 查看进程的工作目录

pwdx可打印进程的工作目录。

显示进程1052的工作目录:

$ pwdx 1052
1052: /home/cig01

直接查看/proc/pid目录中的文件也能达到同样的功能:

$ ls -l /proc/1052/cwd
lrwxrwxrwx 1 cig01 cig01 0 Nov 21 13:17 /proc/1052/cwd -> /home/cig01

45 ps和pstree

ps可查看运行的进程。

说明:不同的系统支持的ps选项很不一样,使用时请查阅当前系统的man文档。

45.1 查看某个进程的详细信息

直接用ps pid得到的进程信息比较简单。

$ ps 1052
  PID TTY      STAT   TIME COMMAND
 1052 pts/0    Ss     0:00 -bash

上面命令得到的信息很简单。

要得到详细的信息,可以使用-f或-F选项。

$ ps -f 1052
UID        PID  PPID  C STIME TTY      STAT   TIME CMD
cig01     1052  1049  0 10:59 pts/0    Ss     0:00 -bash

-f是full-format的含义,输出的信息很详细,比如可查看父进程id

$ ps -F 1052
UID        PID  PPID  C    SZ   RSS PSR STIME TTY      STAT   TIME CMD
cig01     1052  1049  0  5895  5600   0 11:16 pts/0    Ss     0:00 -bash

-F是extra full的含义,比-f得到的信息更详细。

45.2 查看进程的内存使用信息(ps v)

ps v 可查看进程的内存使用信息(这是BSD系统风格,几乎所有系统都支持这样使用。加上连字符,即'ps -v'在大部分系统中也可用,但AIX系统中提示非法选项。)

$ ps v
  PID TTY      STAT   TIME  MAJFL   TRS   DRS   RSS %MEM COMMAND
 1052 pts/0    Ss     0:00      1   966 22613  5600  0.5 -bash
 2376 pts/0    R+     0:00      0    84 10595  2028  0.1 ps v

查看某个进程的内存使用信息,在ps v后面接上pid即可:

$ ps v 1052
  PID TTY      STAT   TIME  MAJFL   TRS   DRS   RSS %MEM COMMAND
 1052 pts/0    Ss     0:00      1   966 22613  5600  0.5 -bash

45.3 查看所有用户的所有进程

要查看所有用户的所有进程,可以使用下面方法(System V风格):

$ ps -e
$ ps -ef
$ ps -eF
$ ps -ely

要查看所有用户的所有进程,也可以使用下面方法(BSD风格):

$ ps ax
$ ps axu

可以验证,ps ax|wc -l和ps -e|wc -l的结果是一样的,这说明ps ax和ps -e找到的进程数是一致的。

45.3.1 ps axu(BSD风格)

ps axu实例如下:

$ ps axu
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root         1  0.0  0.4 110568  5024 ?        Ss   11:16   0:00 /sbin/init
root         2  0.0  0.0      0     0 ?        S    11:16   0:00 [kthreadd]
root         3  0.0  0.0      0     0 ?        S    11:16   0:00 [ksoftirqd/0]
root         5  0.0  0.0      0     0 ?        S<   11:16   0:00 [kworker/0:0H]
root         6  0.0  0.0      0     0 ?        S    11:16   0:00 [kworker/u2:0]
root         7  0.0  0.0      0     0 ?        S    11:16   0:00 [rcu_sched]
root         8  0.0  0.0      0     0 ?        S    11:16   0:00 [rcu_bh]
root         9  0.0  0.0      0     0 ?        S    11:16   0:00 [migration/0]
root        10  0.0  0.0      0     0 ?        S    11:16   0:00 [watchdog/0]
root        11  0.0  0.0      0     0 ?        S<   11:16   0:00 [khelper]
root        12  0.0  0.0      0     0 ?        S    11:16   0:00 [kdevtmpfs]
root        13  0.0  0.0      0     0 ?        S<   11:16   0:00 [netns]
......

下面来具体分析ps axu,它是BSD的风格。
ps axu的三个参数含义分别如下:
ps a:显示现行终端机下的所有程序,包括其他用户的程序。
ps x:显示所有程序,不以终端机来区分。(参数x,显示当前用户的所有程序,不会显示其他用户的程序,和参数a一起用就可以显示所有用户的所有程序。)
ps u:以用户为主的格式来显示程序状况。(仅仅是定制输出格式为“user-oriented format”)

ps axu输出信息的第8列为STAT,它的含义是什么呢?
通过man ps可查阅,列出如下:

D 不可中断睡眠 (通常是在IO操作) 收到信号不唤醒和不可运行, 进程必须等待直到有中断发生
R 正在运行或可运行(在运行队列排队中)
S 可中断睡眠 (休眠中, 受阻, 在等待某个条件的形成或接受到信号)
T 已停止的进程收到SIGSTOP, SIGSTP, SIGTIN, SIGTOU信号后停止运行
W 正在换页(2.6内核之前有效)
X 死进程(未开启)
Z 僵尸进程(进程已终止, 但进程描述符存在, 直到父进程调用wait4()系统调用后释放BSD风格的)
< 高优先级(not nice to other users)
N 低优先级(nice to other users)
L 页面锁定在内存(实时和定制的IO)
s 一个信息头
l 多线程(使用 CLONE_THREAD,像NPTL的pthreads的那样)
+ 在前台进程组

特别注意:ps aux与ps -aux是不同的,POSIX标准要求ps -aux显示用户名为"x"的所有进程。但如果系统中没有名为"x"的用户,则ps -aux会与ps aux作用等同,同时提示一个warning。

45.3.2 ps -ef(System V风格)

ps -ef实例如下:

$ ps -ef
UID        PID  PPID  C STIME TTY          TIME CMD
root         1     0  0 11:16 ?        00:00:00 /sbin/init
root         2     0  0 11:16 ?        00:00:00 [kthreadd]
root         3     2  0 11:16 ?        00:00:00 [ksoftirqd/0]
root         5     2  0 11:16 ?        00:00:00 [kworker/0:0H]
root         6     2  0 11:16 ?        00:00:00 [kworker/u2:0]
root         7     2  0 11:16 ?        00:00:00 [rcu_sched]
root         8     2  0 11:16 ?        00:00:00 [rcu_bh]
root         9     2  0 11:16 ?        00:00:00 [migration/0]
root        10     2  0 11:16 ?        00:00:00 [watchdog/0]
root        11     2  0 11:16 ?        00:00:00 [khelper]
root        12     2  0 11:16 ?        00:00:00 [kdevtmpfs]
root        13     2  0 11:16 ?        00:00:00 [netns]
......

下面来具体分析ps -ef,它是System V的风格。
ps -e:显示所有程序。(所有用户的所有程序)
ps -f:更为完整的输出格式。(仅仅是定制输出格式,使其更详细)

45.4 查看进程的所有子进程(pstree)

用pstree可显示某个进程的所有子进程。如:

$ pstree -p 1052
bash(1052)───pstree(2275)

-p选项可显示所有子进程的pid。

45.5 查看进程的所有子线程(top -H或ps -L或ls /proc/pid/task)

查看某个进程的所有子线程有多种方法。

方法一,使用 top -H
如查看进程gnome-shell(pid为1108)的所有子线程:

$ top -H -p 1108
 top - 13:58:56 up  2:59,  2 users,  load average: 0.00, 0.01, 0.05
Threads:   7 total,   0 running,   7 sleeping,   0 stopped,   0 zombie
%Cpu(s):  0.0 us,  0.0 sy,  0.0 ni,100.0 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
KiB Mem:   1024444 total,   858012 used,   166432 free,    73392 buffers
KiB Swap:   477180 total,        0 used,   477180 free.   345952 cached Mem

  PID USER      PR  NI    VIRT    RES    SHR S %CPU %MEM     TIME+ COMMAND
 1108 cig01     20   0 1312484 173236  67720 S  0.0 16.9   0:03.33 gnome-shell
 1133 cig01     20   0 1312484 173236  67720 S  0.0 16.9   0:00.00 gmain
 1137 cig01     20   0 1312484 173236  67720 S  0.0 16.9   0:00.02 gdbus
 1143 cig01     20   0 1312484 173236  67720 S  0.0 16.9   0:00.00 dconf worker
 1144 cig01     20   0 1312484 173236  67720 S  0.0 16.9   0:00.00 threaded-ml
 1145 cig01     20   0 1312484 173236  67720 S  0.0 16.9   0:00.00 JS GC Helper
 1146 cig01     20   0 1312484 173236  67720 S  0.0 16.9   0:00.00 JS Sour~ Thread

方法二,使用 ps -L

$ ps -L 1090
  PID   LWP TTY      STAT   TIME COMMAND
 1108  1108 ?        Sl     0:03 /usr/bin/gnome-shell
 1108  1133 ?        Sl     0:00 /usr/bin/gnome-shell
 1108  1137 ?        Sl     0:00 /usr/bin/gnome-shell
 1108  1143 ?        Sl     0:00 /usr/bin/gnome-shell
 1108  1144 ?        Sl     0:00 /usr/bin/gnome-shell
 1108  1145 ?        Sl     0:00 /usr/bin/gnome-shell
 1108  1146 ?        Sl     0:00 /usr/bin/gnome-shell

方法三,使用 ps -T

$ ps -e -T |grep 1108
 1108  1108 ?        00:00:03 gnome-shell
 1108  1133 ?        00:00:00 gmain
 1108  1137 ?        00:00:00 gdbus
 1108  1143 ?        00:00:00 dconf worker
 1108  1144 ?        00:00:00 threaded-ml
 1108  1145 ?        00:00:00 JS GC Helper
 1108  1146 ?        00:00:00 JS Sour~ Thread

方法四,查看 /proc/pid/task 目录下的内容。如:

$ ls /proc/1108/task/
1108  1133  1137  1143  1144  1145  1146

45.5.1 各系统下查看进程的子线程

前面介绍了很多查看进程子线程的方法,但它们仅在Linux中有效。下面介绍其它系统中也能使用的命令。
ps M <pid> 命令可查看子线程,它可用于OSX和Linux中。
ps -L -p <pid> 命令可查看子线程,它可用于Solaris和Linux中。
ps -mo THREAD -p <pid> 命令可查看子线程,它可用于AIX和Linux中。

OSX 10.10中测试如下:

cig01@MacBook-Pro ~$ ps M 1
USER   PID   TT   %CPU STAT PRI     STIME     UTIME COMMAND
root     1   ??    0.0 S    31T   0:00.00   0:00.00 /sbin/launchd
         1         0.0 S    31T   0:00.58   0:00.16
         1         0.0 S    31T   0:00.00   0:00.00
         1         0.0 S    31T   0:00.00   0:00.00
         1         0.0 S    31T   0:00.00   0:00.00

Debian8中测试如下:

cig01@debian8:~$ ps M 1090
  PID TTY      STAT   TIME COMMAND
 1108 ?        -      0:02 /usr/bin/gnome-shell
    - -        Sl     0:02 -
    - -        Sl     0:00 -
    - -        Sl     0:00 -
    - -        Sl     0:00 -
    - -        Sl     0:00 -
    - -        Sl     0:00 -
    - -        Sl     0:00 -

说明:如果要在Linux中要统计线程数,不要统计这一行"1108 ? - 0:02 /usr/bin/gnome-shell",它和它的下一行是同一线程,不要重复统计。

Solaris中测试如下:

sunos ~$ ps -L -p 13916
  PID   LWP TTY        LTIME CMD
13916     1 ?           0:03 test
13916     2 ?           6:52 test
13916     3 ?           4:41 test

AIX中测试如下:

aix ~$ ps -mo THREAD -p 6488112
    USER      PID     PPID        TID ST  CP PRI SC    WCHAN        F     TT BND COMMAND
   user1  6488112  7012594          - A    0  60 50        *   242001      -   - java
       -        -        -   12255369 S    0  82  1 f1000f0a1000bb40  8410400      -   - -
       -        -        -   17432667 S    0  82  1 f1000f0a10010a40  8410400      -   - -
       -        -        -   17694765 Z    0  71  1        -   c00001      -   - -
       -        -        -   19071195 S    0  82  1 f1000f0a10012340  8410400      -   - -
       -        -        -   19333209 S    0  82  1 f1000f0a10012740  8410400      -   - -
       -        -        -   19988599 S    0  82  1 f1000f0a10013140  8410400      -   - -

45.6 Tips:显示完整的COMMAND

ps输出信息太长时,默认不会换行,要完整显示出信息,可以加上 ww-ww 选项。如:

$ ps 1902
  PID TTY      STAT   TIME COMMAND
 1902 ?        S      0:00 /sbin/dhclient -d -q -sf /usr/lib/NetworkManager/nm-d
$ ps ww 1902
  PID TTY      STAT   TIME COMMAND
 1902 ?        S      0:00 /sbin/dhclient -d -q -sf /usr/lib/NetworkManager/nm-dhcp-helper -pf /var/run/dhclient-eth0.pid -lf /var/lib/NetworkManager/dhclient-423ff229-072a-42a8-9ee8-6169c5ac7a3a-eth0.lease -cf /var/lib/NetworkManager/dhclient-eth0.conf eth0
$ ps -ww 1902
  PID TTY      STAT   TIME COMMAND
 1902 ?        S      0:00 /sbin/dhclient -d -q -sf /usr/lib/NetworkManager/nm-dhcp-helper -pf /var/run/dhclient-eth0.pid -lf /var/lib/NetworkManager/dhclient-423ff229-072a-42a8-9ee8-6169c5ac7a3a-eth0.lease -cf /var/lib/NetworkManager/dhclient-eth0.conf eth0

45.7 Tips:按CPU排序显示进程

下面例子可以显示占用CPU最多的5个进程:

$ ps aux | sort -nrk 3,3 | head -n 5                 # 显示占用CPU最多的5个进程(CPU使用在ps aux输出中是第3列)
root         5  0.1  1.5 977120 32180 pts/0    Sl+  04:04   0:00 node app.js
root        67  0.0  0.0   4336   720 pts/1    S+   04:12   0:00 head -n 5
root        66  0.0  0.0  14896  1588 pts/1    S+   04:12   0:00 sort -nrk 3,3
root        65  0.0  0.1  47460  3276 pts/1    R+   04:12   0:00 ps aux
root        11  0.0  0.1  11784  2860 pts/1    Ss   04:04   0:00 bash

说明:“ps aux”的输出有一个header,即第一行“USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND”,在用下一个sort命令排序时它会被放到最后一行,如果系统中的进程数少于5个(很可能出现在docker环境下),则上面输出的最后一行会是这个无用的header。为了避免这种情况,可以使用下面命令:

$ ps aux | sed 1d | sort -nrk 3,3 | head -n 5        # 显示占用CPU最多的5个进程,更加严谨(当系统进程少于5个时可过滤ps的header)

45.8 Tips:按内存排序显示进程

下面例子可以显示占用内存最多的5个进程:

# ps aux | sort -nrk 4,4 | head -n 5                 # 显示占用内存最多的5个进程(内存使用在ps aux输出中是第4列)
root         5  0.1  1.7 979604 36012 pts/0    Sl+  04:04   0:00 node app.js
root       173  0.0  0.1  47460  3260 pts/1    R+   04:13   0:00 ps aux
root        11  0.0  0.1  11784  2860 pts/1    Ss   04:04   0:00 bash
root         1  0.0  0.1  11648  2440 pts/0    Ss+  04:04   0:00 /bin/bash /root/app.sh
root       175  0.0  0.0   4336   624 pts/1    S+   04:13   0:00 head -n 5

下面是更加严谨的形式:

$ ps aux | sed 1d | sort -nrk 4,4 | head -n 5        # 显示占用内存最多的5个进程,更加严谨(当系统进程少于5个时可过滤ps的header)

46 rsync

rsync 是用于替代rcp的一个工具。

rsync(remote synchronize)是一个远程数据同步工具(仅传送两个文件的不同部分,而不是每次都整份传送,因此速度非常快),可通过 LAN/WAN 快速同步多台主机之间的文件。也可以使用 rsync 同步本地硬盘中的不同目录。

基本使用:
1)本地使用:
rsync [OPTION…] SRC… [DEST]
2)通过远程 shell 使用:
拉: rsync [OPTION…] [USER@]HOST:SRC… [DEST]
推: rsync [OPTION…] SRC… [USER@]HOST:DEST
3)访问 rsync 服务器:
拉: rsync [OPTION…] [USER@]HOST::SRC… [DEST]
推: rsync [OPTION…] SRC… [USER@]HOST::DEST
拉: rsync [OPTION…] rsync://[USER@]HOST[:PORT]/SRC… [DEST]
推: rsync [OPTION…] SRC… rsync://[USER@]HOST[:PORT]/DEST

参考:http://www.zzbaike.com/wiki/CentOS/使用rsync同步

46.1 实例:本地目录同步

下面是本地目录同步的例子:

$ rsync -a --delete /home/user1   /backups/dir1/     # 把目录/home/user1同步到/backups/dir1/中
$ rsync -a --delete /home/user1/  /backups/dir1/     # 把目录/home/user1中的所有内容同步到/backups/dir1/中

-a:归档模式,表示以递归方式传输文件,并保持所有文件属性。
–delete:删除那些接收端还有而发送端已经不存在的文件。

说明:在指定复制源时,路径最后是否有“/”的含义是不同的。上面例子中:
/home/user1: 表示将整个/home/user1目录复制到目标目录;
/home/user1/:表示将/home/user1/目录中的所有内容复制到目标目录。

47 samba

Samba is a free software re-implementation of the SMB/CIFS networking protocol.

下面是samba的一些基本操作实例。
1、查看机器中samba服务是否在运行:

$ service smb status
smbd (pid  4144) is running...

2、启动samba服务

$ service smb start

3、增加samba用户(操作系统用户不会自动成为samba用户):

$ sudo smbpasswd -a YourUserName         # 回车后会提示你输入密码

4、重置samba用户密码(可通过增加用户实现,用户存在的话会直接更新密码):

$ sudo smbpasswd -a YourUserName         # 回车后会提示你输入密码

47.1 增加共享目录

默认用户的HOME目录是共享目录,如何增加其他的共享目录呢?打开配置文件“/etc/samba/smb.conf”,在后面增加类似下面的内容即可:

[my_new_share]
    comment = This is my new share
    path = /path/to/my/share
    public = yes
    writable = yes

其中,my_new_share将作为共享目录的别名。

48 split和csplit

split和csplit这两个命令用来分割文本文件。
split按大小分割,csplit按行分割。

把文件 file1 按大小分解,分解后大小为 512byte,文件名前缀为 prefix 后缀为 00、01、02 ……99。若 -b 改为 -k 为Kbyte,-m 为Mbyte。

$ split -d -b 512 file prefix

把文件 file1 按行分解,分解后大小为 15000 行,文件名前缀为 prefix 后缀为 00、01、02 ……99,而文件个数不多于100个。

$ csplit -k -f prefix file1 15000 {99}

48.1 csplit实例

1、将文本文件textfile以120行为分界点切割成2份

$ csplit testfile 120

2、将文本文件textfile以120行为分界点切割成2份, 并指定输出文件名的位数为3

$ csplit -n 3 testfile 120
$ ls
textfile  xx000  xx0001

3、将文本文件textfile以120行为分界点切割成2份, 并指定输出文件名的前缘为FileName位数为3

$ csplit -f FileName testfile 120
$ ls
textfile  FileName00  FileName001

4、将文件textfile以10行为单位分割8次, 并指定输出文件名的格式

$ csplit -b "myfile%o% textfile 10 {8}
$ ls
textfile xxmyfile00  xxmyfile01 xxmyfile02 ...

5、将文本文件textfile以每20行为单位分割

$ csplit textfile 20 {*}

6、把文件以字符串"Chapter X"为分界符,分成两部分

$ csplit textfile /"Chapter X"/

7、承上例, 但分割文件时以"Chapter X"字符串往下4行才是分割点

$ csplit textfile /"Chapter X"/+4

参考:http://find11.blog.163.com/blog/static/68162432010018101237247/

49 ssh

ssh 常用来远程登录服务器。

49.1 ssh实现自动登录

ssh可使用密钥验证,实现自动登录。

步骤1:在本地机器上生成密钥对,如生成rsa类型的密钥。

$ ssh-keygen -t rsa

一路回车,直到在当前用户根目录下的.ssh子目录生成了id_rsa.pub公钥。

步骤2:把生成的公钥id_rsa.pub(注意:不是私钥文件id_rsa)复制到远程需要登录的机器的~/.ssh/目录中,并改名为authorized_keys。

$ scp ~/.ssh/id_rsa.pub username@hostname:~/.ssh/authorized_keys

注意:上面命令要成功,远程机器的~/.ssh目录必须已经存在。如果authorized_keys已经存在,则可以把公钥文件的内容追加到authorized_keys文件中。

完成上面两步后,就不再需要输入密码了。
配置正确后,scp和sftp也不再需要输入密码了,且还能支持远程路径的自动补全。

说明:用命令 ssh-copy-id 可以自动完成公钥的复制操作。如:

$ ssh-copy-id username@hostname

但上面的命令很可能不成功。参考:http://superuser.com/questions/189376/ssh-copy-id-does-not-work

49.1.1 为不同的Host指定不同私钥文件(配置IdentityFile)

如果不同Host使用不同的密钥对,你可以在~/.ssh/config中通过为Host配置不同IdentityFile来定制某个Host所要使用的私钥文件。如:

Host *
IdentityFile ~/.ssh/id_rsa

Host *.github.*
IdentityFile ~/.ssh/github_id.rsa

Host *.someother.com
IdentityFile ~/.ssh/someother_id.rsa

参考:https://superuser.com/questions/287651/can-i-have-multiple-ssh-keys-in-my-ssh-folder

49.2 保存常用的服务器地址

可以把服务器地址提前放入到文件中,~/.ssh/config,连接时只指定名字即可。

如:

$ cat .ssh/config
Host AIX
 Hostname xx1.yy1.com

Host Soloris
 Hostname xx2.yy2.com

连接时使用ssh AIX就相当于ssh xx1.yy1.com

参考:
http://unix.stackexchange.com/questions/61655/multiple-similar-entries-in-ssh-config
配置文件的格式说明,可参考: man ssh_config

49.2.1 自动补全~/.ssh/config中配置的机器名

在~/.bashrc中加入下面的内容即可。

_ssh()
{
    local cur prev opts
    COMPREPLY=()
    cur="${COMP_WORDS[COMP_CWORD]}"
    prev="${COMP_WORDS[COMP_CWORD-1]}"
    opts=$(grep '^Host' ~/.ssh/config | awk '{print $2}')

    COMPREPLY=( $(compgen -W "$opts" -- ${cur}) )
    return 0
}
complete -F _ssh ssh

参考:
http://unix.stackexchange.com/questions/136351/autocomplete-server-names-for-ssh-and-scp

49.3 多条连接共享

如果你需要在多个窗口中打开到同一个服务器的连接,而不想每次都输入用户名,密码,或是等待连接建立,那么你可以配置SSH的连接共享选项,在本地(不是服务器上)打开你的SSH配置文件,通常它们位于~/.ssh/config,然后添加下面2行:

ControlMaster auto
ControlPath /tmp/ssh_mux_%h_%p_%r

现在试试断开你与服务器的连接,并建立一条新连接,然后打开一个新窗口,再创建另一条连接,你会发现,第二条连接几乎是在瞬间就建立好了。

参考:http://www.linuxeden.com/html/news/20130222/136050.html

50 stty

stty - change and print terminal line settings

显示当前所有设置:

$ stty -a
speed 38400 baud; rows 45; columns 159; line = 0;
intr = ^C; quit = ^\; erase = ^?; kill = ^U; eof = ^D; eol = M-^?; eol2 = M-^?; swtch = M-^?; start = ^Q; stop = ^S; susp = ^Z; rprnt = ^R; werase = ^W;
lnext = ^V; flush = ^O; min = 1; time = 0;
-parenb -parodd cs8 hupcl -cstopb cread -clocal -crtscts
-ignbrk brkint -ignpar -parmrk -inpck -istrip -inlcr -igncr icrnl ixon -ixoff -iuclc ixany imaxbel iutf8
opost -olcuc -ocrnl onlcr -onocr -onlret -ofill -ofdel nl0 cr0 tab0 bs0 vt0 ff0
isig icanon iexten echo echoe echok -echonl -noflsh -xcase -tostop -echoprt echoctl echoke

从上面输出可以看到:
Ctrl-c,向当前job发送INT (interrupt)信号;
Ctrl-\,向当前job发送QUIT信号。

一般情况下,Ctrl-c就能正常中止当前job,只有当Ctrl-c无效时,才使用Ctrl-\。因为Ctrl-c使job有机会clean up。

51 sudo

sudo - execute a command as another user

51.1 切换到root用户

可用下面命令切换到root用户(不一定成功,取决于当前系统的配置):

$ sudo su

非交互模式(不会提示输入密码):

$ sudo -n su

注:如果需要输入密码,会直接报错。

51.2 查看sudo的配置文件等信息

先切换到root用户(这样可以显示更多信息),再运行:

root@debian8:~# sudo -V
Sudo version 1.8.10p3
Configure options: --prefix=/usr -v --with-all-insults --with-pam --with-fqdn --with-logging=syslog --with-logfac=authpriv --with-env-editor --with-editor=/usr/bin/editor --with-timeout=15 --with-password-timeout=0 --with-passprompt=[sudo] password for %p:  --disable-root-mailer --with-sendmail=/usr/sbin/sendmail --with-rundir=/var/lib/sudo --mandir=/usr/share/man --libexecdir=/usr/lib/sudo --with-sssd --with-sssd-lib=/usr/lib/x86_64-linux-gnu --with-selinux --with-linux-audit
Sudoers policy plugin version 1.8.10p3
Sudoers file grammar version 43

Sudoers path: /etc/sudoers
Authentication methods: 'pam'
Syslog facility if syslog is being used for logging: authpriv
Syslog priority to use when user authenticates successfully: notice
Syslog priority to use when user authenticates unsuccessfully: alert
Send mail if user authentication fails
Send mail if the user is not in sudoers
Use a separate timestamp for each user/tty combo
Lecture user the first time they run sudo
Require users to authenticate by default
Root may run sudo
Allow some information gathering to give useful error messages
Require fully-qualified hostnames in the sudoers file
Visudo will honor the EDITOR environment variable
Set the LOGNAME and USER environment variables
Length at which to wrap log file lines (0 for no wrap): 80
Authentication timestamp timeout: 15.0 minutes
Password prompt timeout: 0.0 minutes
Number of tries to enter a password: 3
Umask to use or 0777 to use user's: 022
Path to mail program: /usr/sbin/sendmail
Flags for mail program: -t
Address to send mail to: root
Subject line for mail messages: *** SECURITY information for %h ***
Incorrect password message: Sorry, try again.
Path to lecture status dir: /var/lib/sudo/lectured
Path to authentication timestamp dir: /var/lib/sudo/ts
Default password prompt: [sudo] password for %p:
Default user to run commands as: root
Value to override user's $PATH with: /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
Path to the editor for use by visudo: /usr/bin/editor
When to require a password for 'list' pseudocommand: any
When to require a password for 'verify' pseudocommand: all
File descriptors >= 3 will be closed before executing a command
Reset the environment to a default set of variables
Environment variables to check for sanity:
	TZ
	TERM
	LINGUAS
	LC_*
	LANGUAGE
	LANG
	COLORTERM
Environment variables to remove:
	RUBYOPT
	RUBYLIB
	PYTHONUSERBASE
	PYTHONINSPECT
	PYTHONPATH
	PYTHONHOME
	TMPPREFIX
	ZDOTDIR
	READNULLCMD
	NULLCMD
	FPATH
	PERL5DB
	PERL5OPT
	PERL5LIB
	PERLLIB
	PERLIO_DEBUG
	JAVA_TOOL_OPTIONS
	SHELLOPTS
	GLOBIGNORE
	PS4
	BASH_ENV
	ENV
	TERMCAP
	TERMPATH
	TERMINFO_DIRS
	TERMINFO
	_RLD*
	LD_*
	PATH_LOCALE
	NLSPATH
	HOSTALIASES
	RES_OPTIONS
	LOCALDOMAIN
	CDPATH
	IFS
Environment variables to preserve:
	XAUTHORIZATION
	XAUTHORITY
	PS2
	PS1
	PATH
	LS_COLORS
	KRB5CCNAME
	HOSTNAME
	DISPLAY
	COLORS
Locale to use while parsing sudoers: C
Directory in which to store input/output logs: /var/log/sudo-io
File in which to store the input/output log: %{seq}
Add an entry to the utmp/utmpx file when allocating a pty
PAM service name to use
PAM service name to use for login shells
Attempt to establish PAM credentials for the target user
Create a new PAM session for the command to run in
Maximum I/O log sequence number: 0
Enable sudoers netgroup support

Local IP address and netmask pairs:
	192.168.1.105/255.255.255.0
	fe80::a00:27ff:fe9c:e5f4/ffff:ffff:ffff:ffff::

Sudoers I/O plugin version 1.8.10p3

51.3 传递环境变量(-E)

默认地,当前用户的环境变量不会应用到sudo启动的程序,除非使用 -E 选项。

52 testdisk(数据恢复软件)

testdisk 是一个开源的数据恢复软件。

Debian系统中可用如下方法安装:

$ sudo apt-get install testdisk

注:亲自测试,testdisk恢复数据非常有效!

53 top

top可动态地显示进程的信息。

备注:不同系统中top命令选项的差异很大。这里仅介绍Linux中的top命令。

常用的排序命令:
F或者O 指定对哪列进行排序。
R 反向排序。
M 按内存排序。
P 按CPU排序。
T 按使用时间排序。

53.1 非交互模式(-b选项)

进入非交互模式,不接受用户交互,仅输出信息。常用来保存某时刻的状态。

$ top -b -n1 > top.log
$ top -b -n2 > top.log2

不加-b选项,无法得到所有进程的信息,且输出信息中含很多特殊字符。

53.2 显示线程(-H选项)

top默认只显示进程信息,使用-H选项可以让其显示线程信息。

54 troff(tbl,pic,eqn)

troff 是一个由AT&T为Unix开发的文字处理软件。

pic也是troff的预处理器,Linux都会自带这个小工具。它的作用仅仅是把一段文本中标识符.PS和.PE之间的指令,即pic语言,解释成troff语言,最终实际是由troff绘图。
另外还有两个类似pic的预处理工具是eqn和tbl,顾名思义分别是用作绘制公式和表格的。

参考:
http://www.troff.org/prog.html
http://blog.jqian.net/post/pic.html

55 tsort

tsort 是进行拓扑排序的工具。

拓扑排序是对有向无环图的一种排序。表示了顶点按边的方向出现的先后顺序。如果有环,则无法表示两个顶点的先后顺序了。

在生活中,也有拓扑排序的应用,如课程表设计,要先完成一些基础课后才可以继续修专业课;
在软件开发中,如多个模块之间的依赖关系,编译顺序;
在项目管理中,各个任务的先后次序,某些任务完成之后才能进行其它的任务等。

55.1 简单的拓扑排序算法

简单的拓扑排序算法:找到任意入度为0的一个顶点,删除它及所有相邻的边,再找入度为0的顶点,以此类推,直到删除所有顶点。顶点的删除顺序即为拓扑排序顺序。

55.2 实例:输出函数调用前后顺序

下面例子来自info tsort。
文件call-graph中保存了C程序中函数之前的调用关系(看起来像tail命令的实现),文件第一行表明main调用了parse_options,第二行表明main调用了tail_file,以此类推。

$ cat call-graph
main parse_options
main tail_file
main tail_forever
tail_file pretty_name
tail_file write_header
tail_file tail
tail_forever recheck
tail_forever pretty_name
tail_forever write_header
tail_forever dump_remainder
tail tail_lines
tail tail_bytes
tail_lines start_lines
tail_lines dump_remainder
tail_lines file_lines
tail_lines pipe_lines
tail_bytes xlseek
tail_bytes start_bytes
tail_bytes dump_remainder
tail_bytes pipe_bytes
file_lines dump_remainder
recheck pretty_name

执行下面命令:

$ tsort call-graph | tac
dump_remainder
start_lines
file_lines
pipe_lines
xlseek
start_bytes
pipe_bytes
tail_lines
tail_bytes
pretty_name
write_header
tail
recheck
parse_options
tail_file
tail_forever
main

上面的输出,排在前面的函数可能被排在后面的函数调用;而排在后面的不可能被排在前面的调用。

56 useradd和gpasswd等用户管理命令

Table 7: 常用的用户管理命令
命令 说明
useradd 增加用户
passwd 给用户设置密码
userdel 删除用户
groups 查看用户在哪些组中
gpasswd 管理用户组

56.1 gpasswd

gpasswd把用户加入组:

$ sudo gpasswd -a jack vboxusers    # 把用户jack加入到vboxusers用户组里:

gpasswd把用户从组中删除:

$ sudo gpasswd -d userName groupName

说明:
usermod也能把用户加入到组中,但不要这样使用!为什么?请参考: don't use usermod – use gpasswd

56.2 useradd和adduser的区别

useradd is native binary compiled with the system.

In Debain systems, adduser is a perl script which uses useradd binary in back-end.
In Redhat systems, adduser is present as a symbolic link to useradd command.

56.3 查看系统中所有的用户组

查看系统中所有的用户组没有单独的命令,可用下面的方法:

$ cut -d: -f1 /etc/group

56.4 Tips

56.4.1 useradd在NIS+环境下反应很慢(使用luseradd)

问题描述:当redhat中集成了NIS+做用户管理后,运行useradd增加一个本地账户时可以会花费很长时间(如超过1个小时),原因可能是useradd需要查询NIS+服务器。
解决办法:不使用useradd增加本地账户,而是使用luseradd/luserdel/lgroupadd/lgroupdel等工具。

56.4.2 NIS+环境下新本地用户无法登录

创建本地的新用户(db2inst1,db2fenc1,db2das1)后,发现无法登录。
解决办法:修改/etc/passwd,把新增加的用户对应的记录从文件的最后位置移动到NIS+用户的相关配置之前。

$ tail -n 12 /etc/passwd
ldap:x:55:55:LDAP User:/var/lib/ldap:/bin/false
nslcd:x:65:55:LDAP Client User:/:/sbin/nologin
usbmuxd:x:113:113:usbmuxd user:/:/sbin/nologin
+@nis1_access
+@nis2_access
+
db2inst1:x:506:732:db2inst1:/local/home/db2inst1:/bin/bash
db2fenc1:x:507:1004:db2fenc1:/local/home/db2fenc1:/bin/bash
db2das1:x:507:675:db2das1:/local/home/db2das1:/bin/bash

修改完成后,变成:

$ tail -n 12 /etc/passwd
ldap:x:55:55:LDAP User:/var/lib/ldap:/bin/false
nslcd:x:65:55:LDAP Client User:/:/sbin/nologin
usbmuxd:x:113:113:usbmuxd user:/:/sbin/nologin
db2inst1:x:506:732:db2inst1:/local/home/db2inst1:/bin/bash
db2fenc1:x:507:1004:db2fenc1:/local/home/db2fenc1:/bin/bash
db2das1:x:507:675:db2das1:/local/home/db2das1:/bin/bash
+@nis1_access
+@nis2_access
+

56.4.3 NIS+环境下无法用su切换本地账号

在root下修改了某个本地账号的密码,但其它普通用户无法用su切换到该用户(输入了正确的密码),总提示密码错误!

解决办法:编辑文件/etc/nsswitch.conf
做下面的修改:
passwd: compat
shadow: compat
—>
passwd: files ldap
shadow: files ldap

57 vnc

启动vnc服务器:

$ vncserver

启动正常后,会在输出中显示session号。

修改密码:

$ vncpasswd

删除自己的session(假设session号为3):

$ vncserver -kill :3

共享剪贴板:
在VNC View中打开一个Terminal,输入vncconfig会启动一个配置窗口(默认共享剪贴板相关选项都已经被选上),这时就可以共享剪贴板了。
说明:vncconfig的窗口不能关闭,一旦关闭将不能再共享剪贴板。如果觉得窗口碍事,可以运行:

$ vncconfig -nowin &

57.1 Tips:设置分辨率(xrandr)

下面介绍已经通过VNC连接服务器后,如何调整分辨率。

在远程机器(VNC窗口中的机器)上,执行 xrandr 命令,会显示当前的分辨率和可以设置的分辨率列表。下面是它运行输出的一个例子:

$ xrandr
Screen 0: minimum 640 x 480, current 1024 x 768, maximum 1920 x 1200
default connected 1024x768+0+0 0mm x 0mm
   1920x1200      60.0
   1920x1080      60.0
   1600x1200      60.0
   1680x1050      60.0
   1400x1050      60.0
   1360x768       60.0
   1280x1024      60.0
   1280x960       60.0
   1280x800       60.0
   1280x720       60.0
   1024x768       60.0*
   800x600        60.0
   640x480        60.0

上面输出中,行末尾有星号标记的那行是正在使用的分辨率。
要改为其它的分辨率,可以使用 xrandr -s 命令。 例如:

$ xrandr -s "1280x720"
$ xrandr -s 9                 # 同上。数字9为1280x720在上面分辨率列表中的标号(第一个的标号为零)

上面命令执行完后,分辨率会马上更改为“1280x720”。

57.1.1 增加新分辨率

xrandr -s 命令只能设置 xrandr 命令列出的已经存在的分辨率。如何增加一个新的分辨率呢?

第一步,用cvt命令生成一个分辨率的modeline。
假设我们要增加的新分辨率为“1024x1600”(这个分辨率适合于竖立的显示器),则用cvt生成modeline的方法如下:

$ cvt 1024 1600 60
# 1024x1600 59.90 Hz (CVT) hsync: 99.32 kHz; pclk: 138.25 MHz
Modeline "1024x1600_60.00"  138.25  1024 1104 1208 1392  1600 1603 1613 1658 -hsync +vsync

第二步,复制上面的输出,通过 xrandr --newmode 命令告诉xrandr。

$ xrandr --newmode "1024x1600_60.00"  138.25  1024 1104 1208 1392  1600 1603 1613 1658 -hsync +vsync

第三步,通过 xrandr --addmode 命令增加这个分辨率。

$ xrandr --addmode OUTPUT 1024x1600_60.00   # you need change OUTPUT to VGA-0/default/etc.

说明:上面命令中的OUTPUT需要修改为xrandr输出中的对应值,如运行xrandr后其输出像下面这样:

$ xrandr
Screen 0: minimum 640 x 480, current 1024 x 768, maximum 1920 x 1200
default connected 1024x768+0+0 0mm x 0mm
......

则OUTPUT就是“default”,即把前面的命令改为:

$ xrandr --addmode default 1024x1600_60.00

第四步,通过 xrandr -s 设置分辨率为新增加的分辨率。

$ xrandr -s 1024x1600

58 wget

wget是常用的一个非交互式下载工具。

实例:断点续传(-c)

$ wget -c http://example.com/really-big-file.iso

其中 -c 选项的作用为断点续传。

实例:批量下载(-i)

$ wget -i filename.txt

把所有需要下载文件的地址放到filename.txt中,然后wget就会自动为你下载所有文件了。

实例:镜像备份

$ wget -mk -w 20 http://www.example.com/

说明:
-m 表示镜像下载。
-k(或者–convert-links) 表示转换连接,HTML文件存盘时,将其中的非相对连接转换成为相对连接。
-w 20 表示间隔20秒下载一个文件,这样可以避免网站的访问过于频繁。
注:如果网站中的图像是放在另外的站点上,那么还应该再加上 -H 选项(表示当递归时转到外部主机)。

实例:下载时不发送User-Agent
有时会现在用浏览器能正常访问,但用wget却不能下载的情况,出现下面类似的错误,这很可能是服务器对wget做下载限制。
HTTP request sent, awaiting response… 403 Forbidden
解决办法:清除wget发送的User-Agent,即设置–user-agent为空:

$ wget -k --user-agent="" http://www.xxx.com/index.html

实例:忽略robots.txt协议进行下载(-e robots=off)
默认地,wget会尊重网站的robots.txt,如果robots.txt里有“User-agent: * Disallow: /”,那么wget无法镜像网站或者下载目录。增加“-e robots=off”选项可去除这个限制。

参考:https://www.gnu.org/software/wget/manual/html_node/Wgetrc-Commands.html

59 whatis

如果只想知道某个命令或函数的简单介绍,可以用whatis命令。如:

$ whatis scp
scp (1)              - secure copy (remote file copy program)

如果命令或函数存在于多个章节中,会全部显示出来。如:

$ whatis sleep
sleep (1)            - delay for a specified amount of time
sleep (3)            - sleep for the specified number of seconds

注:whatis command的输出其实就是man command输出的NAME节部分的内容。

60 wine

Wine (recursive acronym for Wine Is Not an Emulator) is a free and open source compatibility layer software application that aims to allow applications designed for Microsoft Windows to run on Unix-like operating systems.

Tips:64位Linux系统下,最好设置环境变量WINEARCH为win32,这样更加运行稳定!

60.1 wine安装office2007

测试环境:
Ubuntu 14.04

安装过程比较顺利,有两点要特别注意:

  1. 启动wine前必须设置环境变量WINEARCH为win32(只有在纯32位环境下office 2007才稳定,否则会出现各种问题)
  2. 运行winecfg时,在libraries中必须设置riched20为native(如果不设置的话PowerPoint无法启动!)

问题:英文系统中无法输入中文
思路:在用wine启动程序前先设置LC_ALL=zh_CN.UTF8
具体办法:修改文件夹~/.local/share/applications/中的desktop文件。

$ find . -name "wine-extension*" -print0 | xargs -0 sed -i 's/ wine / LC_ALL=zh_CN.UTF8 wine /g'

参考:
Ubuntu 12.04的wine1.6里安装Microsoft Office 2010: http://linzhibin824.blog.163.com/blog/static/73557710201362743945309/

60.1.1 安装插件SaveAsPDFandXPS

微软官方有 SaveAsPDFandXPS.exe 的下载,下载后用wine直接安装即可!

60.2 wine中文乱码

wine乱码问题的原因很简单:一些windows有的字体,在Linux下却不存在,因此就产生了乱码。最常见的乱码现象是大部分中文对话框里的“确定”、“放弃”等功能钮变成了“口”或者是“<<"等字符。

方法1:通过修改注册表,把默认字体设置为系统中存在的字体。
方法2:安装缺失的字体。

注:如果是英文系统,试试在启动wine时,输入如下命令:

$ env LANG="zh_CN.UTF-8" wine program.exe

61 wkhtmltopdf

wkhtmltopdf and wkhtmltoimage are open source (LGPLv3) command line tools to render HTML into PDF and various image formats using the Qt WebKit rendering engine.

wkhtmltopdf默认生成的pdf大小为A4、会按照网页结构生成书签。
实例1:把google主页保存为google.pdf

$ wkhtmltopdf http://google.com google.pdf

实例2:把http://www.xx.com/1.html 保存为1.pdf,且设置页面大小为A3,不要生成书签。

$ wkhtmltopdf -L 5mm -R 5mm -T 5mm -B 0mm -s A3 --no-outline http://www.xx.com/1.html 1.pdf

说明:
-L 5mm -R 5mm -T 5mm -B 0mm 的作用为设置左右上下的页边距。
-s A3 的作用是设置页面大小。
--no-outline 的作用是不生成书签。
如果发现背景太深,则可使用这个选项去掉背景: --no-background

乱码问题及其解决:
如果网页的编码格式不为utf-8,比如编码格式为gb2312或GBK,则中文网页可能会出现乱码的现象。(在Windows下发现的这个问题,在Linux下好像没有!)
仔细阅读wkhtmltopdf的帮助信息,发现有个选项–encoding,但是加入参数–encoding GBK或–encoding GB2312也没有解决乱码的问题。
解决办法:先把页面用浏览器保存到本地,用记事本打开,选择另存为,把编码ANSI改为UTF-8,把本地路径的URL用wkhtmltopdf转换一下即可生成对应的pdf。

62 write和wall和mesg

write
向某个用户发送消息。用法:write user [tty]

wall
发消息给所有用户。

mesg
用来控制是否接收消息。

63 xargs

xargs reads items from the standard input, delimited by blanks (which can be protected with double or single quotes or a backslash) or newlines, and executes the command (default is /bin/echo) one or more times with any initial-arguments followed by items read from standard input. Blank lines on the standard input are ignored.

从标准输入获取参数(称为items,以blank或newline分隔),并执行命令。

基本格式为:xargs [command [initial-arguments]]

63.1 实例:xargs行为的说明

$ cat 1.txt
123 456 789
   abc   def
$ xargs <1.txt cat -n
cat: 123: No such file or directory
cat: 456: No such file or directory
cat: 789: No such file or directory
cat: abc: No such file or directory
cat: def: No such file or directory

如果当前文件夹中不存在名为123,456,789, abc,def的文件,则执行xargs <1.txt cat -n会提示上面的错误。如何理解?
xargs <1.txt cat -n相当于把1.txt中的内容按空格和空行分隔,作为后面命令的参数。即相当于执行cat -n 123 456 789 abc def

63.2 xargs和find连用

find是个很强大的命令,它自己也有-exec这样的参数可以用来执行命令。但它不够直观,我们可以用xargs来实现相同的功能。

在当前目录下查找“*.bak”文件,然后将查找出的内容传给后面的“rm”命令

$ find . -name "*.bak" -exec rm {} \;

下面的命令实现了相同的功能,且更容易理解:

$ find . -name "*.bak" | xargs rm

但有个问题:我们知道在Linux下空格和换行都可以用来文件名。而xargs以空格和换行做分隔,这样就有麻烦了,xargs会把一个中间有一空格的文件名处理为两个文件。
这个问题可通过改变xargs的默认分隔符来解决。

$ find . -name "*.bak" -print0 | xargs -null rm
$ find . -name "*.bak" -print0 | xargs -0 rm      # 和前面相同

xargs指定-null或-0,将以null字符做分隔符读取items。find指定-print0,输出以null字符分隔的列表。(特别注意:-print0必须放最后面,千万不能这么写find . -print0 -name "*.bak" | xargs -0 rm,否则当前文件夹的内容会被清空!)

63.3 指定一次提交多少个items(选项-n)

每次向后面的命令提交多少个item?可以通过-n选项指定。
考虑前面的例子,如xargs -n 2 <1.txt cat -n,指定每次提交2个items,这相当于执行如下三次cat命令:

cat -n 123 456
cat -n 789 abc
cat -n def

我们知道,在删除大量文件时,容易出现“参数列太长”或“参数列溢出”的错误。这时-n选项非常有用!

$ ls | xargs -n 20 rm -fr

ls输出所有的文件名(用换行分割),xargs将ls的输出,每20个为一组,传递为rm -rf的参数。
也就是说将所有文件名20个为一组,由rm -rf删除,这样就不会超过命令行的长度了。

63.4 指定一次提交多少行items(选项-L)

和-n类似,但是它指定每次提交多少行item。
接前面例子,xargs -L 1 <1.txt cat -n相当于执行:

$ cat -n 123 456 789
$ cat -n abc def

63.5 指定item的占位符(选项-I)

指定一个替换item的字符(如{}),command后的{}都会替换成item。

如,把当前文件夹下的所有文件都复制一份:

$ ls |xargs -I{} cp {} {}.bak
$ ls |xargs -Iabc cp abc abc.bak   # 和上面功能一样。但不推荐这样写。

注:指定-I后,隐含着指定-L 1。

63.6 测试xargs(选项-t)

指定-t后,在执行具体命令前,先会打印出命令!
xargs到底干了什么?指定-t后清清楚楚!前面所有测试加上-t后,一目了然!

64 xhost

xhost is a program that controls access for X server.

问题:在VNC Viewer中可以在终端中正常启动xclock,但如果在终端中切换为另一用户后,却无法启动xclock,提示下面错误:
No protocal specified
Error: Can't open display: :1.0

解决办法:在切换用户之前,先在终端中运行下面命令:

$ xhost +
access control disabled, clients can connect from any host

再切换用户,可正常启动xclock。

65 xmodmap

xmodmap is a simple tool that lets you remap/swap keys for apps running under X11.

Example:Swap {Return, End}
Creat a file at ~/.Xmodmap with this content:

! -*- coding: utf-8 -*-
! swap keys {return, end}

! keycode  36 = Return NoSymbol Return
! keycode 115 = End NoSymbol End

keycode 36 = End NoSymbol End
keycode 115 = Return NoSymbol Return

Then run xmodmap ~/.Xmodmap.

参考:http://xahlee.info/linux/linux_xmodmap_tutorial.html

66 xsel

xsel是对X selection操作的程序。The X server maintains three selections, called PRIMARY, SECONDARY and CLIPBOARD.

Table 8: Three selections in X server
selection类型 显示其内容的方法 说明
primary xsel -p -o 鼠标中键操作的是这个selection
secondary xsel -s -o 很少使用
clipboard xsel -b -o Ctrl+C, Ctrl+V使用这个selection

67 yacc

BtYacc: BackTracking Yacc

a BtYacc patch page: http://www.vendian.org/mncharity/dir3/btyacc/

67.1 BtYacc应用

Q. Tell me more about the CobolTransformer Cobol parser.
A. It is written in BackTracking Yacc and C++. Lex is not used, lexer is written in C++. BackTracking Yacc is freely available fromhttp://www.cobolproducts.com/btyacc/. It is a regular Berkeley Yacc with modifications by Chris Dodd and by Vadim Maslov of Siber Systems. The most important improvement for us is that BtYacc may backtrack and thus parse languages that require lookahead of more than 1. Cobol is one of these languages.

来自:CobolTransformer, Toolkit & Library

68 yes

yes 命令重复的输出给定的字符串直到终止它,字符串后接行号符。 如果没有指定字符串,它重复的输出“y”直到终止它。有些脚本可能需要用户回答“y”或者“n”(例如:你确认要删除这个文件吗,[y/N])。

例如:

$ yes | apt-get install packagename          # 这仅是演示yes的例子,使用apt-get -y install packagename更好

当然,你也可以让yes自动回复字符串“no”,如:

$ yes no | apt-get install packagename

69 zdump

zdump - timezone dumper

zdump可查看夏令时,如:

$ zdump -v PRC
PRC  -9223372036854775808 = NULL
PRC  -9223372036854689408 = NULL
PRC  Sat Dec 31 15:54:07 1927 UTC = Sat Dec 31 23:59:59 1927 LMT isdst=0 gmtoff=29152
PRC  Sat Dec 31 15:54:08 1927 UTC = Sat Dec 31 23:54:08 1927 CST isdst=0 gmtoff=28800
PRC  Sun Jun  2 15:59:59 1940 UTC = Sun Jun  2 23:59:59 1940 CST isdst=0 gmtoff=28800
PRC  Sun Jun  2 16:00:00 1940 UTC = Mon Jun  3 01:00:00 1940 CDT isdst=1 gmtoff=32400
PRC  Mon Sep 30 14:59:59 1940 UTC = Mon Sep 30 23:59:59 1940 CDT isdst=1 gmtoff=32400
PRC  Mon Sep 30 15:00:00 1940 UTC = Mon Sep 30 23:00:00 1940 CST isdst=0 gmtoff=28800
PRC  Sat Mar 15 15:59:59 1941 UTC = Sat Mar 15 23:59:59 1941 CST isdst=0 gmtoff=28800
PRC  Sat Mar 15 16:00:00 1941 UTC = Sun Mar 16 01:00:00 1941 CDT isdst=1 gmtoff=32400
PRC  Tue Sep 30 14:59:59 1941 UTC = Tue Sep 30 23:59:59 1941 CDT isdst=1 gmtoff=32400
PRC  Tue Sep 30 15:00:00 1941 UTC = Tue Sep 30 23:00:00 1941 CST isdst=0 gmtoff=28800
PRC  Sat May  3 15:59:59 1986 UTC = Sat May  3 23:59:59 1986 CST isdst=0 gmtoff=28800
PRC  Sat May  3 16:00:00 1986 UTC = Sun May  4 01:00:00 1986 CDT isdst=1 gmtoff=32400
PRC  Sat Sep 13 14:59:59 1986 UTC = Sat Sep 13 23:59:59 1986 CDT isdst=1 gmtoff=32400
PRC  Sat Sep 13 15:00:00 1986 UTC = Sat Sep 13 23:00:00 1986 CST isdst=0 gmtoff=28800
PRC  Sat Apr 11 15:59:59 1987 UTC = Sat Apr 11 23:59:59 1987 CST isdst=0 gmtoff=28800
PRC  Sat Apr 11 16:00:00 1987 UTC = Sun Apr 12 01:00:00 1987 CDT isdst=1 gmtoff=32400
PRC  Sat Sep 12 14:59:59 1987 UTC = Sat Sep 12 23:59:59 1987 CDT isdst=1 gmtoff=32400
PRC  Sat Sep 12 15:00:00 1987 UTC = Sat Sep 12 23:00:00 1987 CST isdst=0 gmtoff=28800
PRC  Sat Apr  9 15:59:59 1988 UTC = Sat Apr  9 23:59:59 1988 CST isdst=0 gmtoff=28800
PRC  Sat Apr  9 16:00:00 1988 UTC = Sun Apr 10 01:00:00 1988 CDT isdst=1 gmtoff=32400
PRC  Sat Sep 10 14:59:59 1988 UTC = Sat Sep 10 23:59:59 1988 CDT isdst=1 gmtoff=32400
PRC  Sat Sep 10 15:00:00 1988 UTC = Sat Sep 10 23:00:00 1988 CST isdst=0 gmtoff=28800
PRC  Sat Apr 15 15:59:59 1989 UTC = Sat Apr 15 23:59:59 1989 CST isdst=0 gmtoff=28800
PRC  Sat Apr 15 16:00:00 1989 UTC = Sun Apr 16 01:00:00 1989 CDT isdst=1 gmtoff=32400
PRC  Sat Sep 16 14:59:59 1989 UTC = Sat Sep 16 23:59:59 1989 CDT isdst=1 gmtoff=32400
PRC  Sat Sep 16 15:00:00 1989 UTC = Sat Sep 16 23:00:00 1989 CST isdst=0 gmtoff=28800
PRC  Sat Apr 14 15:59:59 1990 UTC = Sat Apr 14 23:59:59 1990 CST isdst=0 gmtoff=28800
PRC  Sat Apr 14 16:00:00 1990 UTC = Sun Apr 15 01:00:00 1990 CDT isdst=1 gmtoff=32400
PRC  Sat Sep 15 14:59:59 1990 UTC = Sat Sep 15 23:59:59 1990 CDT isdst=1 gmtoff=32400
PRC  Sat Sep 15 15:00:00 1990 UTC = Sat Sep 15 23:00:00 1990 CST isdst=0 gmtoff=28800
PRC  Sat Apr 13 15:59:59 1991 UTC = Sat Apr 13 23:59:59 1991 CST isdst=0 gmtoff=28800
PRC  Sat Apr 13 16:00:00 1991 UTC = Sun Apr 14 01:00:00 1991 CDT isdst=1 gmtoff=32400
PRC  Sat Sep 14 14:59:59 1991 UTC = Sat Sep 14 23:59:59 1991 CDT isdst=1 gmtoff=32400
PRC  Sat Sep 14 15:00:00 1991 UTC = Sat Sep 14 23:00:00 1991 CST isdst=0 gmtoff=28800
PRC  9223372036854689407 = NULL
PRC  9223372036854775807 = NULL

注:isdst为1时表示夏令时。

对于经常使用夏令时的时区,zdump的输出信息会更多,如:

$ zdump -v Europe/Moscow

什么是夏令时?
夏时制(Daylight Saving Time:DST),又称“日光节约时制”和“夏令时间”,是一种为节约能源而人为规定地方时间的制度,在这一制度实行期间所采用的统一时间称为“夏令时间”。一般在天亮早的夏季人为将时间提前一小时,可以使人早起早睡,减少照明量,以充分利用光照资源,从而节约照明用电。各个采纳夏时制的国家具体规定不同。目前全世界有近110个国家每年要实行夏令时。 自2011年3月27日开始俄罗斯永久使用夏令时,把时间拨快一小时,不再调回(当然这也可以说是不再使用夏令时,因为从此后时间不再调来调去了)。

我国的夏令时。
1986年至1991年,中华人民共和国在全国范围实行了六年夏令时。
具体作法是:每年从四月中旬第一个星期日的凌晨2时整(北京时间),将时钟拨快一小时,即将表针由2时拨至3时,夏令时开始;到九月中旬第一个星期日的凌晨2时整(北京夏令时间),再将时钟拨回一小时,即将表针由2时拨至1时,夏令时结束。
如果你在夏令时出生的话,你的出生时间比显示的时间应该早1个小时!

参考:百度百科,夏令时


Author: cig01

Created: <2010-10-07 Thu 00:00>

Last updated: <2018-05-10 Thu 19:34>

Creator: Emacs 25.3.1 (Org mode 9.1.4)