Linux命令大全

1. ls - 显示目录内容列表

ls命令 用来显示目标列表,在Linux中是使用率较高的命令。ls命令的输出信息可以进行彩色加亮显
示,以分区不同类型的文件。

语法

1.  ls [选项] [文件名...]
2.  [-1abcdfgiklmnopqrstuxABCDFGLNQRSUX] [-w cols] [-T cols] [-I pattern] [--
full-time]
3.  [--format={long,verbose,commas,across,vertical,single-col‐umn}]
4.  [--sort={none,time,size,extension}] [--time={atime,access,use,ctime,status}]
5.  [--color[={none,auto,always}]] [--help] [--version] [--] 

选项

1.  -a, --all # 列出目录中所有文件,包括以“.”开头的文件。
2.  -b, --escape # 把文件名中不可输出的字符用反斜杠加字符编号(就象在 C 语言里一样)的形式列出。
3.  -c, --time=ctime, --time=status  # 按文件状态改变时间(i节点中的ctime)排序并输出目录内容。如采用长格式输出(选项“-l”),使用文件的状态改变时间取代文件修改时间。【译注:所谓文件状态改变(i节点中以ctime标志),既包括文件被修改,又包括文件属性( 如所有者、组、链接数等等)的变化】
4.  -d, --directory  # 将目录名象其它文件一样列出,而不是列出它们的内容。
5.  -f  # 不排序目录内容;按它们在磁盘上存储的顺序列出。同时启 动“ -a ”选项,如果在“ -f ”之前存在“ -l ”、“ - -color ”或“ -s ”,则禁止它们。
6.  -g # 忽略,为兼容UNIX用。
7.  -i, --inode  # 在每个文件左边打印 i 节点号(也叫文件序列号和索引号: file serial numberand index number)。i节点号在每个特定的文件系统中是唯一的。
8.  -k, --kilobytes # 如列出文件大小,则以千字节KB为单位。
9.  -l, --format=long, --format=verbose  # 除每个文件名外,增加显示文件类型、权限、硬链接数、所有者名、组名、大小(byte )、及时间信息(如未指明是 其它时间即指修改间)。对于6个月以上的文件或超出未来 1小时的文件,时间信息中的时分将被年代取代。每个目录列出前,有一行“总块数”显示目录下全部文件所 占的磁盘空间。块默认是1024字节;如果设置了 POSIXLY_CORRECT 的环境变量,除非用“ -k ”选项,则默认块大小是 512 字节。每一个硬链接都计入总块数(因此可能重复计数),这无 疑是个缺点。列出的权限类似于以符号表示(文件)模式的规范。
10.  -m, --format=commas 水平列出文件,每行尽可能多,相互用逗号和一个空格分隔。
11.  -n, --numeric-uid-gid # 列出数字化的 UID 和 GID 而不是用户名和组名。
12.  -o # 以长格式列出目录内容,但是不显示组信息。等于使用“ --format=long--no-group ”选项。提供此选项是为了与其它版本的 ls 兼容。
13.  -p # 在每个文件名后附上一个字符以说明该文件的类型。类似“ -F ”选项但是不标示可执行文件。
14.  -q, --hide-control-chars  # 用问号代替文件名中非打印的字符。这是缺省选项。
15.  -r, --reverse  # 逆序排列目录内容。
16.  -s, --size  # 在每个文件名左侧输出该文件的大小,以 1024 字节的块为单位。如果设置了POSIXLY_CORRECT # 的环境变量,除非用“ -k ”选项,块大小是 512 字节。
17.  -t, --sort=time # 按文件最近修改时间( i 节点中的 mtime )而不是按文件名字典序排序,新文件 靠前。
18.  -u, --time=atime, --time=access, --time=use  # 类似选项“ -t ”,但是用文件最近访问时间( i 节点中的 atime)取代文件修改时间。如果使用长格式列出,打印的时间是最近访问时间。
19.  -w, --width cols # 假定屏幕宽度是 cols ( cols 以实际数字取代)列。如未用此选项,缺省值是这样获得的:如可能先尝试取自终端驱动,否则尝试取自环境变量 COLUMNS(如果设置了的话),都不行则取 80 。
20.  -x, --format=across, --format=horizontal   # 多列输出,横向排序。
21.  -A, --almost-all   # 显示除 "." 和 ".." 外的所有文件。
22.  -B, --ignore-backups  # 不输出以“ ~ ”结尾的备份文件,除非已经在命令行中给出。
23.  -C, --format=vertical  #多列输出,纵向排序。当标准输出是终端时这是缺省项。使用命令名 dir 和 d 时, 则总是缺省的。
24.  -F, --classify, --file-type  # 在每个文件名后附上一个字符以说明该文件的类型。“ * ”表示普通的可执行文件; “ /”表示目录;“ @ ”表示符号链接;“ | ”表示FIFOs;“ = ”表示套接字 (sockets) ;什么也没有则表示普通文件。
25.  -G, --no-group  # 以长格式列目录时不显示组信息。
26.  -L, --dereference   # 列出符号链接指向的文件的信息,而不是符号链接本身。
27.  -N, --literal  # 不要用引号引起文件名。
28.  -Q, --quote-name   # 用双引号引起文件名,非打印字符以 C 语言的方法表示。
29.  -T, --tabsize cols  # 假定每个制表符宽度是 cols 。缺省为 8。为求效率, ls 可能在输出中使用制表符。 若cols 为123.  0,则不使用制表符。
30.  -X, --sort=extension  # 按文件扩展名(由最后的 "." 之后的字符组成)的字典序排序。没有扩展名的先列 
31.  -h ,以可读大小显示文件

参数 

目录:指定要显示列表的目录,也可以是具体的文件。 

实例 

1.  $ ls # 仅列出当前目录可见文件
2.  $ ls -l # 列出当前目录可见文件详细信息
3.  $ ls -hl # 列出详细信息并以可读大小显示文件大小
4.  $ ls -al # 列出所有文件(包括隐藏)的详细信息

显示当前目录下包括影藏文件在内的所有文件列表 

1.  [root@localhost ~]# ls -a
2.
. anaconda-ks.cfg .bash_logout .bashrc install.log .mysql_history
satools .tcshrc .vimrc
3.
.. .bash_history .bash_profile .cshrc install.log.syslog .rnd
.ssh .viminfo

输出长格式列表

1.  [root@localhost ~]# ls -1
2.
3.  anaconda-ks.cfg
4.  install.log
5.  install.log.syslog
6.  satools

显示文件的inode信息索引节点(index inode简称为“inode”)是Linux中一个特殊的概念,具有相同的索引节点号的两个文本本质上是同一个文件(除文件名不同外)。

1.  [root@localhost ~]# ls -i -l anaconda-ks.cfg install.log
2.  2345481 -rw------- 1 root root 859 Jun 11 22:49 anaconda-ks.cfg
3.  2345474 -rw-r--r-- 1 root root 13837 Jun 11 22:49 install.log

水平输出文件列表

1.  [root@localhost /]# ls -m
2.
3.
bin, boot, data, dev, etc, home, lib, lost+found, media, misc, mnt, opt, proc,
root, sbin, selinux, srv, sys, tmp, usr, var

修改最后一次编辑的文件
最近修改的文件显示在最上面。

1.  [root@localhost /]# ls -t
2.
tmp root etc dev lib boot sys proc data home bin sbin usr var
lost+found media mnt opt selinux srv misc

显示递归文件

1.  [root@localhost ~]# ls -R
2.  .:
3.  anaconda-ks.cfg install.log install.log.syslog satools
4.
5.  ./satools:
6.
black.txt freemem.sh iptables.sh lnmp.sh mysql php502_check.sh
ssh_safe.sh

打印文件的UID和GID

1.  [root@localhost /]# ls -n
2.
3.  total 254
4.  drwxr-xr-x 2 0 0 4096 Jun 12 04:03 bin
5.  drwxr-xr-x 4 0 0 1024 Jun 15 14:45 boot
6.  drwxr-xr-x 6 0 0 4096 Jun 12 10:26 data

列出文件和文件夹的详细信息

1.  [root@localhost /]# ls -l
2.
3.  total 254
4.  drwxr-xr-x 2 root root 4096 Jun 12 04:03 bin
5.  drwxr-xr-x 4 root root 1024 Jun 15 14:45 boot
6.  drwxr-xr-x 6 root root 4096 Jun 12 10:26 data

列出可读文件和文件夹详细信息

1.  [root@localhost /]# ls -lh
2.
3.  total 254K
4.  drwxr-xr-x 2 root root 4.0K Jun 12 04:03 bin
5.  drwxr-xr-x 4 root root 1.0K Jun 15 14:45 boot
6.  drwxr-xr-x 6 root root 4.0K Jun 12 10:26 data

显示文件夹信息

1.  [root@localhost /]# ls -ld /etc/
2.
3.  drwxr-xr-x 75 root root 4096 Oct 16 04:02 /etc/

按时间列出文件和文件夹详细信息

1.  [root@localhost /]# ls -lt
2.
3.  total 254
4.  drwxrwxrwt 3 root root 98304 Oct 16 08:53 tmp
5.  drwxr-xr-x 75 root root 4096 Oct 16 04:02 etc
6.  drwxr-x--- 4 root root 4096 Oct 15 14:43 root

按修改时间列出文件和文件夹详细信息

1.  [root@localhost /]# ls -ltr
2.
3.  total 254
4.  drwxr-xr-x 2 root root 4096 Nov 8 2010 misc
5.  drwxr-xr-x 2 root root 4096 May 11 2011 srv
6.  drwxr-xr-x 2 root root 4096 May 11 2011 selinux

按照特殊字符对文件进行分类

1.  [root@localhost nginx-1.2.1]# ls -F
2.
3.
auto/ CHANGES CHANGES.ru conf/ configure* contrib/ html/ LICENSE
Makefile man/ objs/ README src/

列出文件并标记颜色分类

1.  [root@localhost nginx-1.2.1]# ls --color=auto
2.
3.
auto CHANGES CHANGES.ru conf configure contrib html LICENSE Makefile
man objs README sr

2. grep - 强大的文本搜索工具

补充说明

grep (global search regular expression(RE) and print out the line,全面搜索正则表达式并把行打印出来)是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹配的行打印出来。用于过滤/搜索的特定字符。可使用正则表达式能多种命令配合使用,使用上十分灵活。 

选项 

1.  -A <显示行数> --after-context=<显示行数> # 除了显示符合范本样式的那一行之外,并显示该行之后的内容。
2.  -B<显示行数> --before-context=<显示行数> # 除了显示符合样式的那一行之外,并显示该行之前的内容。
3.  -c --count # 计算符合范本样式的列数。
4.  -C<显示行数> --context=<显示行数>或-<显示行数> # 除了显示符合范本样式的那一列之外,并显示该列之前后的内容。
5.  -d<进行动作> --directories=<动作> # 当指定要查找的是目录而非文件时,必须使用这项参数,否则grep命令将回报信息并停止动作。
6.  -e<范本样式> --regexp=<范本样式> # 指定字符串作为查找文件内容的范本样式。
7.  -E --extended-regexp # 将范本样式为延伸的普通表示法来使用,意味着使用能使用扩展正则表达式。
8.  -f<范本文件> --file=<规则文件> # 指定范本文件,其内容有一个或多个范本样式,让grep查找符合范本条件的文件内容,格式为每一列的范本样式。
9.  -F --fixed-regexp # 将范本样式视为固定字符串的列表。
10.  -G --basic-regexp # 将范本样式视为普通的表示法来使用。
11.  -h --no-filename # 在显示符合范本样式的那一列之前,不标示该列所属的文件名称。
12.  -H --with-filename # 在显示符合范本样式的那一列之前,标示该列的文件名称。
13.  -i --ignore-case # 忽略字符大小写的差别。
14.  -l --file-with-matches # 列出文件内容符合指定的范本样式的文件名称。
15.  -L --files-without-match # 列出文件内容不符合指定的范本样式的文件名称。
16.  -n --line-number # 在显示符合范本样式的那一列之前,标示出该列的编号。
17.  -R/-r --recursive # 此参数的效果和指定“-d recurse”参数相同。
18.  -v --revert-match # 反转查找。
19.  -V --version # 显示版本信息。
20.  -w --word-regexp # 只显示全字符合的列。
21.  -x --line-regexp # 只显示全列符合的列。
22.  -o # 只输出文件中匹配到的部分。
23.  -m <num> --max-count=<num> # 找到num行结果后停止查找,用来限制匹配行数

 规则表达式

1.  ^   # 锚定行的开始 如:'^grep'匹配所有以grep开头的行。
2.  $    # 锚定行的结束 如:'grep$' 匹配所有以grep结尾的行。
3.  .     # 匹配一个非换行符的字符 如:'gr.p'匹配gr后接一个任意字符,然后是p。
4.  *    # 匹配零个或多个先前字符 如:'*grep'匹配所有一个或多个空格后紧跟grep的行。
5.  .*    # 一起用代表任意字符。
6.  []     # 匹配一个指定范围内的字符,如'[Gg]rep'匹配Grep和grep。
7.  [^]   # 匹配一个不在指定范围内的字符,如:'[^A-FH-Z]rep'匹配不包含A-R和T-Z的一个字母开头,紧跟rep的行。
8.  \(..\)   # 标记匹配字符,如'\(love\)',love被标记为1。
9.  \<     # 锚定单词的开始,如:'\<grep'匹配包含以grep开头的单词的行。
10.  \>   # 锚定单词的结束,如'grep\>'匹配包含以grep结尾的单词的行。
11.  x\{m\}   # 重复字符x,m次,如:'0\{5\}'匹配包含5个o的行。
12.  x\{m,\}   # 重复字符x,至少m次,如:'o\{5,\}'匹配至少有5个o的行。
13.  x\{m,n\}   # 重复字符x,至少m次,不多于n次,如:'o\{5,10\}'匹配5--10个o的行。
14.  \w     # 匹配文字和数字字符,也就是[A-Za-z0-9],如:'G\w*p'匹配以G后跟零个或多个文字或数字字符,然后是p。
15.  \W   # \w的反置形式,匹配一个或多个非单词字符,如点号句号等。
16.  \b    # 单词锁定符,如: '\bgrep\b'只匹配grep。 

grep命令常见用法 

在文件中搜索一个单词,命令会返回一个包含 “match_pattern” 的文本行: 

1.  grep match_pattern file_name
2.  grep "match_pattern" file_name 

在多个文件中查找: 

1.  grep "match_pattern" file_1 file_2 file_3 ... 

 输出除之外的所有行 -v 选项:

 1.  grep -v "match_pattern" file_name

 标记匹配颜色 —color=auto 选项:

 1.  grep "match_pattern" file_name --color=auto

 使用正则表达式 -E 选项:

1.  grep -E "[1-9]+"
2.  # 或
3.  egrep "[1-9]+" 

 使用正则表达式 -P 选项:

 1.  grep -P "(\d{3}\-){2}\d{4}" file_name

 只输出文件中匹配到的部分 -o 选项:

 1.  echo this is a test line. | grep -o -E "[a-z]+\."
2.  line.
3.
4.  echo this is a test line. | egrep -o "[a-z]+\."
5.  line.

 统计文件或者文本中包含匹配字符串的行数 -c 选项:

 1.  grep -c "text" file_name

 输出包含匹配字符串的行数 -n 选项:

1.  grep "text" -n file_name
2.  # 或
3.  cat file_name | grep "text" -n
4.
5.  #多个文件
6.  grep "text" -n file_1 file_2

 打印样式匹配所位于的字符或字节偏移:

1.  echo gun is not unix | grep -b -o "not"
2.  7:not
3.  #一行中字符串的字符便宜是从该行的第一个字符开始计算,起始值为0。选项 **-b -o** 一般总是配
合使用。 

 搜索多个文件并查找匹配文本在哪些文件中:

1.  grep -l "text" file1 file2 file3... 

在多级目录中对文本进行递归搜索:

1.  grep "text" . -r -n
2.  # .表示当前目录。

 忽略匹配样式中的字符大小写:

1.  echo "hello world" | grep -i "HELLO"
2.  # hello

 选项 -e 制动多个匹配样式:

1.  echo this is a text line | grep -e "is" -e "line" -o
2.  is
3.  line
4.
5.  #也可以使用 **-f** 选项来匹配多个样式,在样式文件中逐行写出需要匹配的字符。
6.  cat patfile
7.  aaa
8.  bbb
9.
10.  echo aaa bbb ccc ddd eee | grep -f patfile -o

 在grep搜索结果中包括或者排除指定文件:

1.  # 只在目录中所有的.php和.html文件中递归搜索字符"main()"
2.  grep "main()" . -r --include *.{php,html}
3.
4.  # 在搜索结果中排除所有README文件
5.  grep "main()" . -r --exclude "README"
6.
7.  # 在搜索结果中排除filelist文件列表里的文件
8.  grep "main()" . -r --exclude-from filelist

 使用0值字节后缀的grep与xargs:

1.  # 测试文件:
2.  echo "aaa" > file1
3.  echo "bbb" > file2
4.  echo "aaa" > file3
5.
6.  grep "aaa" file* -lZ | xargs -0 rm
7.
8.
# 执行后会删除file1和file3,grep输出用-Z选项来指定以0值字节作为终结符文件名(\0),xargs
-0 读取输入并用0值字节终结符分隔文件名,然后删除匹配文件,-Z通常和-l结合使用。

 grep静默输出:

1.  grep -q "test" filename
2.  # 不会输出任何信息,如果命令运行成功返回0,失败则返回非0值。一般用于条件测试。

 打印出匹配文本之前或者之后的行:

1.  # 显示匹配某个结果之后的3行,使用 -A 选项:
2.  seq 10 | grep "5" -A 3
3.  5
4.  6
5.  7
6.  8
7.
8.  # 显示匹配某个结果之前的3行,使用 -B 选项:
9.  seq 10 | grep "5" -B 3
10.  2
11.  3
12.  4
13.  5
14.
15.  # 显示匹配某个结果的前三行和后三行,使用 -C 选项:
16.  seq 10 | grep "5" -C 3
17.  2
18.  3
19.  4 
25.  # 如果匹配结果有多个,会用“--”作为各匹配结果之间的分隔符:
26.  echo -e "a\nb\nc\na\nb\nc" | grep a -A 1
27.  a
28.  b
29.  --
30.  a
31.  b

3. awk - 文本和数据进行处理的编程语言

awk 是一种编程语言,用于在linux/unix下对文本和数据进行处理。数据可以来自标准输入(stdin)、一个或多个文件,或其它命令的输出。它支持用户自定义函数和动态正则表达式等先进功能,是linux/unix下的一个强大编程工具。它在命令行中使用,但更多是作为脚本来使用。awk有很多内建的功能,比如数组、函数等,这是它和C语言的相同之处,灵活性是awk最大的优势。

 awk命令格式和选项

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

常用命令选项

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

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

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

操作
操作由一个或多个命令、函数、表达式组成,之间由换行符或分号隔开,并位于大括号内,主要部分是:
变量或数组赋值
输出命令
内置函数
控制流语句

 awk脚本基本结构

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

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

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

 awk的工作原理

1.  awk 'BEGIN{ commands } pattern{ commands } END{ commands }'

第一步:执行 BEGIN{ commands }  语句块中的语句;
第二步:从文件或标准输入(stdin)读取一行,然后执行 pattern{ commands }  语句块,它逐
行扫描文件,从第一行到最后一行重复这个过程,直到文件全部被读取完毕。
第三步:当读至输入流末尾时,执行 END{ commands }  语句块。
BEGIN语句块 在awk开始从输入流中读取行 之前 被执行,这是一个可选的语句块,比如变量初始化、打印输出表格的表头等语句通常可以写在BEGIN语句块中。
END语句块 在awk从输入流中读取完所有的行之后即被执行,比如打印所有行的分析结果这类信息汇总都是在END语句块中完成,它也是一个可选语句块。
pattern语句块中的通用命令是最重要的部分,它也是可选的。如果没有提供pattern语句块,则默认执行 { print }  ,即打印每一个读取到的行,awk读取的每一行都会执行该语句块

1.  echo -e "A line 1\nA line 2" | awk 'BEGIN{ print "Start" } { print } END{ print "End" }'
2.  Start
3.  A line 1
4.  A line 2
5.  End

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

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

 双引号拼接使用:

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

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

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

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

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

示例:

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

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

1.  echo -e "line1 f2 f3\n line2 f4 f5" | awk '{print $NF}'
2.  f3
3.  f5

1.  echo -e "line1 f2 f3\n line2 f4 f5" | awk '{print $(NF-1)}'
2.  f2
3.  f4

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

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

 统计文件中的行数:

1.  awk 'END{ print NR }' filename

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

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

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

将外部变量值传递给awk

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

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

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

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

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

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

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

查找进程pid

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

awk运算与判断:算术运算符

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

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

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

赋值运算符

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

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

逻辑运算符

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

正则运算符

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

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

关系运算符

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

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

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

其它运算符

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

1.  awk 'BEGIN{a="b";print a=="b"?"ok":"err";}'
2.  ok

1.  awk 'BEGIN{a="b";arr[0]="b";arr[1]="c";print (a in arr);}'
2.  0

1.  awk 'BEGIN{a="b";arr[0]="b";arr["b"]="c";print (a in arr);}'
2.  1

运算级优先级表

!级别越高越优先
级别越高越优先

awk高级输入输出

读取下一条记录

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

1.  cat text.txt
2.  a
3.  b
4.  c
5.  d
6.  e
7.
8.  awk 'NR%2==1{next}{print NR,$0;}' text.txt
9.  2 b
10.  4 d

当记录行号除以2余1,就跳过当前行。下面的 print NR,$0  也不会执行。下一行开始,程序有开始
判断 NR%2  值。这个时候记录行号是 :2  ,就会执行下面语句块: 'print NR,$0'
分析发现需要将包含有“web”行进行跳过,然后需要将内容与下面行合并为一行:

1.  cat text.txt
2.  web01[192.168.2.100]
3.  httpd ok
4.  tomcat ok
5.  sendmail ok
6.  web02[192.168.2.101]
7.  httpd ok
8.  postfix ok
9.  web03[192.168.2.102]
10.  mysqld ok
11.  httpd ok
12.  0
13.  awk '/^web/{T=$0;next;}{print T":t"$0;}' test.txt
14.  web01[192.168.2.100]: httpd ok
15.  web01[192.168.2.100]: tomcat ok
16.  web01[192.168.2.100]: sendmail ok
17.  web02[192.168.2.101]: httpd ok
18.  web02[192.168.2.101]: postfix ok
19.  web03[192.168.2.102]: mysqld ok
20.  web03[192.168.2.102]: httpd ok

简单地读取一条记录

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

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

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

当其左右无重定向符 |  或 <  时: getline作用于当前文件,读入当前文件的第一行给其后跟
的变量 var  或 $0  (无变量),应该注意到,由于awk在处理getline之前已经读入了一行,
所以getline得到的返回结果是隔行的。

当其左右有重定向符 |  或 <  时: getline则作用于定向输入文件,由于该文件是刚打开,并
没有被awk读入一行,只是getline读入,那么getline返回的是该文件的第一行,而不是隔
行。

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

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

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

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

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

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

关闭文件

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

1.  close("filename")

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

输出到一个文件

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

1.  echo | awk '{printf("hello word!n") > "datafile"}'
2.  # 或
3.  echo | awk '{printf("hello word!n") >> "datafile"}'

设置字段定界符

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

1.  awk -F: '{ print $NF }' /etc/passwd
2.  # 或
3.  awk 'BEGIN{ FS=":" } { print $NF }' /etc/passwd

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

流程控制语句

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

条件判断语句

1.  if(表达式)
2.  语句1
3.  else
4.  语句2

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

1.  if(表达式)
2.  {语句1}
3.  else if(表达式)
4.  {语句2}
5.  else
6.  {语句3}

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

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

循环语句

# while语句

1.  while(表达式)
2.  {语句}

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

# for循环

for循环有两种格式:
格式1:

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

1.  awk 'BEGIN{for(k in ENVIRON){print k"="ENVIRON[k];}}'
7.  TERM=linux
8.  G_BROKEN_FILENAMES=1
9.  SHLVL=1
10.  pwd=/root/text
11.  ...
12.  logname=root
13.  HOME=/root
14.  SSH_CLIENT=192.168.1.21 53087 22

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

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

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

# do循环

1.  do
2.  {语句} while(条件)

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

其他语句

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

数组应用

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

数组的定义

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

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

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

1.  Array["first"]="www"
2.  Array"[last"]="name"
3.  Array["birth"]="1987"

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

读取数组的值

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

数组相关函数

得到数组长度:

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

二维、多维数组使用

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

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

1.  awk 'BEGIN{for(i=1;i<=9;i++){for(j=1;j<=9;j++){tarr[i,j]=i*j; print i,"*",j,"=",tarr[i,j];}}}'
8.  1 * 1 = 1
9.  1 * 2 = 2
10.  1 * 3 = 3
11.  1 * 4 = 4
12.  1 * 5 = 5
13.  1 * 6 = 6
14.  ...
15.  9 * 6 = 54
16.  9 * 7 = 63
17.  9 * 8 = 72
18.  9 * 9 = 81

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

另一种方法:

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

内置函数

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

算术函数

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

举例说明:

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

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

获得随机数:

1.  awk 'BEGIN{srand();fr=int(100*rand());print fr;}'
2.  78
3.  awk 'BEGIN{srand();fr=int(100*rand());print fr;}'
4.  31
5.  awk 'BEGIN{srand();fr=int(100*rand());print fr;}'
6.  41

字符串函数

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

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

gsub,sub使用

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

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

查找字符串(index使用)

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

未找到,返回0

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

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

截取字符串(substr使用)

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

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

字符串分割(split使用)

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

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

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

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

%d     十进制有符号整数
%u     十进制无符号整数
%f       浮点数
%s      字符串
%c      单个字符 %p 指针的值
%e      指数形式的浮点数
%x %X    无符号以十六进制表示的整数
%o        无符号以八进制表示的整数
%g       自动选择合适的表示法

1.  awk 'BEGIN{n1=124.113;n2=-1.224;n3=1.2345;
printf("%.2f,%.2u,%.2g,%X,%on",n1,n2,n3,n1,n1);}'
2.  124.11,18446744073709551615,1.2,7C,174

一般函数

close(Expression )          用同一个带字符串值的Expression 参数来关闭由print 或 printf 语句打开的或调用 getline 函数打开的文件或管道。如果文件或管道成功关闭,则返回 0;其它情况下返回非零值。如果打算写一个文件,并稍后在同一个程序中读取文件,则close 语句是必需的

system(command)         执行 Command 参数指定的命令,并返回退出状态。等同于 system 子例程。

打开外部文件(close用法)

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

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

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

1.  awk 'BEGIN{print "Enter your name:";getline name;print name;}'
2.  Enter your name:
3.  chengmo
4.  chengmo

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

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

b返回值,是执行结果。

时间函数

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

 strftime日期和时间格式说明符

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

建指定时间(mktime使用)

1.  awk 'BEGIN{tstamp=mktime("2001 01 01 12 12 12");print strftime("%c",tstamp);}'
2.  2001年01月01日 星期一 12时12分12秒

1.  awk 'BEGIN{tstamp1=mktime("2001 01 01 12 12 12");tstamp2=mktime("2001 02 01 0 0
0");print tstamp2-tstamp1;}'
2.  2634468

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

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

4. sed - 功能强大的流式文本编辑器

sed 是一种流编辑器,它是文本处理中非常重要的工具,能够完美的配合正则表达式使用,功能不同凡响。处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”(pattern space),接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下一行,这样不断重复,直到文件末尾。文件内容并没有 改变,除非你使用重定向存储输出。Sed主要用来自动编辑一个或多个文件;简化对文件的反复操作;编写转换程序等。

sed的选项、命令、替换标记

1.  sed [options] 'command' file(s)
2.  sed [options] -f scriptfile file(s)

1.  -e<script>或--expression=<script>:以选项中的指定的script来处理输入的文本文件;
2.  -f<script文件>或--file=<script文件>:以选项中指定的script文件来处理输入的文本文件;
3.  -h或--help:显示帮助;
4.  -n或--quiet或——silent:仅显示script处理后的结果;
5.  -V或--version:显示版本信息

文件:指定待处理的文本文件列表。

1.  a\ # 在当前行下面插入文本。
2.  i\ # 在当前行上面插入文本。
3.  c\ # 把选定的行改为新的文本。
4.  d # 删除,删除选择的行。
5.  D # 删除模板块的第一行。
6.  s # 替换指定字符
7.  h # 拷贝模板块的内容到内存中的缓冲区。
8.  H # 追加模板块的内容到内存中的缓冲区。
9.  g # 获得内存缓冲区的内容,并替代当前模板块中的文本。
10.  G # 获得内存缓冲区的内容,并追加到当前模板块文本的后面。
11.  l # 列表不能打印字符的清单。
12.  n # 读取下一个输入行,用下一个命令处理新的行而不是用第一个命令。
13.  N # 追加下一个输入行到模板块后面并在二者间嵌入一个新行,改变当前行号码。
14.  p # 打印模板块的行。
15.  P # (大写) 打印模板块的第一行。
16.  q # 退出Sed。
17.  b lable # 分支到脚本中带有标记的地方,如果分支不存在则分支到脚本的末尾。
18.  r file # 从file中读行。
19.  t label # if分支,从最后一行开始,条件一旦满足或者T,t命令,将导致分支到带有标号的命令处,或者到脚本的末尾。
20.  T label # 错误分支,从最后一行开始,一旦发生错误或者T,t命令,将导致分支到带有标号的命令处,或者到脚本的末尾。
21.  w file # 写并追加模板块到file末尾。
22.  W file # 写并追加模板块的第一行到file末尾。
23.  ! # 表示后面的命令对所有没有被选定的行发生作用。
24.  = # 打印当前行号码。
25.  # # 把注释扩展到下一个换行符以前。

sed替换标记

1.  g # 表示行内全面替换。
2.  p # 表示打印行。
3.  w # 表示把行写入一个文件。
4.  x # 表示互换模板块中的文本和缓冲区中的文本。
5.  y # 表示把一个字符翻译为另外的字符(但是不用于正则表达式)
6.  \1 # 子串匹配标记
7.  & # 已匹配字符串标记

sed元字符集

1.  ^  # 匹配行开始,如:/^sed/匹配所有以sed开头的行。
2.  $  # 匹配行结束,如:/sed$/匹配所有以sed结尾的行。
3.  .  # 匹配一个非换行符的任意字符,如:/s.d/匹配s后接一个任意字符,最后是d。
4.  *  # 匹配0个或多个字符,如:/*sed/匹配所有模板是一个或多个空格后紧跟sed的行。
5.  []  # 匹配一个指定范围内的字符,如/[ss]ed/匹配sed和Sed。
6.  [^]  # 匹配一个不在指定范围内的字符,如:/[^A-RT-Z]ed/匹配不包含A-R和T-Z的一个字母开头,紧跟ed的行。
7.  \(..\)  # 匹配子串,保存匹配的字符,如s/\(love\)able/\1rs,loveable被替换成lovers。
8.  &  # 保存搜索字符用来替换其他字符,如s/love/ **&** /,love这成 **love** 。
9.  \<  # 匹配单词的开始,如:/\<love/匹配包含以love开头的单词的行。
10.  \>  # 匹配单词的结束,如/love\>/匹配包含以love结尾的单词的行。
11.  x\{m\}      # 重复字符x,m次,如:/0\{5\}/匹配包含5个0的行。
12.  x\{m,\}     # 重复字符x,至少m次,如:/0\{5,\}/匹配至少有5个0的行。
13.  x\{m,n\}   # 重复字符x,至少m次,不多于n次,如:/0\{5,10\}/匹配5~10个0的行。

替换操作:s命令

替换文本中的字符串:

1.  sed 's/book/books/' file

-n选项 和 p命令 一起使用表示只打印那些发生替换的行: 

sed -n ‘s/test/TEST/p’ file

直接编辑文件 选项-i ,会匹配file文件中每一行的所有book替换为books:

1.  sed -i 's/book/books/g' file

全面替换标记g

使用后缀 /g 标记会替换每一行中的所有匹配

1.  sed 's/book/books/g' file

当需要从第N处匹配开始替换时,可以使用 /Ng:

1.  echo sksksksksksk | sed 's/sk/SK/2g'
2.  skSKSKSKSKSK
3.
4.  echo sksksksksksk | sed 's/sk/SK/3g'
5.  skskSKSKSKSK
6.
7.  echo sksksksksksk | sed 's/sk/SK/4g'
8.  skskskSKSKSK

定界符

以上命令中字符 / 在sed中作为定界符使用,也可以使用任意的定界符:

1.  sed 's:test:TEXT:g'
2.  sed 's|test|TEXT|g'

定界符出现在样式内部时,需要进行转义:

1.  sed 's/\/bin/\/usr\/local\/bin/g'

删除操作:d命令

删除空白行:

1.  sed '/^$/d' file

删除文件的第2行:

1.  sed '2d' file

删除文件的第2行到末尾所有行:

1.  sed '2,$d' file

删除文件最后一行:

1.  sed '$d' file

删除文件中所有开头是test的行:

1.  sed '/^test/'d file

已匹配字符串标记&

正则表达式 \w+ 匹配每一个单词,使用 [&] 替换它,& 对应于之前所匹配到的单词:

1.  echo this is a test line | sed 's/\w\+/[&]/g'
2.  [this] [is] [a] [test] [line]

所有以192.168.0.1开头的行都会被替换成它自已加localhost:

1.  sed 's/^192.168.0.1/&localhost/' file
2.  192.168.0.1localhost

子串匹配标记\1

匹配给定样式的其中一部分:

1.  echo this is digit 7 in a number | sed 's/digit \([0-9]\)/\1/'
2.  this is 7 in a number

命令中 digit 7,被替换成了 7。样式匹配到的子串是 7,(..) 用于匹配子串,对于匹配到的第一
个子串就标记为 \1 ,依此类推匹配到的第二个结果就是 \2 ,例如:

1.  echo aaa BBB | sed 's/\([a-z]\+\) \([A-Z]\+\)/\2 \1/'
2.  BBB aaa

love被标记为1,所有loveable会被替换成lovers,并打印出来:

1.  sed -n 's/\(love\)able/\1rs/p' file

组合多个表达式

1.  sed '表达式' | sed '表达式'
2.
3.  等价于:
4.
5.  sed '表达式; 表达式'

引用

sed表达式可以使用单引号来引用,但是如果表达式内部包含变量字符串,就需要使用双引号

1.  test=hello
2.  echo hello WORLD | sed "s/$test/HELLO"
3.  HELLO WORLD

选定行的范围:,(逗号)

所有在模板test和check所确定的范围内的行都被打印:

1.  sed -n '/test/,/check/p' file

打印从第5行开始到第一个包含以test开始的行之间的所有行:

1.  sed -n '5,/^test/p' file

对于模板test和west之间的行,每行的末尾用字符串aaa bbb替换:

1.  sed '/test/,/west/s/$/aaa bbb/' file

多点编辑:e命令

-e选项允许在同一行里执行多条命令:

1.  sed -e '1,5d' -e 's/test/check/' file

上面sed表达式的第一条命令删除1至5行,第二条命令用check替换test。命令的执行顺序对结果有影响。如果两个命令都是替换命令,那么第一个替换命令将影响第二个替换命令的结果。

和 -e 等价的命令是 —expression:

1.  sed --expression='s/test/check/' --expression='/love/d' file

从文件读入:r命令

file里的内容被读进来,显示在与test匹配的行后面,如果匹配多行,则file的内容将显示在所有匹
配行的下面:

1.  sed '/test/r file' filename

写入文件:w命令

在example中所有包含test的行都被写入file里:

1.  sed -n '/test/w file' example

追加(行下):a\命令

将 this is a test line 追加到 以test 开头的行后面:

1.  sed '/^test/a\this is a test line' file

在 test.conf 文件第2行之后插入 this is a test line:

1.  sed -i '2a\this is a test line' test.conf

插入(行上):i\命令

将 this is a test line 追加到以test开头的行前面:

1.  sed '/^test/i\this is a test line' file

在test.conf文件第5行之前插入this is a test line:

1.  sed -i '5i\this is a test line' test.conf

下一个:n命令

如果test被匹配,则移动到匹配行的下一行,替换这一行的aa,变为bb,并打印该行,然后继续:

1.  sed '/test/{ n; s/aa/bb/; }' file

变形:y命令

把1~10行内所有abcde转变为大写,注意,正则表达式元字符不能使用这个命令:

1.  sed '1,10y/abcde/ABCDE/' file

退出:q命令

打印完第10行后,退出sed

1.  sed '10q' file

保持和获取:h命令和G命令

在sed处理文件的时候,每一行都被保存在一个叫模式空间的临时缓冲区中,除非行被删除或者输出被取消,否则所有被处理的行都将打印在屏幕上。接着模式空间被清空,并存入新的一行等待处理。

1.  sed -e '/test/h' -e '$G' file

在这个例子里,匹配test的行被找到后,将存入模式空间,h命令将其复制并存入一个称为保持缓存区的特殊缓冲区内。第二条语句的意思是,当到达最后一行后,G命令取出保持缓冲区的行,然后把它放回模式空间中,且追加到现在已经存在于模式空间中的行的末尾。在这个例子中就是追加到最后一行。简单来说,任何包含test的行都被复制并追加到该文件的末尾。

保持和互换:h命令和x命令

互换模式空间和保持缓冲区的内容。也就是把包含test与check的行互换:

1.  sed -e '/test/h' -e '/check/x' file

脚本scriptfile

sed脚本是一个sed的命令清单,启动Sed时以-f选项引导脚本文件名。Sed对于脚本中输入的命令非常挑剔,在命令的末尾不能有任何空白或文本,如果在一行中有多个命令,要用分号分隔。以#开头的行为注释行,且不能跨行。

1.  sed [options] -f scriptfile file(s)

打印奇数行或偶数行

方法1:
1.  sed -n 'p;n' test.txt #奇数行
2.  sed -n 'n;p' test.txt #偶数行

方法2:
1.  sed -n '1~2p' test.txt #奇数行
2.  sed -n '2~2p' test.txt #偶数行

打印匹配字符串的下一行

1.  grep -A 1 SCC URFILE
2.  sed -n '/SCC/{n;p}' URFILE
3.  awk '/SCC/{getline; print}' URFILE

5. find - 在指定目录下查找文件

find命令 用来在指定目录下查找文件。任何位于参数之前的字符串都将被视为欲查找的目录名。如果使用该命令时,不设置任何参数,则find命令将在当前目录下查找子目录与文件。并且将查找到的子目录和文件全部进行显示。

语法

1.  find(选项)(参数)

选项

1.  -amin<分钟>:查找在指定时间曾被存取过的文件或目录,单位以分钟计算;
2.  -anewer<参考文件或目录>:查找其存取时间较指定文件或目录的存取时间更接近现在的文件或目录;
3.  -atime<24小时数>:查找在指定时间曾被存取过的文件或目录,单位以24小时计算;
4.  -cmin<分钟>:查找在指定时间之时被更改过的文件或目录;
5.  -cnewer<参考文件或目录>查找其更改时间较指定文件或目录的更改时间更接近现在的文件或目录;
6.  -ctime<24小时数>:查找在指定时间之时被更改的文件或目录,单位以24小时计算;
7.  -daystart:从本日开始计算时间;
8.  -depth:从指定目录下最深层的子目录开始查找;
9.  -empty:寻找文件大小为0 Byte的文件,或目录下没有任何子目录或文件的空目录;
10.  -exec<执行指令>:假设find指令的回传值为True,就执行该指令;
11.  -false:将find指令的回传值皆设为False;
12.  -fls<列表文件>:此参数的效果和指定“-ls”参数类似,但会把结果保存为指定的列表文件;
13.  -follow:排除符号连接;
14.  -fprint<列表文件>:此参数的效果和指定“-print”参数类似,但会把结果保存成指定的列表文件;
15.  -fprint0<列表文件>:此参数的效果和指定“-print0”参数类似,但会把结果保存成指定的列表文件;
16.  -fprintf<列表文件><输出格式>:此参数的效果和指定“-printf”参数类似,但会把结果保存成指定的列表文件;
17.  -fstype<文件系统类型>:只寻找该文件系统类型下的文件或目录;
18.  -gid<群组识别码>:查找符合指定之群组识别码的文件或目录;
19.  -group<群组名称>:查找符合指定之群组名称的文件或目录;
20.  -help或--help:在线帮助;
21.  -ilname<范本样式>:此参数的效果和指定“-lname”参数类似,但忽略字符大小写的差别;
22.  -iname<范本样式>:此参数的效果和指定“-name”参数类似,但忽略字符大小写的差别;
23.  -inum<inode编号>:查找符合指定的inode编号的文件或目录;
24.  -ipath<范本样式>:此参数的效果和指定“-path”参数类似,但忽略字符大小写的差别;
25.  -iregex<范本样式>:此参数的效果和指定“-regexe”参数类似,但忽略字符大小写的差别;
26.  -links<连接数目>:查找符合指定的硬连接数目的文件或目录;
27.  -lname<范本样式>:指定字符串作为寻找符号连接的范本样式;
28.  -ls:假设find指令的回传值为Ture,就将文件或目录名称列出到标准输出;
29.  -maxdepth<目录层级>:设置最大目录层级;
30.  -mindepth<目录层级>:设置最小目录层级;
31.  -mmin<分钟>:查找在指定时间曾被更改过的文件或目录,单位以分钟计算;
32.  -mount:此参数的效果和指定“-xdev”相同;
33.  -mtime<24小时数>:查找在指定时间曾被更改过的文件或目录,单位以24小时计算;
34.  -name<范本样式>:指定字符串作为寻找文件或目录的范本样式;
35.  -newer<参考文件或目录>:查找其更改时间较指定文件或目录的更改时间更接近现在的文件或目录;
36.  -nogroup:找出不属于本地主机群组识别码的文件或目录;
37.  -noleaf:不去考虑目录至少需拥有两个硬连接存在;
38.  -nouser:找出不属于本地主机用户识别码的文件或目录;
39.  -ok<执行指令>:此参数的效果和指定“-exec”类似,但在执行指令之前会先询问用户,若回答“y”或“Y”,则放弃执行命令;
40.  -path<范本样式>:指定字符串作为寻找目录的范本样式;
41.  -perm<权限数值>:查找符合指定的权限数值的文件或目录;
42.  -print:假设find指令的回传值为Ture,就将文件或目录名称列出到标准输出。格式为每列一个名称,每个名称前皆有“./”字符串;
43.  -print0:假设find指令的回传值为Ture,就将文件或目录名称列出到标准输出。格式为全部的名称皆在同一行;
44.  -printf<输出格式>:假设find指令的回传值为Ture,就将文件或目录名称列出到标准输出。格式可以自行指定;
45.  -prune:不寻找字符串作为寻找文件或目录的范本样式;
46.  -regex<范本样式>:指定字符串作为寻找文件或目录的范本样式;
47.  -size<文件大小>:查找符合指定的文件大小的文件;
48.  -true:将find指令的回传值皆设为True;
49.  -type<文件类型>:只寻找符合指定的文件类型的文件;
50.  -uid<用户识别码>:查找符合指定的用户识别码的文件或目录;
51.  -used<日数>:查找文件或目录被更改之后在指定时间曾被存取过的文件或目录,单位以日计算;
52.  -user<拥有者名称>:查找符和指定的拥有者名称的文件或目录;
53.  -version或——version:显示版本信息;
54.  -xdev:将范围局限在先行的文件系统中;
55.  -xtype<文件类型>:此参数的效果和指定“-type”参数类似,差别在于它针对符号连接检查。 

 起始目录:查找文件的起始目录。

1.  # 当前目录搜索所有文件,文件内容 包含 “140.206.111.111” 的内容
2.  find . -type f -name "*" | xargs grep "140.206.111.111"

 在 /home  目录下查找以.txt结尾的文件名

1.  find /home -name "*.txt"

 同上,但忽略大小写

1.  find /home -iname "*.txt"

 当前目录及子目录下查找所有以.txt和.pdf结尾的文件

1.  find . \( -name "*.txt" -o -name "*.pdf" \)
2.
3.  或
4.
5.  find . -name "*.txt" -o -name "*.pdf"

 匹配文件路径或者文件

1.  find /usr/ -path "*local*"

 基于正则表达式匹配文件路径

1.  find . -regex ".*\(\.txt\|\.pdf\)$"

 同上,但忽略大小写

1.  find . -iregex ".*\(\.txt\|\.pdf\)$"

 否定参数:找出/home下不是以.txt结尾的文件

1.  find /home ! -name "*.txt"

 根据文件类型进行搜索

1.  find . -type 类型参数
类型参数列表:
f 普通文件
l 符号连接
d 目录
c 字符设备
b 块设备
s 套接字
p Fifo

 基于目录深度搜索:向下最大深度限制为3

1.  find . -maxdepth 3 -type f

 搜索出深度距离当前目录至少2个子目录的所有文件

1.  find . -mindepth 2 -type f

 根据文件时间戳进行搜索

1.  find . -type f 时间戳 

UNIX/Linux文件系统每个文件都有三种时间戳:
访问时间 (-atime/天,-amin/分钟):用户最近一次访问时间。
修改时间 (-mtime/天,-mmin/分钟):文件最后一次修改时间。
变化时间 (-ctime/天,-cmin/分钟):文件数据元(例如权限等)最后一次修改时间。

 搜索最近七天内被访问过的所有文件

1.  find . -type f -atime -7

 搜索恰好在七天前被访问过的所有文件

1.  find . -type f -atime 7

 搜索超过七天内被访问过的所有文件

1.  find . -type f -atime +7

 搜索访问时间超过10分钟的所有文件

 1.  find . -type f -amin +10

 找出比file.log修改时间更长的所有文件

 1.  find . -type f -newer file.log

 根据文件大小进行匹配

 1.  find . -type f -size 文件大小单元

文件大小单元:
b —— 块(512字节)
c —— 字节
w —— 字(2字节)
k —— 千字节
M —— 兆字节
G —— 吉字节

 搜索大于10KB的文件

 1.  find . -type f -size +10k

 搜索小于10KB的文件

1.  find . -type f -size -10k

 搜索等于10KB的文件

1.  find . -type f -size 10k

 删除匹配文件:删除当前目录下所有.txt文件

1.  find . -type f -name "*.txt" -delete

 根据文件权限/所有权进行匹配:当前目录下搜索出权限为777的文件

1.  find . -type f -perm 777

 找出当前目录下权限不是644的php文件

1.  find . -type f -name "*.php" ! -perm 644

 找出当前目录用户tom拥有的所有文件

1.  find . -type f -user tom

 找出当前目录用户组sunk拥有的所有文件

1.  find . -type f -group sunk 

 借助 -exec  选项与其他命令结合使用
找出当前目录下所有root的文件,并把所有权更改为用户tom

1.  find .-type f -user root -exec chown tom {} \;

上例中, {} 用于与 -exec 选项结合使用来匹配所有文件,然后会被替换为相应的文件名。

 找出自己家目录下所有的.txt文件并删除

1.  find $HOME/. -name "*.txt" -ok rm {} \;
上例中, -ok 和 -exec 行为一样,不过它会给出提示,是否执行相应的操作。

 查找当前目录下所有.txt文件并把他们拼接起来写入到all.txt文件中

1.  find . -type f -name "*.txt" -exec cat {} \;> /all.txt

 将30天前的.log文件移动到old目录中

1.  find . -type f -mtime +30 -name "*.log" -exec cp {} old \;

 找出当前目录下所有.txt文件并以“File:文件名”的形式打印出来

 1.  find . -type f -name "*.txt" -exec printf "File: %s\n" {} \;

 因为单行命令中-exec参数中无法使用多个命令,以下方法可以实现在-exec之后接受多条命令

 1.  -exec ./text.sh {} \;

 搜索但跳出指定的目录:查找当前目录或者子目录下所有.txt文件,但是跳过子目录sk

 1.  find . -path "./sk" -prune -o -name "*.txt" -print

 要列出所有长度为零的文件

 1.  find . -empty

 其它实例

1.  find ~ -name '*jpg' # 主目录中找到所有的 jpg 文件。 -name 参数允许你将结果限制为与给定模式匹配的文件。
2.  find ~ -iname '*jpg' # -iname 就像 -name,但是不区分大小写
3.  find ~ ( -iname 'jpeg' -o -iname 'jpg' ) # 一些图片可能是 .jpeg 扩展名。幸运的是,我们可以将模式用“或”(表示为 -o)来组合。
4.  find ~ \( -iname '*jpeg' -o -iname '*jpg' \) -type f # 如果你有一些以 jpg 结尾的目录呢? (为什么你要命名一个 bucketofjpg 而不是 pictures 的目录就超出了本文的范围。)我们使
用 -type 参数修改我们的命令来查找文件。
5.  find ~ \( -iname '*jpeg' -o -iname '*jpg' \) -type d # 也许你想找到那些命名奇怪的目录,以便稍后重命名它们

 最近拍了很多照片,所以让我们把它缩小到上周更改的文件

 1.  find ~ \( -iname '*jpeg' -o -iname '*jpg' \) -type f -mtime -7

 但也许你不关心你的照片。也许你的磁盘空间不够用,所以你想在 log 目录下找到所有巨大的(让我们定义为“大于 1GB”)文件:

1.  find /var/log -size +1G

 或者,也许你想在 /data 中找到 bcotton 拥有的所有文件:

1.  find /data -owner bcotton

你还可以根据权限查找文件。也许你想在你的主目录中找到对所有人可读的文件,以确保你不会过度分享。

 1.  find ~ -perm -o=r

 删除 mac 下自动生成的文件

1.  find ./ -name '__MACOSX' -depth -exec rm -rf {} \;

统计代码行数 

1.  find . -name "*.java"|xargs cat|grep -v ^$|wc -l # 代码行数统计, 排除空行

6. netstat - 查看Linux中网络系统状态信息

查看Linux中网络系统状态信息
netstat命令 用来打印Linux中网络系统的状态信息,可让你得知整个Linux系统的网络情况。

选项

1.  -a或--all:显示所有连线中的Socket;
2.  -A<网络类型>或--<网络类型>:列出该网络类型连线中的相关地址;
3.  -c或--continuous:持续列出网络状态;
4.  -C或--cache:显示路由器配置的快取信息;
5.  -e或--extend:显示网络其他相关信息;
6.  -F或--fib:显示FIB;
7.  -g或--groups:显示多重广播功能群组组员名单;
8.  -h或--help:在线帮助;
9.  -i或--interfaces:显示网络界面信息表单;
10.  -l或--listening:显示监控中的服务器的Socket;
11.  -M或--masquerade:显示伪装的网络连线;
12.  -n或--numeric:直接使用ip地址,而不通过域名服务器;
13.  -N或--netlink或--symbolic:显示网络硬件外围设备的符号连接名称;
14.  -o或--timers:显示计时器;
15.  -p或--programs:显示正在使用Socket的程序识别码和程序名称;
16.  -r或--route:显示Routing Table;
17.  -s或--statistice:显示网络工作信息统计表;
18.  -t或--tcp:显示TCP传输协议的连线状况;
19.  -u或--udp:显示UDP传输协议的连线状况;
20.  -v或--verbose:显示指令执行过程;
21.  -V或--version:显示版本信息;
22.  -w或--raw:显示RAW传输协议的连线状况;
23.  -x或--unix:此参数的效果和指定"-A unix"参数相同;
24.  --ip或--inet:此参数的效果和指定"-A inet"参数相同。

列出所有端口 (包括监听和未监听的)

1.  netstat -a #列出所有端口
2.  netstat -at #列出所有tcp端口
3.  netstat -au #列出所有udp端口

列出所有处于监听状态的 Sockets

1.  netstat -l #只显示监听端口
2.  netstat -lt #只列出所有监听 tcp 端口
3.  netstat -lu #只列出所有监听 udp 端口
4.  netstat -lx #只列出所有监听 UNIX 端口

显示每个协议的统计信息

1.  netstat -s 显示所有端口的统计信息
2.  netstat -st 显示TCP端口的统计信息
3.  netstat -su 显示UDP端口的统计信息
4.
5.  ```shell
6.
7.  **在netstat输出中显示 PID 和进程名称**
8.
9.  ```shell
10.  netstat -pt

netstat -p  可以与其它开关一起使用,就可以添加“PID/进程名称”到netstat输出中,这样debugging的时候可以很方便的发现特定端口运行的程序。

在netstat输出中不显示主机,端口和用户名(host, port or user)

当你不想让主机,端口和用户名显示,使用 netstat -n  。将会使用数字代替那些名称。同样可以加
速输出,因为不用进行比对查询。

1.  netstat -an

如果只是不想让这三个名称中的一个被显示,使用以下命令:

1.  netsat -a --numeric-ports
2.  netsat -a --numeric-hosts
3.  netsat -a --numeric-users

持续输出netstat信息

1.  netstat -c #每隔一秒输出网络信息

显示系统不支持的地址族(Address Families)

1.  netstat --verbose

在输出的末尾,会有如下的信息:

1.  netstat: no support for `AF IPX' on this system.
2.  netstat: no support for `AF AX25' on this system.
3.  netstat: no support for `AF X25' on this system.
4.  netstat: no support for `AF NETROM' on this system.

显示核心路由信息

1.  netstat -r

使用 netstat -rn  显示数字格式,不查询主机名称。

找出程序运行的端口

并不是所有的进程都能找到,没有权限的会不显示,使用 root 权限查看所有的信息。

1.  netstat -ap | grep ssh

找出运行在指定端口的进程:

1.  netstat -an | grep ':80'

通过端口找进程ID

1.  netstat -anp|grep 8081 | grep LISTEN|awk '{printf $7}'|cut -d/ -f1

显示网络接口列表

1.  netstat -i

显示详细信息,像是ifconfig使用 netstat -ie  。

IP和TCP分析

查看连接某服务端口最多的的IP地址:

1.  netstat -ntu | grep :80 | awk '{print $5}' | cut -d: -f1 | awk '{++ip[$1]} END{for(i in ip) print ip[i],"\t",i}' | sort -nr

TCP各种状态列表:

1.  netstat -nt | grep -e 127.0.0.1 -e 0.0.0.0 -e ::: -v | awk '/^tcp/{++state[$NF]} END {for(i in state) print i,"\t",state[i]}'

查看phpcgi进程数,如果接近预设值,说明不够用,需要增加:

1.  netstat -anpo | grep "php-cgi" | wc -l

7. sort - 对文本文件中所有行进行排序。

对文本文件中所有行进行排序。

1.  sort [OPTION]... [FILE]...
2.  sort [OPTION]... --files0-from=F

将所有输入文件的内容排序后并输出。
当没有文件或文件为 -  时,读取标准输入。

选项

1.  -b, --ignore-leading-blanks 忽略开头的空白。
2.  -d, --dictionary-order 仅考虑空白、字母、数字。
3.  -f, --ignore-case 将小写字母作为大写字母考虑。
4.  -g, --general-numeric-sort 根据数字排序。
5.  -i, --ignore-nonprinting 排除不可打印字符。
6.  -M, --month-sort 按照非月份、一月、十二月的顺序排序。
7.  -h, --human-numeric-sort 根据存储容量排序(注意使用大写字母,例如:2K 1G)。
8.  -n, --numeric-sort 根据数字排序。
9.  -R, --random-sort 随机排序,但分组相同的行。
10.  --random-source=FILE 从FILE中获取随机长度的字节。
11.  -r, --reverse 将结果倒序排列。
12.  --sort=WORD 根据WORD排序,其中: general-numeric 等价于 -g,human-numeric 等价于 -h,month 等价于 -M,numeric 等价于 -n,random 等价于 -R,version 等价于 -V。
13.  -V, --version-sort 文本中(版本)数字的自然排序。


1.  --batch-size=NMERGE 一次合并最多NMERGE个输入;超过部分使用临时文件。
2.  -c, --check, --check=diagnose-first 检查输入是否已排序,该操作不会执行排序。
3.  -C, --check=quiet, --check=silent 类似于 -c 选项,但不输出第一个未排序的行。
4.  --compress-program=PROG 使用PROG压缩临时文件;使用PROG -d解压缩。
5.  --debug 注释用于排序的行,发送可疑用法的警报到stderr。
6.  --files0-from=F 从文件F中读取以NUL结尾的所有文件名称;如果F是- ,那么从标准输入中读取名字。
7.  -k, --key=KEYDEF 通过一个key排序;KEYDEF给出位置和类型。
8.  -m, --merge 合并已排序文件,之后不再排序。
9.  -o, --output=FILE 将结果写入FILE而不是标准输出。
10.  -s, --stable 通过禁用最后的比较来稳定排序。
11.  -S, --buffer-size=SIZE 使用SIZE作为内存缓存大小。
12.  -t, --field-separator=SEP 使用SEP作为列的分隔符。
13.  -T, --temporary-directory=DIR 使用DIR作为临时目录,而不是 $TMPDIR 或/tmp;多次使用该选项指定多个临时目录。
14.  --parallel=N 将并发运行的排序数更改为N。
15.  -u, --unique 同时使用-c,严格检查排序;不同时使用-c,输出排序后去重的结果。
16.  -z, --zero-terminated 设置行终止符为NUL(空),而不是换行符。
17.  --help 显示帮助信息并退出。
18.  --version 显示版本信息并退出。

参数

FILE(可选):要处理的文件,可以为任意数量。

返回值

返回0表示成功,返回非0值表示失败。

例子

sort将文件/文本的每一行作为一个单位相互比较,比较原则是从首字符向后依次按ASCII码值进行比较,最后将他们按升序输出。

1.  root@[mail text]# cat sort.txt
2.  aaa:10:1.1
3.  ccc:30:3.3
4.  ddd:40:4.4
5.  bbb:20:2.2
6.  eee:50:5.5
7.  eee:50:5.5
8.
9.  [root@mail text]# sort sort.txt
10.  aaa:10:1.1
11.  bbb:20:2.2
12.  ccc:30:3.3
13.  ddd:40:4.4
14.  eee:50:5.5
15.  eee:50:5.5

忽略相同行使用 -u  选项或者 uniq  :

1.  [root@mail text]# cat sort.txt
2.  aaa:10:1.1
3.  ccc:30:3.3
4.  ddd:40:4.4
5.  bbb:20:2.2
6.  eee:50:5.5
7.  eee:50:5.5
8.
9.  [root@mail text]# sort -u sort.txt
10.  aaa:10:1.1
11.  bbb:20:2.2
12.  ccc:30:3.3
13.  ddd:40:4.4
14.  eee:50:5.5
15.
16.  [root@mail text]# uniq sort.txt
17.  aaa:10:1.1
18.  ccc:30:3.3
19.  ddd:40:4.4
20.  bbb:20:2.2
21.  eee:50:5.5

sort  的 -n、-r、-k、-t  选项的使用:

1.  [root@mail text]# cat sort.txt
2.  AAA:BB:CC
3.  aaa:30:1.6
4.  ccc:50:3.3
5.  ddd:20:4.2
6.  bbb:10:2.5
7.  eee:40:5.4
8.  eee:60:5.1
9.
10.  # 将BB列按照数字从小到大顺序排列:
11.  [root@mail text]# sort -nk 2 -t: sort.txt
12.  AAA:BB:CC
13.  bbb:10:2.5
14.  ddd:20:4.2
15.  aaa:30:1.6
16.  eee:40:5.4
17.  ccc:50:3.3
18.  eee:60:5.1
19.
20.  # 将CC列数字从大到小顺序排列:
21.  # -n是按照数字大小排序,-r是以相反顺序,-k是指定需要排序的栏位,-t指定栏位分隔符为冒号
22.  [root@mail text]# sort -nrk 3 -t: sort.txt
23.  eee:40:5.4
24.  eee:60:5.1
25.  ddd:20:4.2
26.  ccc:50:3.3
27.  bbb:10:2.5
28.  aaa:30:1.6
29.  AAA:BB:CC

关于 -k  选项的解读和例子:

-k选项深度解读:

1.  FStart.CStart Modifier,FEnd.CEnd Modifier
2.  -------Start--------,-------End--------
3.  FStart.CStart 选项 , FEnd.CEnd 选项

这个语法格式可以被其中的逗号 ,  分为两大部分,Start 部分和 End 部分。 Start部分由三部
分组成,其中的Modifier部分就是我们之前说过的选项部分; 我们重点说说 Start  部分的 FStart  和 CStart  ; CStart  是可以省略的,省略的话就表示从本域的开头部分开始。FStart.CStart  ,其中 FStart  就是表示使用的域,而 CStart  则表示在 FStart  域中从第几个字符开始算排序首字符。 同理,在End部分中,你可以设定 FEnd.CEnd  ,如果你省略 .CEnd  或将它设定为0,则表示结尾到本域的最后一个字符。

例子:从公司英文名称的第二个字母开始排序:

1.  $ sort -t ' ' -k 1.2 facebook.txt
2.  baidu 100 5000
3.  sohu 100 4500
4.  google 110 5000
5.  guge 50 3000

解读:使用了 -k 1.2  ,表示对第一个域的第二个字符开始到本域的最后一个字符为止的字符串进行排序。你会发现baidu因为第二个字母是a而名列榜首。sohu和google第二个字符都是o,但sohu的h在google的o前面,所以两者分别排在第二和第三。guge只能屈居第四了。

例子:只针对公司英文名称的第二个字母进行排序,如果相同的按照员工工资进行降序排序:

1.  $ sort -t ' ' -k 1.2,1.2 -nrk 3,3 facebook.txt
2.  baidu 100 5000
3.  google 110 5000
4.  sohu 100 4500
5.  guge 50 3000

解读:由于只对第二个字母进行排序,所以我们使用了 -k 1.2,1.2  的表示方式,表示我们只对第二个字母进行排序(如果你问我使用 -k 1.2  怎么不行?当然不行,因为你省略了End部分,这就意味着你将对从第二个字母起到本域最后一个字符为止的字符串进行排序)。 对员工工资进行排序,我们也使用了 -k 3,3  ,这是最准确的表述,表示我们只对本域进行排序,因为如果你省略了后面的3,就变成了我们对第3个域开始到最后一个域位置的内容进行排序了。

8. uniq - 显示或忽略重复的行。

1.  uniq [OPTION]... [INPUT [OUTPUT]]

 主要用途

将输入文件(或标准输入)中邻近的重复行写入到输出文件(或标准输出)中。
当没有选项时,邻近的重复行将合并为一个。

选项

1.  -c, --count 在每行开头增加重复次数。
2.  -d, --repeated 所有邻近的重复行只被打印一次。
3.  -D 所有邻近的重复行将全部打印。
4.  --all-repeated[=METHOD] 类似于 -D,但允许每组之间以空行分割。METHOD取值范围{none(默认),prepend,separate}。
5.  -f, --skip-fields=N 跳过对前N个列的比较。
6.  --group[=METHOD] 显示所有行,允许每组之间以空行分割。METHOD取值范围:
{separate(默认),prepend,append,both}。
7.  -i, --ignore-case 忽略大小写的差异。
8.  -s, --skip-chars=N 跳过对前N个字符的比较。
9.  -u, --unique 只打印非邻近的重复行。
10.  -z, --zero-terminated 设置行终止符为NUL(空),而不是换行符。
11.  -w, --check-chars=N 只对每行前N个字符进行比较。
12.  --help 显示帮助信息并退出。
13.  --version 显示版本信息并退出

参数

INPUT(可选):输入文件,不提供时为标准输入。
OUTPUT(可选):输出文件,不提供时为标准输出。

返回值

返回0表示成功,返回非0值表示失败。

例子

注意:命令2和命令3结果一样,命令1仅作了相邻行的去重。

1.  uniq file.txt
2.  sort file.txt | uniq
3.  sort -u file.txt

只显示单一行,区别在于是否执行排序:

1.  uniq -u file.txt
2.  sort file.txt | uniq -u

统计各行在文件中出现的次数:

1.  sort file.txt | uniq -c

在文件中找出重复的行:

1.  sort file.txt | uniq -d

注意

uniq  只检测邻近的行是否重复, sort -u  将输入文件先排序然后再处理重复行。

9. jobs - 显示作业的状态。

1.  jobs [-lnprs] [jobspec ...]
2.  jobs -x command [args]

主要用途

显示作业的状态。
列出活动的作业。
列出停止的作业。

选项

1.  -l 在作业信息中额外的列出PID。
2.  -n 只列出最近一次通知以来状态变更的作业。
3.  -p 只列出PID。
4.  -r 只输出处于运行状态的作业。
5.  -s 只输出处于停止状态的作业。

返回值

返回状态为成功除非给出了非法选项、执行出现错误。
如果使用 jobs -x command [args]  形式执行,那么返回值为 command  的退出状态。

例子

1.  [user2@pc] ssh 192.168.1.4
2.  pc@192.168.1.4's password:
3.  # 此时按下ctrl+z使得交互停止。
4.  [1]+ Stopped ssh 192.168.1.4
6.  [user2@pc] sleep 60 &
7.  [2] 13338
8.
9.  [user2@pc] jobs
10.  [1]- Stopped ssh 192.168.1.4
11.  [2] Running sleep 60 &
12.
13.  [user2@pc] jobs -l
14.  [1]- 12927 Stopped ssh 192.168.1.4
15.  [2] 13338 Running sleep 60 &
16.
17.  [user2@pc] jobs -p
18.  12927
19.  13338
20.
21.  [user2@pc] jobs -s
22.  [1]- Stopped ssh 192.168.1.4
23.
24.  [user2@pc] jobs -r
25.  [2] Running sleep 60 &
26.
27.  [user2@pc] kill -9 12927
28.  [2] Done sleep 60
29.
30.  [user2@pc] jobs -n -l
31.  [1]+ 12927 Killed ssh 192.168.1.4
32.
33.  [user2@pc] jobs -n -l

注意: bash  的作业控制命令包括 bg fg kill wait disown suspend

10. bg - 将前台终端作业移动到后台运行

1.  bg [job_spec ...]

主要用途

1. 用于将作业放到后台运行,使前台可以执行其他任务。该命令的运行效果与在指令后面添加符号 &  的效果是相同的,都是将其放到系统后台执行。
2. 若后台任务中只有一个,则使用该命令时可以省略任务号。

参数

job_spec(可选):指定要移动到后台执行的作业标识符,可以是一到多个

返回值

返回成功除非未开启作业控制或发生了错误。

例子

1.  # 运行sleep命令,然后按下ctrl+z。
2.  sleep 60
3.  ^Z
4.  [1]+ Stopped sleep 60
5.
6.  # 使用bg命令使得作业在后台运行。
7.  bg %1
8.
9.  # 返回信息:
10.  [1]+ sleep 60 &

11. fg - 将后台作业移动到前台终端运行

1.  fg [job_spec ...]

主要用途

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

参数

job_spec(可选):指定要移动到前台执行的作业标识符,可以是一到多个。

返回值

返回作业的执行状态,如果发生了错误返回失败。

例子

1.  # 运行sleep命令,然后按下ctrl+z。
2.  sleep 60
3.  ^Z
4.  [1]+ Stopped sleep 60
5.
6.  # 使用fg命令使得作业在前台运行。
7.  fg %1
8.
9.  # 返回信息:
10.  sleep 60

12. du - 显示每个文件和目录的磁盘使用空间

显示每个文件和目录的磁盘使用空间

补充说明

du命令 也是查看使用空间的,但是与df命令不同的是Linux du命令是对文件和目录磁盘使用的空间
的查看,还是和df命令有一些区别的。

语法

1.  du [选项][文件]

选项 

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

实例

显示目录或者文件所占空间:

1.  root@localhost [test]# du
2.  608 ./test6
3.  308 ./test4
4.  4 ./scf/lib
5.  4 ./scf/service/deploy/product
6.  4 ./scf/service/deploy/info
7.  12 ./scf/service/deploy
8.  16 ./scf/service
9.  4 ./scf/doc
10.  4 ./scf/bin
11.  32 ./scf
12.  8 ./test3
13.  1288 .

只显示当前目录下面的子目录的目录大小和当前目录的总的大小,最下面的1288为当前目录的总大小

显示指定文件所占空间:

1.  [root@localhost test]# du log2012.log
2.  300 log2012.log

查看指定目录的所占空间:

1.  [root@localhost test]# du scf
2.  4 scf/lib
3.  4 scf/service/deploy/product
4.  4 scf/service/deploy/info
5.  12 scf/service/deploy
6.  16 scf/service
7.  4 scf/doc
8.  4 scf/bin
9.  32 scf

显示多个文件所占空间:

1.  [root@localhost test]# du log30.tar.gz log31.tar.gz
2.  4 log30.tar.gz
3.  4 log31.tar.gz

只显示总和的大小:

1.  [root@localhost test]# du -s
2.  1288 .
3.
4.  [root@localhost test]# du -s scf
5.  32 scf

7.  [root@localhost test]# cd ..
8.  [root@localhost soft]# du -s test
9.  1288 test

显示总和的大小且易读:

1.  du -sh $dir

13. ifconfig - 配置和显示Linux系统网卡的网络参数

配置和显示Linux系统网卡的网络参数

补充说明

ifconfig命令 被用于配置和显示Linux内核中网络接口的网络参数。用ifconfig命令配置的网卡信
息,在网卡重启后机器重启后,配置就不存在。要想将上述的配置信息永远的存的电脑里,那就要修改网卡的配置文件了。

参数

1.  add<地址>:设置网络设备IPv6的ip地址;
2.  del<地址>:删除网络设备IPv6的IP地址;
3.  down:关闭指定的网络设备;
4.  <hw<网络设备类型><硬件地址>:设置网络设备的类型与硬件地址;
5.  io_addr<I/O地址>:设置网络设备的I/O地址;
6.  irq<IRQ地址>:设置网络设备的IRQ;
7.  media<网络媒介类型>:设置网络设备的媒介类型;
8.  mem_start<内存地址>:设置网络设备在主内存所占用的起始地址;
9.  metric<数目>:指定在计算数据包的转送次数时,所要加上的数目;
10.  mtu<字节>:设置网络设备的MTU;
11.  netmask<子网掩码>:设置网络设备的子网掩码;
12.  tunnel<地址>:建立IPv4与IPv6之间的隧道通信地址;
13.  up:启动指定的网络设备;
14.  -broadcast<地址>:将要送往指定地址的数据包当成广播数据包来处理;
15.  -pointopoint<地址>:与指定地址的网络设备建立直接连线,此模式具有保密功能;
16.  -promisc:关闭或启动指定网络设备的promiscuous模式;
17.  IP地址:指定网络设备的IP地址;
18.  网络设备:指定网络设备的名称。

实例

显示网络设备信息(激活状态的):

1.  [root@localhost ~]# ifconfig
2.  eth0 Link encap:Ethernet HWaddr 00:16:3E:00:1E:51
3.  inet addr:10.160.7.81 Bcast:10.160.15.255 Mask:255.255.240.0
4.  UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
5.  RX packets:61430830 errors:0 dropped:0 overruns:0 frame:0
6.  TX packets:88534 errors:0 dropped:0 overruns:0 carrier:0
7.  collisions:0 txqueuelen:1000
8.  RX bytes:3607197869 (3.3 GiB) TX bytes:6115042 (5.8 MiB)
9.
10.  lo Link encap:Local Loopback
11.  inet addr:127.0.0.1 Mask:255.0.0.0
12.  UP LOOPBACK RUNNING MTU:16436 Metric:1
13.  RX packets:56103 errors:0 dropped:0 overruns:0 frame:0
14.  TX packets:56103 errors:0 dropped:0 overruns:0 carrier:0
15.  collisions:0 txqueuelen:0
16.  RX bytes:5079451 (4.8 MiB) TX bytes:5079451 (4.8 MiB)        

eth0 表示第一块网卡,其中 HWaddr  表示网卡的物理地址,可以看到目前这个网卡的物理地址(MAC地址)是 00:16:3E:00:1E:51  。
inet addr 用来表示网卡的IP地址,此网卡的IP地址是 10.160.7.81  ,广播地址Bcast:10.160.15.255  ,掩码地址 Mask:255.255.240.0  。
lo 是表示主机的回坏地址,这个一般是用来测试一个网络程序,但又不想让局域网或外网的用户能够查看,只能在此台主机上运行和查看所用的网络接口。比如把 httpd服务器的指定到回坏地址,在浏览器输入127.0.0.1就能看到你所架WEB网站了。但只是您能看得到,局域网的其它主机或用户无从知道。
第一行:连接类型:Ethernet(以太网)HWaddr(硬件mac地址)。
第二行:网卡的IP地址、子网、掩码。
第三行:UP(代表网卡开启状态)RUNNING(代表网卡的网线被接上)MULTICAST(支持组播)MTU:1500(最大传输单元):1500字节。
第四、五行:接收、发送数据包情况统计。
第七行:接收、发送数据字节数统计信息。

启动关闭指定网卡:

1.  ifconfig eth0 up
2.  ifconfig eth0 down

ifconfig eth0 up  为启动网卡eth0, ifconfig eth0 down  为关闭网卡eth0。ssh登陆linux服务器操作要小心,关闭了就不能开启了,除非你有多网卡

为网卡配置和删除IPv6地址:

1.  ifconfig eth0 add 33ffe:3240:800:1005::2/64 #为网卡eth0配置IPv6地址
2.  ifconfig eth0 del 33ffe:3240:800:1005::2/64 #为网卡eth0删除IPv6地址

用ifconfig修改MAC地址:

1.  ifconfig eth0 hw ether 00:AA:BB:CC:dd:EE

配置IP地址:

1.  [root@localhost ~]# ifconfig eth0 192.168.2.10
2.  [root@localhost ~]# ifconfig eth0 192.168.2.10 netmask 255.255.255.0
3.  [root@localhost ~]# ifconfig eth0 192.168.2.10 netmask 255.255.255.0 broadcast
192.168.2.255

启用和关闭arp协议:

1.  ifconfig eth0 arp #开启网卡eth0 的arp协议
2.  ifconfig eth0 -arp #关闭网卡eth0 的arp协议

设置最大传输单元:

1.  ifconfig eth0 mtu 1500 #设置能通过的最大数据包大小为 1500 bytes

其它实例

1.  ifconfig #处于激活状态的网络接口
2.  ifconfig -a #所有配置的网络接口,不论其是否激活
3.  ifconfig eth0 #显示eth0的网卡信息

14. ifdown - 禁用指定的网络接口

ifdown命令 用于禁用指定的网络接口。

参数

网络接口:要禁用的网络接口。

实例

1.  ifdown eth0 #禁用eth0

15. ifup - 激活指定的网络接口

ifup命令 用于激活指定的网络接口。

参数

网络接口:要激活的网络接口。

实例

1.  ifup eth0 #激活eth0

16. ip - 网络配置工具

ip命令 用来显示或操纵Linux主机的路由、网络设备、策略路由和隧道,是Linux下较新的功能强大
的网络配置工具。

语法

1.  ip(选项)(参数)
2.  Usage: ip [ OPTIONS ] OBJECT { COMMAND | help }
3.  ip [ -force ] -batch filename

选项

1.  OBJECT := { link | address | addrlabel | route | rule | neigh | ntable |
2.  tunnel | tuntap | maddress | mroute | mrule | monitor | xfrm |
3.  netns | l2tp | macsec | tcp_metrics | token }
4.
5.  -V:显示指令版本信息;
6.  -s:输出更详细的信息;
7.  -f:强制使用指定的协议族;
8.  -4:指定使用的网络层协议是IPv4协议;
9.  -6:指定使用的网络层协议是IPv6协议;
10.  -0:输出信息每条记录输出一行,即使内容较多也不换行显示;
11.  -r:显示主机时,不使用IP地址,而使用主机的域名。

参数

1.  OPTIONS := { -V[ersion] | -s[tatistics] | -d[etails] | -r[esolve] |
2.  -h[uman-readable] | -iec |
3.  -f[amily] { inet | inet6 | ipx | dnet | bridge | link } |
4.  -4 | -6 | -I | -D | -B | -0 |
5.  -l[oops] { maximum-addr-flush-attempts } |
6.  -o[neline] | -t[imestamp] | -ts[hort] | -b[atch] [filename] |
7.  -rc[vbuf] [size] | -n[etns] name | -a[ll] }
8.
9.  网络对象:指定要管理的网络对象;
10.  具体操作:对指定的网络对象完成具体操作;
11.  help:显示网络对象支持的操作命令的帮助信息。

实例

1.  ip link show # 显示网络接口信息
2.  ip link set eth0 up # 开启网卡
3.  ip link set eth0 down # 关闭网卡
4.  ip link set eth0 promisc on # 开启网卡的混合模式
5.  ip link set eth0 promisc offi # 关闭网卡的混个模式
6.  ip link set eth0 txqueuelen 1200 # 设置网卡队列长度
7.  ip link set eth0 mtu 1400 # 设置网卡最大传输单元
8.  ip addr show # 显示网卡IP信息
9.  ip addr add 192.168.0.1/24 dev eth0 # 设置eth0网卡IP地址192.168.0.1
10.  ip addr del 192.168.0.1/24 dev eth0 # 删除eth0网卡IP地址
11.
12.  ip route show # 显示系统路由
13.  ip route add default via 192.168.1.254 # 设置系统默认路由
14.  ip route list # 查看路由信息
15.  ip route add 192.168.4.0/24 via 192.168.0.254 dev eth0 # 设置192.168.4.0网段的网关为192.168.0.254,数据走eth0接口
16.  ip route add default via 192.168.0.254 dev eth0 # 设置默认网关为192.168.0.254
17.  ip route del 192.168.4.0/24 # 删除192.168.4.0网段的网关
18.  ip route del default # 删除默认路由
19.  ip route delete 192.168.1.0/24 dev eth0 # 删除路由

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

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

显示更加详细的设备信息

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

显示核心路由表

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

显示邻居表

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

获取主机所有网络接口

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

17. scp - 加密的方式在本地主机和远程主机之间复制文件

加密的方式在本地主机和远程主机之间复制文件

补充说明

scp命令 用于在Linux下进行远程拷贝文件的命令,和它类似的命令有cp,不过cp只是在本机进行拷贝不能跨服务器,而且scp传输是加密的。可能会稍微影响一下速度。当你服务器硬盘变为只读readonly system时,用scp可以帮你把文件移出来。另外,scp还非常不占资源,不会提高多少系统负荷,在这一点上,rsync就远远不及它了。虽然 rsync比scp会快一点,但当小文件众多的情况下,rsync会导致硬盘I/O非常高,而scp基本不影响系统正常使用。

语法

1.  scp(选项)(参数)

选项

1.  -1:使用ssh协议版本1;
2.  -2:使用ssh协议版本2;
3.  -4:使用ipv4;
4.  -6:使用ipv6;
5.  -B:以批处理模式运行;
6.  -C:使用压缩;
7.  -F:指定ssh配置文件;
8.  -i:identity_file 从指定文件中读取传输时使用的密钥文件(例如亚马逊云pem),此参数直接传递给ssh;
9.  -l:指定宽带限制;
10.  -o:指定使用的ssh选项;
11.  -P:指定远程主机的端口号;
12.  -p:保留文件的最后修改时间,最后访问时间和权限模式;
13.  -q:不显示复制进度;
14.  -r:以递归方式复制。

参数

1. 源文件:指定要复制的源文件。
2. 目标文件:目标文件。格式为 user@host:filename  (文件名为目标文件的名称)。

实例

从远程复制到本地的scp命令与上面的命令雷同,只要将从本地复制到远程的命令后面2个参数互换顺序就行了。
从远处复制文件到本地目录

1.  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/  目录中。

从亚马逊云复制OpenVPN到本地目录

1.  scp -i amazon.pem ubuntu@10.10.10.10:/usr/local/openvpn_as/etc/exe/openvpn-
connect-2.1.3.110.dmg openvpn-connect-2.1.3.110.dmg

从10.10.10.10机器上下载openvpn安装文件到本地当前目录来。

从远处复制到本地

1.  scp -r root@10.10.10.10:/opt/soft/mongodb /opt/soft/

从10.10.10.10机器上的 /opt/soft/  中下载mongodb目录到本地的 /opt/soft/  目录来。

上传本地文件到远程机器指定目录

1.  scp /opt/soft/nginx-0.5.38.tar.gz root@10.10.10.10:/opt/soft/scptest
2.  # 指定端口 2222
3.  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  目录。

上传本地目录到远程机器指定目录

1.  scp -r /opt/soft/mongodb root@10.10.10.10:/opt/soft/scptes

上传本地目录 /opt/soft/mongodb  到远程机器10.10.10.10上 /opt/soft/scptest  的目录中
去。

18. ps - 报告当前系统的进程状态

ps命令 用于报告当前系统的进程状态。可以搭配kill指令随时中断、删除不必要的程序。ps命令是最基本同时也是非常强大的进程查看命令,使用该命令可以确定有哪些进程正在运行和运行的状态、进程是否结束、进程有没有僵死、哪些进程占用了过多的资源等等,总之大部分信息都是可以通过执行该命令得到的。

选项

1.  -a:显示所有终端机下执行的程序,除了阶段作业领导者之外。
2.  a:显示现行终端机下的所有程序,包括其他用户的程序。
3.  -A:显示所有程序。
4.  -c:显示CLS和PRI栏位。
5.  c:列出程序时,显示每个程序真正的指令名称,而不包含路径,选项或常驻服务的标示。
6.  -C<指令名称>:指定执行指令的名称,并列出该指令的程序的状况。
7.  -d:显示所有程序,但不包括阶段作业领导者的程序。
8.  -e:此选项的效果和指定"A"选项相同。
9.  e:列出程序时,显示每个程序所使用的环境变量。
10.  -f:显示UID,PPIP,C与STIME栏位。
11.  f:用ASCII字符显示树状结构,表达程序间的相互关系。
12.  -g<群组名称>:此选项的效果和指定"-G"选项相同,当亦能使用阶段作业领导者的名称来指定。
13.  g:显示现行终端机下的所有程序,包括群组领导者的程序。
14.  -G<群组识别码>:列出属于该群组的程序的状况,也可使用群组名称来指定。
15.  h:不显示标题列。
16.  -H:显示树状结构,表示程序间的相互关系。
17.  -j或j:采用工作控制的格式显示程序状况。
18.  -l或l:采用详细的格式来显示程序状况。
19.  L:列出栏位的相关信息。
20.  -m或m:显示所有的执行绪。
21.  n:以数字来表示USER和WCHAN栏位。
22.  -N:显示所有的程序,除了执行ps指令终端机下的程序之外。
23.  -p<程序识别码>:指定程序识别码,并列出该程序的状况。
24.  p<程序识别码>:此选项的效果和指定"-p"选项相同,只在列表格式方面稍有差异。
25.  r:只列出现行终端机正在执行中的程序。
26.  -s<阶段作业>:指定阶段作业的程序识别码,并列出隶属该阶段作业的程序的状况。
27.  s:采用程序信号的格式显示程序状况。
28.  S:列出程序时,包括已中断的子程序资料。
29.  -t<终端机编号>:指定终端机编号,并列出属于该终端机的程序的状况。
30.  t<终端机编号>:此选项的效果和指定"-t"选项相同,只在列表格式方面稍有差异。
31.  -T:显示现行终端机下的所有程序。
32.  -u<用户识别码>:此选项的效果和指定"-U"选项相同。
33.  u:以用户为主的格式来显示程序状况。
34.  -U<用户识别码>:列出属于该用户的程序的状况,也可使用用户名称来指定。
35.  U<用户名称>:列出属于该用户的程序的状况。
36.  v:采用虚拟内存的格式显示程序状况。
37.  -V或V:显示版本信息。
38.  -w或w:采用宽阔的格式来显示程序状况。
39.  x:显示所有程序,不以终端机来区分。
40.  X:采用旧式的Linux i386登陆格式显示程序状况。
41.  -y:配合选项"-l"使用时,不显示F(flag)栏位,并以RSS栏位取代ADDR栏位 。
42.  -<程序识别码>:此选项的效果和指定"p"选项相同。
43.  --cols<每列字符数>:设置每列的最大字符数。
44.  --columns<每列字符数>:此选项的效果和指定"--cols"选项相同。
45.  --cumulative:此选项的效果和指定"S"选项相同。
46.  --deselect:此选项的效果和指定"-N"选项相同。
47.  --forest:此选项的效果和指定"f"选项相同。
48.  --headers:重复显示标题列。
49.  --help:在线帮助。
50.  --info:显示排错信息。
51.  --lines<显示列数>:设置显示画面的列数。
52.  --no-headers:此选项的效果和指定"h"选项相同,只在列表格式方面稍有差异。
53.  --group<群组名称>:此选项的效果和指定"-G"选项相同。
54.  --Group<群组识别码>:此选项的效果和指定"-G"选项相同。
55.  --pid<程序识别码>:此选项的效果和指定"-p"选项相同。
56.  --rows<显示列数>:此选项的效果和指定"--lines"选项相同。
57.  --sid<阶段作业>:此选项的效果和指定"-s"选项相同。
58.  --tty<终端机编号>:此选项的效果和指定"-t"选项相同。
59.  --user<用户名称>:此选项的效果和指定"-U"选项相同。
60.  --User<用户识别码>:此选项的效果和指定"-U"选项相同。
61.  --version:此选项的效果和指定"-V"选项相同。
62.  --widty<每列字符数>:此选项的效果和指定"-cols"选项相同。

实例

1.  ps axo pid,comm,pcpu # 查看进程的PID、名称以及CPU 占用率
2.  ps aux | sort -rnk 4 # 按内存资源的使用量对进程进行排序
3.  ps aux | sort -nk 3 # 按 CPU 资源的使用量对进程进行排序
4.  ps -A # 显示所有进程信息
5.  ps -u root # 显示指定用户信息
6.  ps -efL # 查看线程数
7.  ps -e -o "%C : %p :%z : %a"|sort -k5 -nr # 查看进程并按内存使用大小排列
8.  ps -ef # 显示所有进程信息,连同命令行
9.  ps -ef | grep ssh # ps 与grep 常用组合用法,查找特定进程
10.  ps -C nginx # 通过名字或命令搜索进程
11.  ps aux --sort=-pcpu,+pmem # CPU或者内存进行排序,-降序,+升序
12.  ps -f --forest -C nginx # 用树的风格显示进程的层次关系
13.  ps -o pid,uname,comm -C nginx # 显示一个父进程的子进程
14.  ps -e -o pid,uname=USERNAME,pcpu=CPU_USAGE,pmem,comm # 重定义标签
15.  ps -e -o pid,comm,etime # 显示进程运行的时间
16.  ps -aux | grep named # 查看named进程详细信息
17.  ps -o command -p 91730 | sed -n 2p # 通过进程id获取服务名称

将目前属于您自己这次登入的 PID 与相关信息列示出来

1.  ps -l
2.  # UID PID PPID F CPU PRI NI SZ RSS WCHAN S ADDR TTY TIME CMD
3.  # 501 566 559 4006 0 31 0 4317620 228 - Ss 0 ttys001 0:00.05 /App...cOS/iTerm2 --server /usr/bin/login -fpl kenny/Ap...s/MacOS/iTerm2 --launch_shel
4.  # 501 592 577 4006 0 31 0 4297048 52 - S0 ttys001 0:00.63 -zsh

F 代表这个程序的旗标 (flag), 4 代表使用者为 super user
S 代表这个程序的状态 (STAT),关于各 STAT 的意义将在内文介绍
UID 程序被该 UID 所拥有
PID 就是这个程序的 ID !
PPID 则是其上级父程序的ID
C CPU 使用的资源百分比
PRI 这个是 Priority (优先执行序) 的缩写,详细后面介绍
NI 这个是 Nice 值,在下一小节我们会持续介绍
ADDR 这个是 kernel function,指出该程序在内存的那个部分。如果是个 running的程
序,一般就是 “-“
SZ 使用掉的内存大小
WCHAN 目前这个程序是否正在运作当中,若为 - 表示正在运作
TTY 登入者的终端机位置
TIME 使用掉的 CPU 时间。
CMD 所下达的指令为何

列出目前所有的正在内存当中的程序

1.  ps aux
# USER PID %CPU %MEM VSZ RSS TT STAT STARTED
TIME COMMAND
4.# kenny 6155 21.3 1.7 7969944 284912 ?? S 二03下午
199:14.14 /Appl...OS/WeChat
5.# kenny 559 20.4 0.8 4963740 138176 ?? S 二03下午
33:28.27 /Appl...S/iTerm2
6.# _windowserver 187 18.0 0.6 7005748 95884 ?? Ss 二03下午
288:44.97 /Syst...Light.WindowServer -daemon
7.# kenny 1408 10.7 2.1 5838592 347348 ?? S 二03下午
138:51.63 /Appl...nts/MacOS/Google Chrome
8. # kenny 327 5.8 0.5 5771984 79452 ?? S 二03下午
2:51.58 /Syst...pp/Contents/MacOS/Finder

USER:该 process 属于那个使用者账号的
PID :该 process 的号码
%CPU:该 process 使用掉的 CPU 资源百分比
%MEM:该 process 所占用的物理内存百分比
VSZ :该 process 使用掉的虚拟内存量 (Kbytes)
RSS :该 process 占用的固定的内存量 (Kbytes)
TTY :该 process 是在那个终端机上面运作,若与终端机无关,则显示 ?,另外, tty1-
tty6 是本机上面的登入者程序,若为 pts/0 等等的,则表示为由网络连接进主机的程序。
STAT:该程序目前的状态,主要的状态有
R :该程序目前正在运作,或者是可被运作
S :该程序目前正在睡眠当中 (可说是 idle 状态),但可被某些讯号 (signal) 唤醒。
T :该程序目前正在侦测或者是停止了
Z :该程序应该已经终止,但是其父程序却无法正常的终止他,造成 zombie (疆尸) 程序的状

START:该 process 被触发启动的时间
TIME :该 process 实际使用 CPU 运作的时间
COMMAND:该程序的实际指令

列出类似程序树的程序显示

1.  ps -axjf
3.# USER PID PPID PGID SESS JOBC STAT TT TIME COMMAND UID C STIME TTY
4.# root 1 0 1 0 0 Ss ?? 10:51.90
/sbin/launchd 0 0 二03下午 ??
5.# root 50 1 50 0 0 Ss ?? 0:10.07
/usr/sbin/syslog 0 0 二03下午 ??
6.# root 51 1 51 0 0 Ss ?? 0:29.90
/usr/libexec/Use 0 0 二03下午 ??

找出与 cron 与 syslog 这两个服务有关的 PID 号码

1.  ps aux | egrep '(cron|syslog)'
2.# root 50 0.0 0.0 4305532 1284 ?? Ss 二03下午
0:10.08 /usr/sbin/syslogd
4.# kenny 90167 0.0 0.0 4258468 184 s007 R+ 9:23下午
0:00.00 egrep (cron|syslog)

把所有进程显示出来,并输出到ps001.txt文件

1.  ps -aux > ps001.txt

19. iostat - 监视系统输入输出设备和CPU的使用情况

监视系统输入输出设备和CPU的使用情况

iostat命令 被用于监视系统输入输出设备和CPU的使用情况。它的特点是汇报磁盘活动统计情况,同时也会汇报出CPU使用情况。同vmstat一样,iostat也有一个弱点,就是它不能对某个进程进行深入分析,仅对系统的整体情况进行分析。

语法

1.  iostat(选项)(参数)

选项

1.  -c:仅显示CPU使用情况;
2.  -d:仅显示设备利用率;
3.  -k:显示状态以千字节每秒为单位,而不使用块每秒;
4.  -m:显示状态以兆字节每秒为单位;
5.  -p:仅显示块设备和所有被使用的其他分区的状态;
6.  -t:显示每个报告产生时的时间;
7.  -V:显示版号并退出;
8.  -x:显示扩展状态。

参数

间隔时间:每次报告的间隔时间(秒);
次数:显示报告的次数。

实例

用 iostat -x /dev/sda1  来观看磁盘I/O的详细情况:

1.  iostat -x /dev/sda1
2.  Linux 2.6.18-164.el5xen (localhost.localdomain)
3.  2010年03月26日
4.
5.  avg-cpu: %user %nice %system %iowait
6.  %steal %idle
7.  0.11 0.02 0.18 0.35
8.  0.03 99.31
9.
10.  Device: tps Blk_read/s Blk_wrtn/s
11.  Blk_read Blk_wrtn
12.  sda1 0.02 0.08
13.  0.00 2014 4

详细说明:第二行是系统信息和监测时间,第三行和第四行显示CPU使用情况(具体内容和mpstat命令相同)。这里主要关注后面I/O输出的信息,如下所示:

标示                说明
Device        监测设备名称
rrqm/s         每秒需要读取需求的数量
wrqm/s       每秒需要写入需求的数量
r/s               每秒实际读取需求的数量
w/s              每秒实际写入需求的数量
rsec/s         每秒读取区段的数量
wsec/s        每秒写入区段的数量
rkB/s           每秒实际读取的大小,单位为KB
wkB/s          每秒实际写入的大小,单位为KB
avgrq-sz        需求的平均大小区段
avgqu-sz       需求的平均队列长度
await           等待I/O平均的时间(milliseconds)
svctm          I/O需求完成的平均时间
%util         被I/O需求消耗的CPU百分比

20 . cut - 连接文件并打印到标准输出设备上

cut 命令 用来显示行中的指定部分,删除文件中指定字段。cut 经常用来显示文件的内容,类似于type 命令。
说明:该命令有两项功能,其一是用来显示文件的内容,它依次读取由参数 file 所指明的文件,将它们的内容输出到标准输出上;其二是连接两个或多个文件,如 cut fl f2 > f3  将把文件 fl 和f2 的内容合并起来,然后通过输出重定向符“>”的作用,将它们放入文件 f3 中。
当文件较大时,文本在屏幕上迅速闪过(滚屏),用户往往看不清所显示的内容。因此,一般用 more等命令分屏显示。为了控制滚屏,可以按 Ctrl+S 键,停止滚屏;按 Ctrl+Q 键可以恢复滚屏。按Ctrl+C(中断)键可以终止该命令的执行,并且返回 Shell 提示符状态。

语法

1.  cut(选项)(参数)

选项

1.  -b:仅显示行中指定直接范围的内容;
2.  -c:仅显示行中指定范围的字符;
3.  -d:指定字段的分隔符,默认的字段分隔符为“TAB”;
4.  -f:显示指定字段的内容;
5.  -n:与“-b”选项连用,不分割多字节字符;
6.  --complement:补足被选择的字节、字符或字段;
7.  --out-delimiter= 字段分隔符:指定输出内容是的字段分割符;
8.  --help:显示指令的帮助信息;
9.  --version:显示指令的版本信息。

参数

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

实例

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

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

使用 -f 选项提取指定字段(这里的 f 参数可以简单记忆为  --fields  的缩写):

1.  [root@localhost text]# cut -f 1 test.txt
2.  No
3.  01
4.  02
5.  03

1.  [root@localhost text]# cut -f2,3 test.txt
2.  Name Mark
3.  tom 69
4.  jack 71
5.  alex 68

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

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

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

1.  [root@localhost text]# cat test2.txt
2.  No;Name;Mark;Percent
3.  01;tom;69;91
4.  02;jack;71;87
5.  03;alex;68;98

1.  [root@localhost text]# cut -f2 -d";" test2.txt
2.  Name
3.  tom
4.  jack

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

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

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

上面是记法,结合下面选项将摸个范围的字节、字符指定为字段:
-b 表示字节;
-c 表示字符;
-f 表示定义字段。

示例

1.  [root@localhost text]# cat test.txt
2.  abcdefghijklmnopqrstuvwxyz
3.  abcdefghijklmnopqrstuvwxyz
4.  abcdefghijklmnopqrstuvwxyz
5.  abcdefghijklmnopqrstuvwxyz
6.  abcdefghijklmnopqrstuvwxyz

打印第 1 个到第 3 个字符:
1.  [root@localhost text]# cut -c1-3 test.txt
2.  abc
3.  abc
4.  abc
5.  abc
6.  abc

打印前 2 个字符:
1.  [root@localhost text]# cut -c-2 test.txt
2.  ab
3.  ab
4.  ab
5.  ab
6.  ab

打印从第 5 个字符开始到结尾:
1.  [root@localhost text]# cut -c5- test.txt
2.  efghijklmnopqrstuvwxyz
3.  efghijklmnopqrstuvwxyz
4.  efghijklmnopqrstuvwxyz
5.  efghijklmnopqrstuvwxyz
6.  efghijklmnopqrstuvwxyz

21. date - 显示或设置系统时间与日期

概要

1.  date [OPTION]... [+FORMAT]
2.  date [-u|--utc|--universal] [MMDDhhmm[[CC]YY][.ss]]

主要用途

转换时间到选定的格式,默认为当前。
设置系统时间。

参数

format:输出的时间格式。

1.  format可用的转义序列如下:
3.  %% 百分号
4.  %a 当地缩写的工作日名称(例如,Sun)
5.  %A 当地完整的工作日名称(例如,Sunday)
6.  %b 当地缩写的月份名称(例如,Jan)
7.  %B 当地完整的月份名称(例如,January)
8.  %c 当地的日期和时间(例如,Thu Mar 3 23:05:25 2005)
9.  %C 世纪,和%Y类似,但是省略后两位(例如,20)
10.  %d 一月中的一天(例如,01)
11.  %D 日期,等价于%m/%d/%y
12.  %e 一月中的一天,格式使用空格填充,等价于%_d
13.  %F 完整的日期;等价于%+4Y-%m-%d
14.  %g ISO标准计数周的年份的最后两位数字
15.  %G ISO标准计数周的年份,通常只对%V有用
16.  %h 等价于%b
17.  %H 小时,范围(00..23)
18.  %I 小时,范围(00..23)
19.  %j 一年中的一天,范围(001..366)
20.  %k 小时,使用空格填充,范围(0..23),等价于%_H
21.  %l 小时,使用空格填充,范围(1..12),等价于%_I
22.  %m 月,范围(01..12)
23.  %M 分钟,范围(00..59)
24.  %n 换行符
25.  %N 纳秒,范围(000000000..000000000)
26.  %p 用于表示当地的AM或PM,如果未知则为空白
27.  %P 类似于%p,但用小写表示
28.  %q 季度,范围(1..4)
29.  %r 当地以12小时表示的时钟时间(例如,11:11:04 PM)
30.  %R 24小时每分钟;等价于%H:%M
31.  %s 自协调世界时1970年01月01日00时00分以来的秒数
32.  %S 秒数,范围(00..60)
33.  %t 水平制表符
34.  %T 时间;等价于%H:%M:%S
35.  %u 一周中的一天(1..7),1代表星期一
36.  %U 一年中的第几周,周日作为一周的起始(00..53)
37.  %V ISO标准计数周,该方法将周一作为一周的起始(01..53)
38.  %w 一周中的一天(0..6),0代表星期天
39.  %W 一年中的第几周,周一作为一周的起始(00..53)
40.  %x 当地的日期表示(例如,12/31/99)
41.  %X 当地的时间表示(例如,23:13:48)
42.  %y 年份后两位数字,范围(00..99)
43.  %Y 年份
44.  %z +hhmm格式的数值化时区格式(例如,-0400)
45.  %:z +hh:mm格式的数值化时区格式(例如,-04:00)
46.  %::z +hh:mm:ss格式的数值化时区格式(例如,-04:00:00)
47.  %:::z 数值化时区格式,相比上一个格式增加':'以显示必要的精度(如,-04,+05:30)
48.  %Z 时区缩写(如EDT)默认情况下,日期用零填充数字字段;以下可选的符号可以跟在'%'后面: - (连字符) 不要填充相应的字段。 _ (下划线) 使用空格填充相应的字段。 0 (数字0) 使用数字0填充相应的字段。 + 用数字0填充,未来年份大于4位数字则在前面加上'+'号。 ^ 允许的情况下使用大写。  # 允许的情况下将默认的大写转换为小写,默认的小写转换为大写。  在任何标志之后都有一个可选的字段宽度,如小数;然后是一个可选的修饰符,在可用的情况下,使用E来使用当地语言环境的替代表示,使用O来使用当地语言环境的替代数字符号。

选项

1.  长选项与短选项等价
2.  -d, --date=STRING 解析字符串并按照指定格式输出,字符串不能是'now'。
4.  --debug 注释已解析的日期,并将有疑问的用法发送到标准错误。
5.  -f, --file=DATEFILE 类似于--date; 一次从DATEFILE处理一行。
6.  -I[FMT], --iso-8601[=FMT] 按照ISO 8601格式输出,FMT可以为'date'(默认),'hours','minutes','seconds','ns'。例如:2006-08-14T02:34:56-06:00
8.  -R, --rfc-email 按照RFC 5322格式输出,例如: Mon, 14 Aug 2006 02:34:56-0600
9.  --rfc-3339=FMT 按照RFC 3339格式输出,FMT可以为'date', 'seconds','ns'中的一个, 例如:2006-08-14 02:34:56-06:00
11.  -r, --reference=FILE 显示文件的上次修改时间。
12.  -s, --set=STRING 根据字符串设置系统时间。
13.  -u, --utc, --universal 显示或设置世界协调时(UTC)。
14.  --help 显示帮助信息并退出。
15.  --version 显示版本信息并退出。

返回值

返回状态为成功除非给出了非法选项或非法参数。

例子

1.  # 格式化输出:
2.  date +"%Y-%m-%d"
3.  2009-12-07
4.
5.  # 输出昨天日期:
6.  date -d "1 day ago" +"%Y-%m-%d"
7.  2012-11-19
8.
9.  # 2秒后输出:
10.  date -d "2 second" +"%Y-%m-%d %H:%M.%S"
11.  2012-11-20 14:21.31
12.
13.  # 传说中的 1234567890 秒:
14.  date -d "1970-01-01 1234567890 seconds" +"%Y-%m-%d %H:%M:%S"
15.  # 或者
16.  date -d@1234567890 +"%F %T"
17.  # 输出结果
18.  2009-02-13 23:02:30
19.
20.  # 时间格式转换:
21.  date -d "2009-12-12" +"%Y/%m/%d %H:%M.%S"
22.  # 输出结果
23.  2009/12/12 00:00.00
24.
25.  # apache格式转换:
26.  date -d "Dec 5, 2009 12:00:37 AM" +"%Y-%m-%d %H:%M.%S"
27.  # 输出结果
28.  2009-12-05 00:00.37
29.
30.  # 格式转换后时间游走:
31.  date -d "Dec 5, 2009 12:00:37 AM 2 year ago" +"%Y-%m-%d %H:%M.%S"
32.  # 输出结果
33.  2007-12-05 00:00.37
34.
35.  # 时间加减操作:
36.  date +%Y%m%d # 显示年月日
37.  date -d "+1 day" +%Y%m%d # 显示前一天的日期
38.  date -d "-1 day" +%Y%m%d # 显示后一天的日期
39.  date -d "-1 month" +%Y%m%d # 显示上一月的日期
40.  date -d "+1 month" +%Y%m%d # 显示下一月的日期
41.  date -d "-1 year" +%Y%m%d # 显示前一年的日期
42.  date -d "+1 year" +%Y%m%d # 显示下一年的日期
43.
44.  # 设定时间:
45.  date -s # 设置当前时间,只有root权限才能设置,其他只能查看
46.  date -s 20120523 # 设置成20120523,这样会把具体时间设置成00:00:00
47.  date -s 01:01:01 # 设置具体时间,不会对日期做更改
48.  date -s "01:01:01 2012-05-23" # 这样可以设置全部时间
49.  date -s "01:01:01 20120523" # 这样可以设置全部时间
50.  date -s "2012-05-23 01:01:01" # 这样可以设置全部时间
51.  date -s "20120523 01:01:01" # 这样可以设置全部时间
52.
53.  # 有时需要检查一组命令花费的时间:
54.  start=$(date +%s)
55.  nmap wangchujiang.com &> /dev/null
56.  end=$(date +%s)
57.  difference=$(( end - start ))

58.  # 显示执行时间
59.  echo $difference seconds.
60.
61.  # 当你考虑输出带有时间的字符串时,例如(Current time: 2019/05/19):
62.  # 通常使用的方法:
63.  echo "Current time: $(date +"%Y/%m/%d")"
64.  # 另一种方法:
65.  suffix='Current time:'
66.  # 注意如果换成单引号就不能替换变量了。
67.  date +"${suffix} %Y/%m/%d"

22. uname - 显示Linux系统信息

uname命令 用于打印当前系统相关信息(内核版本号、硬件架构、主机名称和操作系统类型等)。

选项

1.  -a或--all:显示全部的信息;
2.  -m或--machine:显示电脑类型;
3.  -n或-nodename:显示在网络上的主机名称;
4.  -r或--release:显示操作系统的发行编号;
5.  -s或--sysname:显示操作系统名称;
6.  -v:显示操作系统的版本;
7.  -p或--processor:输出处理器类型或"unknown";
8.  -i或--hardware-platform:输出硬件平台或"unknown";
9.  -o或--operating-system:输出操作系统名称;
10.  --help:显示帮助;
11.  --version:显示版本信息。

实例

使用uname命令查看全部信息:

1.  [root@localhost ~]# uname #单独使用uname命令时相当于uname -s
2.  Linux
3.
4.  [root@localhost ~]# uname -a
5.
Linux localhost 2.6.18-348.6.1.el5 #1 SMP Tue May 21 15:34:22 EDT 2013 i686
i686 i386 GNU/Linux
6.
7.  [root@localhost ~]# uname -m
8.  i686

10.  [root@localhost ~]# uname -n
11.  localhost
12.
13.  [root@localhost ~]# uname -r
14.  2.6.18-4-686
15.
16.  [root@localhost ~]# uname -s
17.  Linux
18.
19.  [root@localhost ~]# uname -v
20.  #1 SMP Tue May 21 15:34:22 EDT 2013
21.
22.  [root@localhost ~]# uname -p
23.  i686
24.
25.  [root@localhost ~]# uname -i
26.  i386
27.
28.  [root@localhost ~]# uname -o
29.  GNU/Linux
30.
31.  [root@localhost ~]# uname --version
32.  uname (GNU coreutils) 5.97
33.  Copyright (C) 2006 free Software Foundation, Inc.
34.这是自由软件。您可以按照 GNU GPL 协议 <http://www.gnu.org/licenses/gpl.html> 的条款再发布此软件的副本,但我们无法保证相关法律不对这一情形进行限制。
由 David MacKenzie 编写。

23. ln - 用来为文件创建链接

ln命令 用来为文件创建链接,链接类型分为硬链接和符号链接两种,默认的链接类型是硬链接。如果要创建符号链接必须使用”-s”选项。
注意:符号链接文件不是一个独立的文件,它的许多属性依赖于源文件,所以给符号链接文件设置存取权限是没有意义的。

语法

1.  ln [选项]... [-T] 目标 链接名 (第一种格式)
2.   或:ln [选项]... 目标 (第二种格式)
3.   或:ln [选项]... 目标... 目录 (第三种格式)
4.   或:ln [选项]... -t 目录 目标... (第四种格式)

选项

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

参数

源文件:指定链接的源文件。如果使用 -s  选项创建符号链接,则“源文件”可以是文件或者目
录。创建硬链接时,则“源文件”参数只能是文件;
目标文件:指定源文件的目标链接文件。

1.  none, off # 不进行备份(即使使用了--backup 选项)
2.  numbered, t # 备份文件加上数字进行排序
3.  existing, nil # 若有数字的备份文件已经存在则使用数字,否则使用普通方式备份
4.  simple, never # 永远使用普通方式备份

实例

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

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

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

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

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

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

扩展知识

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

硬链接

建立硬链接时,在另外的目录或本目录中增加目标文件的一个目录项,这样,一个文件就登记在多个目录中。如图所示的m2.c文件就在目录mub1和liu中都建立了目录项。创建硬链接后,己经存在的文件的I节点号(Inode)会被多个目录文件项使用。一个文件的硬链接数
可以在目录的长列表格式的第二列中看到,无额外链接的文件的链接数为l。
在默认情况下,ln命令创建硬链接。ln命令会增加链接数,rm命令会减少链接数。一个文件除非链接数为0,否则不会从文件系统中被物理地删除。

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

符号链接

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

!符号连接
与硬链接不同的是,符号链接确实是一个新文件,当然它具有不同的I节点号;而硬链接并没有建立新文件。
符号链接没有硬链接的限制,可以对目录文件做符号链接,也可以在不同文件系统之间做符号链接。
用 ln -s  命令建立符号链接时,源文件最好用绝对路径名。这样可以在任何工作目录下进行符号链接。而当源文件用相对路径时,如果当前的工作路径与要创建的符号链接文件所在路径不同,就不能进行链接。

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

24. fdisk - 查看磁盘使用情况和磁盘分区

fdisk命令 用于观察硬盘实体使用情况,也可对硬盘分区。它采用传统的问答式界面,而非类似DOS。fdisk的cfdisk互动式操作界面,因此在使用上较为不便,但功能却丝毫不打折扣。

语法

1.  fdisk(选项)(参数)

选项

1.  -b <大小> 扇区大小(512、1024、2048或4096)
2.  -c[=<模式>] 兼容模式:“dos”或“nondos”(默认)
3.  -h 打印此帮助文本
4.  -u[=<单位>] 显示单位:“cylinders”(柱面)或“sectors”(扇区,默认)
5.  -v 打印程序版本
6.  -C <数字> 指定柱面数
7.  -H <数字> 指定磁头数
8.  -S <数字> 指定每个磁道的扇区数

参数

设备文件:指定要进行分区或者显示分区的硬盘设备文件。

实例

首先选择要进行操作的磁盘:

1.  [root@localhost ~]# fdisk /dev/sdb

输入 m  列出可以执行的命令:

1.  command (m for help): m
2.  Command action
3.  a toggle a bootable flag
4.  b edit bsd disklabel
5.  c toggle the dos compatibility flag
6.  d delete a partition
7.  l list known partition types
8.  m print this menu
9.  n add a new partition
10.  o create a new empty DOS partition table
11.  p print the partition table
12.  q quit without saving changes
13.  s create a new empty Sun disklabel
14.  t change a partition's system id
15.  u change display/entry units
16.  v verify the partition table
17.  w write table to disk and exit
18.  x extra functionality (experts only)

输入 p  列出磁盘目前的分区情况:

1.  Command (m for help): p
2.
3.  Disk /dev/sdb: 3221 MB, 3221225472 bytes
4.  255 heads, 63 sectors/track, 391 cylinders
5.  Units = cylinders of 16065 * 512 = 8225280 bytes
6.
7.  Device Boot Start End Blocks Id System
8.  /dev/sdb1 1 1 8001 8e Linux LVM
9.  /dev/sdb2 2 26 200812+ 83 Linux

输入 d  然后选择分区,删除现有分区:

1.  Command (m for help): d
2.  Partition number (1-4): 1
3.
4.  Command (m for help): d
5.  Selected partition 2

查看分区情况,确认分区已经删除:

1.  Command (m for help): print
2.
3.  Disk /dev/sdb: 3221 MB, 3221225472 bytes
4.  255 heads, 63 sectors/track, 391 cylinders
5.  Units = cylinders of 16065 * 512 = 8225280 bytes
6.
7.  Device Boot Start End Blocks Id System
8.
9.  Command (m for help):

输入 n  建立新的磁盘分区,首先建立两个主磁盘分区:

1.  Command (m for help): n
2.  Command action
3.  e extended
4.  p primary partition (1-4)
5.  p //建立主分区
6.  Partition number (1-4): 1 //分区号
7.  First cylinder (1-391, default 1): //分区起始位置
8.  Using default value 1
9.  last cylinder or +size or +sizeM or +sizeK (1-391, default 391): 100 //分区结束位置,单位为扇区
10.
11.  Command (m for help): n //再建立一个分区
12.  Command action
13.  e extended
14.  p primary partition (1-4)
15.  p
16.  Partition number (1-4): 2 //分区号为2
17.  First cylinder (101-391, default 101):
18.  Using default value 101
19.  Last cylinder or +size or +sizeM or +sizeK (101-391, default 391): +200M //分区结束位置,单位为M

确认分区建立成功:

1.  Command (m for help): p
2.
3.  Disk /dev/sdb: 3221 MB, 3221225472 bytes
4.  255 heads, 63 sectors/track, 391 cylinders
5.  Units = cylinders of 16065 * 512 = 8225280 bytes
6.
7.  Device Boot Start End Blocks Id System
8.  /dev/sdb1 1 100 803218+ 83 Linux
9.  /dev/sdb2 101 125 200812+ 83 Linux

再建立一个逻辑分区:

1.  Command (m for help): n
2.  Command action
3.  e extended
4.  p primary partition (1-4)
5.  e //选择扩展分区
6.  Partition number (1-4): 3
7.  First cylinder (126-391, default 126):
8.  Using default value 126
9.  Last cylinder or +size or +sizeM or +sizeK (126-391, default 391):
10.  Using default value 391

确认扩展分区建立成功:

1.  Command (m for help): p
2.
3.  Disk /dev/sdb: 3221 MB, 3221225472 bytes
4.  255 heads, 63 sectors/track, 391 cylinders
5.  Units = cylinders of 16065 * 512 = 8225280 bytes
6.
7.  Device Boot Start End Blocks Id System
8.  /dev/sdb1 1 100 803218+ 83 Linux
9.  /dev/sdb2 101 125 200812+ 83 Linux
10.  /dev/sdb3 126 391 2136645 5 Extended

在扩展分区上建立两个逻辑分区:

1.  Command (m for help): n
2.  Command action
3.  l logical (5 or over)
4.  p primary partition (1-4)
5.  l //选择逻辑分区
6.  First cylinder (126-391, default 126):
7.  Using default value 126
8.  Last cylinder or +size or +sizeM or +sizeK (126-391, default 391): +400M
9.
10.  Command (m for help): n
11.  Command action
12.  l logical (5 or over)
13.  p primary partition (1-4)
14.  l
15.  First cylinder (176-391, default 176):
16.  Using default value 176
17.  Last cylinder or +size or +sizeM or +sizeK (176-391, default 391):
18.  Using default value 391

确认逻辑分区建立成功:

1.  Command (m for help): p
2.
3.  Disk /dev/sdb: 3221 MB, 3221225472 bytes
4.  255 heads, 63 sectors/track, 391 cylinders
5.  Units = cylinders of 16065 * 512 = 8225280 bytes
6.
7.  Device Boot Start End Blocks Id System
8.  /dev/sdb1 1 100 803218+ 83 Linux
9.  /dev/sdb2 101 125 200812+ 83 Linux
10.  /dev/sdb3 126 391 2136645 5 Extended
11.  /dev/sdb5 126 175 401593+ 83 Linux
12.  /dev/sdb6 176 391 1734988+ 83 Linux
13.
14.  Command (m for help):

从上面的结果我们可以看到,在硬盘sdb我们建立了2个主分区(sdb1,sdb2),1个扩展分区
(sdb3),2个逻辑分区(sdb5,sdb6)
注意:主分区和扩展分区的磁盘号位1-4,也就是说最多有4个主分区或者扩展分区,逻辑分区开始的磁盘号为5,因此在这个实验中试没有sdb4的。
最后对分区操作进行保存:

1.  Command (m for help): w
2.  The partition table has been altered!
3.
4.  Calling ioctl() to re-read partition table.
5.  Syncing disks.

建立好分区之后我们还需要对分区进行格式化才能在系统中使用磁盘。
在sdb1上建立ext2分区:

1.  [root@localhost ~]# mkfs.ext2 /dev/sdb1
2.  mke2fs 1.39 (29-May-2006)
3.  Filesystem label=
4.  OS type: Linux
5.  Block size=4096 (log=2)
6.  Fragment size=4096 (log=2)
7.  100576 inodes, 200804 blocks
8.  10040 blocks (5.00%) reserved for the super user
9.  First data block=0
10.  Maximum filesystem blocks=209715200
11.  7 block groups
12.  32768 blocks per group, 32768 fragments per group
13.  14368 inodes per group
14.  Superblock backups stored on blocks:
15.  32768, 98304, 163840
16.
17.  Writing inode tables: done
18.  Writing superblocks and filesystem accounting information: done
19.
20.  This filesystem will be automatically checked every 32 mounts or
21.  180 days, whichever comes first. Use tune2fs -c or -i to override.

在sdb6上建立ext3分区:

1.  [root@localhost ~]# mkfs.ext3 /dev/sdb6
2.  mke2fs 1.39 (29-May-2006)
3.  Filesystem label=
4.  OS type: Linux
5.  Block size=4096 (log=2)
6.  Fragment size=4096 (log=2)
7.  217280 inodes, 433747 blocks
8.  21687 blocks (5.00%) reserved for the super user
9.  First data block=0
10.  Maximum filesystem blocks=444596224
11.  14 block groups
12.  32768 blocks per group, 32768 fragments per group
13.  15520 inodes per group
14.  Superblock backups stored on blocks:
15.  32768, 98304, 163840, 229376, 294912
16.
17.  Writing inode tables: done
18.  Creating journal (8192 blocks): done
19.  Writing superblocks and filesystem accounting information: done
21.  This filesystem will be automatically checked every 32 mounts or
22.  180 days, whichever comes first. Use tune2fs -c or -i to override.
23.  [root@localhost ~]#

建立两个目录 /oracle  和 /web  ,将新建好的两个分区挂载到系统:

1.  [root@localhost ~]# mkdir /oracle
2.  [root@localhost ~]# mkdir /web
3.  [root@localhost ~]# mount /dev/sdb1 /oracle
4.  [root@localhost ~]# mount /dev/sdb6 /web

查看分区挂载情况:

1.  [root@localhost ~]# df -h
2.  文件系统 容量 已用 可用 已用% 挂载点
3.  /dev/mapper/VolGroup00-LogVol00
4.  6.7G 2.8G 3.6G 44% /
5.  /dev/sda1 99M 12M 82M 13% /boot
6.  tmpfs 125M 0 125M 0% /dev/shm
7.  /dev/sdb1 773M 808K 733M 1% /oracle
8.  /dev/sdb6 1.7G 35M 1.6G 3% /web

如果需要每次开机自动挂载则需要修改 /etc/fstab  文件,加入两行配置:

1.  [root@localhost ~]# vim /etc/fstab
2.
3.  /dev/VolGroup00/LogVol00 / ext3 defaults 1 1
4.  LABEL=/boot /boot ext3 defaults 1 2
5.  tmpfs /dev/shm tmpfs defaults 0 0
6.  devpts /dev/pts devpts gid=5,mode=620 0 0
7.  sysfs /sys sysfs defaults 0 0
8.  proc /proc proc defaults 0 0
9.  /dev/VolGroup00/LogVol01 swap swap defaults 0 0
10.  /dev/sdb1 /oracle ext2 defaults 0 0
11.  /dev/sdb6 /web ext3 defaults 0 0

25. mount - 用于挂载Linux系统外的文件

mount命令 Linux mount命令是经常会使用到的命令,它用于挂载Linux系统外的文件。

语法

1.  mount [-hV]
2.  mount -a [-fFnrsvw] [-t vfstype]
3.  mount [-fnrsvw] [-o options [,...]] device | dir
4.  mount [-fnrsvw] [-t vfstype] [-o options] device dir

选项

1.  -V:显示程序版本
2.  -h:显示辅助讯息
3.  -v:显示较讯息,通常和 -f 用来除错。
4.  -a:将 /etc/fstab 中定义的所有档案系统挂上。
5.  -F:这个命令通常和 -a 一起使用,它会为每一个 mount 的动作产生一个行程负责执行。在系统需要挂上大量 NFS 档案系统时可以加快挂上的动作。
6.  -f:通常用在除错的用途。它会使 mount 并不执行实际挂上的动作,而是模拟整个挂上的过程。通常会和-v 一起使用。
7.  -n:一般而言,mount 在挂上后会在 /etc/mtab 中写入一笔资料。但在系统中没有可写入档案系统存在的情况下可以用这个选项取消这个动作。
8.  -s-r:等于 -o ro
9.  -w:等于 -o rw
10.  -L:将含有特定标签的硬盘分割挂上。
11.  -U:将档案分割序号为 的档案系统挂下。-L 和 -U 必须在/proc/partition 这种档案存在时才有意义。
12.  -t:指定档案系统的型态,通常不必指定。mount 会自动选择正确的型态。
13.  -o async:打开非同步模式,所有的档案读写动作都会用非同步模式执行。
14.  -o sync:在同步模式下执行。
15.  -o atime、-o noatime:当 atime 打开时,系统会在每次读取档案时更新档案的『上一次调用时间』。当我们使用 flash 档案系统时可能会选项把这个选项关闭以减少写入的次数。
16.  -o auto、-o noauto:打开/关闭自动挂上模式。
17.  -o defaults:使用预设的选项 rw, suid, dev, exec, auto, nouser, and async.
18.  -o dev、-o nodev-o exec、-o noexec允许执行档被执行。
19.  -o suid、-o nosuid:允许执行档在 root 权限下执行。
21.  -o user、-o nouser:使用者可以执行 mount/umount 的动作。
22.  -o remount:将一个已经挂下的档案系统重新用不同的方式挂上。例如原先是唯读的系统,现在用可读写的模式重新挂上。
23.  -o ro:用唯读模式挂上。
24.  -o rw:用可读写模式挂上。
25.  -o loop=:使用 loop 模式用来将一个档案当成硬盘分割挂上系统。

实例

将  /dev/hda1  挂在  /mnt  之下。

1.  #mount /dev/hda1 /mnt

将  /dev/hda1  用唯读模式挂在  /mnt  之下。

1.  #mount -o ro /dev/hda1 /mnt

将  /tmp/image.iso  这个光碟的  image  档使用  loop  模式挂在  /mnt/cdrom  之下。
用这种方法可以将一般网络上可以找到的  Linux  光 碟 ISO 档在不烧录成光碟的情况下检视其内
容。

1.  #mount -o loop /tmp/image.iso /mnt/cdrom

26. systemctl - 系统服务管理器指令

systemctl命令 是系统服务管理器指令,它实际上将 service 和 chkconfig 这两个命令组合到
一起。

任务                            旧指令                                   新指令
使某服务自动启动   chkconfig --level 3 httpd on   /   systemctl enable httpd.service
使某服务不自动启动   chkconfig --level 3 httpd off    /   systemctl disable httpd.service
检查服务状态    service httpd status   /   systemctl status httpd.service (服务详细信息)
systemctl is-active httpd.service (仅显示是否 Active)
显示所有已启动的服务   chkconfig --list   /  systemctl list-units --type=service
启动某服务    service httpd start   /    systemctl start httpd.service
停止某服务    service httpd stop   /   systemctl stop httpd.service
重启某服务    service httpd restart   /   systemctl restart httpd.service

实例

1.  systemctl start nfs-server.service . # 启动nfs服务
2.  systemctl enable nfs-server.service # 设置开机自启动
3.  systemctl disable nfs-server.service # 停止开机自启动
4.  systemctl status nfs-server.service # 查看服务当前状态
5.  systemctl restart nfs-server.service # 重新启动某服务
6.  systemctl list-units --type=service # 查看所有已启动的服务

开启防火墙22端口

1.  iptables -I INPUT -p tcp --dport 22 -j accept

如果仍然有问题,就可能是SELinux导致的,关闭SElinux:

修改 /etc/selinux/config  文件中的 SELINUX=""  为disabled,然后重启。

彻底关闭防火墙:

1.  sudo systemctl status firewalld.service
2.  sudo systemctl stop firewalld.service
3.  sudo systemctl disable firewalld.service

27. ping - 测试主机之间网络的连通性

ping命令 用来测试主机之间网络的连通性。执行ping指令会使用ICMP传输协议,发出要求回应的信息,若远端主机的网络功能没有问题,就会回应该信息,因而得知该主机运作正常。

选项

1.  -d:使用Socket的SO_DEBUG功能;
2.  -c<完成次数>:设置完成要求回应的次数;
3.  -f:极限检测;
4.  -i<间隔秒数>:指定收发信息的间隔时间;
5.  -I<网络界面>:使用指定的网络界面送出数据包;
6.  -l<前置载入>:设置在送出要求信息之前,先行发出的数据包;
7.  -n:只输出数值;
8.  -p<范本样式>:设置填满数据包的范本样式;
9.  -q:不显示指令执行过程,开头和结尾的相关信息除外;
10.  -r:忽略普通的Routing Table,直接将数据包送到远端主机上;
11.  -R:记录路由过程;
12.  -s<数据包大小>:设置数据包的大小;
13.  -t<存活数值>:设置存活数值TTL的大小;
14.  -v:详细显示指令的执行过程。

参数

目的主机:指定发送ICMP报文的目的主机。

实例

1.  [root@AY1307311912260196fcZ ~]# ping www.jsdig.com
2.  PING host.1.jsdig.com (100.42.212.8) 56(84) bytes of data.
3.  64 bytes from 100-42-212-8.static.webnx.com (100.42.212.8): icmp_seq=1 ttl=50
time=177 ms
4.  64 bytes from 100-42-212-8.static.webnx.com (100.42.212.8): icmp_seq=2 ttl=50
time=178 ms
5.  64 bytes from 100-42-212-8.static.webnx.com (100.42.212.8): icmp_seq=3 ttl=50
time=174 ms
6.  64 bytes from 100-42-212-8.static.webnx.com (100.42.212.8): icmp_seq=4 ttl=50
time=177 ms
7.  ...按Ctrl+C结束
8.
9.  --- host.1.jsdig.com ping statistics ---
10.  4 packets transmitted, 4 received, 0% packet loss, time 2998ms
11.  rtt min/avg/max/mdev = 174.068/176.916/178.182/1.683 ms

28. traceroute - 显示数据包到主机间的路径

traceroute命令 用于追踪数据包在网络上的传输时的全部路径,它默认发送的数据包大小是40字
节。
通过traceroute我们可以知道信息从你的计算机到互联网另一端的主机是走的什么路径。当然每次数据包由某一同样的出发点(source)到达某一同样的目的地(destination)走的路径可能会不一样,但基本上来说大部分时候所走的路由是相同的。
traceroute通过发送小的数据包到目的设备直到其返回,来测量其需要多长时间。一条路径上的每个设备traceroute要测3次。输出结果中包括每次测试的时间(ms)和设备的名称(如有的话)及其ip地址。

选项

1.  -d:使用Socket层级的排错功能;
2.  -f<存活数值>:设置第一个检测数据包的存活数值TTL的大小;
3.  -F:设置勿离断位;
4.  -g<网关>:设置来源路由网关,最多可设置8个;
5.  -i<网络界面>:使用指定的网络界面送出数据包;
6.  -I:使用ICMP回应取代UDP资料信息;
7.  -m<存活数值>:设置检测数据包的最大存活数值TTL的大小;
8.  -n:直接使用IP地址而非主机名称;
9.  -p<通信端口>:设置UDP传输协议的通信端口;
10.  -r:忽略普通的Routing Table,直接将数据包送到远端主机上。
11.  -s<来源地址>:设置本地主机送出数据包的IP地址;
12.  -t<服务类型>:设置检测数据包的TOS数值;
13.  -v:详细显示指令的执行过程;
14.  -w<超时秒数>:设置等待远端主机回报的时间;
15.  -x:开启或关闭数据包的正确性检验。

参数

主机:指定目的主机IP地址或主机名。

实例

1.  traceroute www.58.com
2.  traceroute to www.58.com (211.151.111.30), 30 hops max, 40 byte packets
3.  1 unknown (192.168.2.1) 3.453 ms 3.801 ms 3.937 ms
4.  2 221.6.45.33 (221.6.45.33) 7.768 ms 7.816 ms 7.840 ms
5.  3 221.6.0.233 (221.6.0.233) 13.784 ms 13.827 ms 221.6.9.81 (221.6.9.81)
9.758 ms
6.  4 221.6.2.169 (221.6.2.169) 11.777 ms 122.96.66.13 (122.96.66.13) 34.952 ms
221.6.2.53 (221.6.2.53) 41.372 ms
7.  5 219.158.96.149 (219.158.96.149) 39.167 ms 39.210 ms 39.238 ms
8.  6 123.126.0.194 (123.126.0.194) 37.270 ms 123.126.0.66 (123.126.0.66)
37.163 ms 37.441 ms
9.  7 124.65.57.26 (124.65.57.26) 42.787 ms 42.799 ms 42.809 ms
10.  8 61.148.146.210 (61.148.146.210) 30.176 ms 61.148.154.98 (61.148.154.98)
32.613 ms 32.675 ms
11.  9 202.106.42.102 (202.106.42.102) 44.563 ms 44.600 ms 44.627 ms
12.  10 210.77.139.150 (210.77.139.150) 53.302 ms 53.233 ms 53.032 ms
13.  11 211.151.104.6 (211.151.104.6) 39.585 ms 39.502 ms 39.598 ms
14.  12 211.151.111.30 (211.151.111.30) 35.161 ms 35.938 ms 36.005 ms

记录按序列号从1开始,每个纪录就是一跳 ,每跳表示一个网关,我们看到每行有三个时间,单位是ms,其实就是 -q 的默认参数。探测数据包向每个网关发送三个数据包后,网关响应后返回的时间;
如果用 traceroute -q 4 www.58.com  ,表示向每个网关发送4个数据包。
有时我们traceroute一台主机时,会看到有一些行是以星号表示的。出现这样的情况,可能是防火墙封掉了ICMP的返回信息,所以我们得不到什么相关的数据包返回数据。
有时我们在某一网关处延时比较长,有可能是某台网关比较阻塞,也可能是物理设备本身的原因。当然如果某台DNS出现问题时,不能解析主机名、域名时,也会有延时长的现象;您可以加 -n  参数来避免DNS解析,以IP格式输出数据。
如果在局域网中的不同网段之间,我们可以通过traceroute 来排查问题所在,是主机的问题还是网
关的问题。如果我们通过远程来访问某台服务器遇到问题时,我们用到traceroute 追踪数据包所经
过的网关,提交IDC服务商,也有助于解决问题;但目前看来在国内解决这样的问题是比较困难的,就是我们发现问题所在,IDC服务商也不可能帮助我们解决。

跳数设置

1.  [root@localhost ~]# traceroute -m 10 www.baidu.com
2.  traceroute to www.baidu.com (61.135.169.105), 10 hops max, 40 byte packets
3.  1 192.168.74.2 (192.168.74.2) 1.534 ms 1.775 ms 1.961 ms
4.  2 211.151.56.1 (211.151.56.1) 0.508 ms 0.514 ms 0.507 ms
5.  3 211.151.227.206 (211.151.227.206) 0.571 ms 0.558 ms 0.550 ms
6.  4 210.77.139.145 (210.77.139.145) 0.708 ms 0.729 ms 0.785 ms
7.  5 202.106.42.101 (202.106.42.101) 7.978 ms 8.155 ms 8.311 ms
8.  6 bt-228-037.bta.net.cn (202.106.228.37) 772.460 ms bt-228-025.bta.net.cn
(202.106.228.25) 2.152 ms 61.148.154.97 (61.148.154.97) 772.107 ms
9.  7 124.65.58.221 (124.65.58.221) 4.875 ms 61.148.146.29 (61.148.146.29)
2.124 ms 124.65.58.221 (124.65.58.221) 4.854 ms
10.  8 123.126.6.198 (123.126.6.198) 2.944 ms 61.148.156.6 (61.148.156.6) 3.505
ms 123.126.6.198 (123.126.6.198) 2.885 ms
11.  9 * * *
12.  10 * * *

其它一些实例

1.  traceroute -m 10 www.baidu.com # 跳数设置
2.  traceroute -n www.baidu.com # 显示IP地址,不查主机名
3.  traceroute -p 6888 www.baidu.com # 探测包使用的基本UDP端口设置6888
4.  traceroute -q 4 www.baidu.com # 把探测包的个数设置为值4
5.  traceroute -r www.baidu.com # 绕过正常的路由表,直接发送到网络相连的主机
6.  traceroute -w 3 www.baidu.com # 把对外发探测包的等待响应时间设置为3秒

29. cp - 将源文件或目录复制到目标文件或目录中

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

选项

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

参数

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

实例

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

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

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

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

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

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

1.  cp ../mary/homework/assign .

所有目标文件指定的目录必须是己经存在的,cp命令不能创建目录。如果没有文件复制的权限,则系统会显示出错信息。
将文件file复制到目录 /usr/men/tmp  下,并改名为file1

1.  cp file /usr/men/tmp/file1

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

1.  cp -r /usr/men /usr/zh

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

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

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

1.  cp aaa/* /bbb
2.  # 复制目录aaa下所有到/bbb目录下,这时如果/bbb目录下有和aaa同名的文件,需要按Y来确认并且会略过aaa目录下的子目录。
3.
4.  cp -r aaa/* /bbb
5.  # 这次依然需要按Y来确认操作,但是没有忽略子目录。
6.
7.  cp -r -a aaa/* /bbb
8.  # 依然需要按Y来确认操作,并且把aaa目录以及子目录和文件属性也传递到了/bbb。
9.
10.  \cp -r -a aaa/* /bbb
11.  # 成功,没有提示按Y、传递了目录属性、没有略过目录。

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

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

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

1.  cp -r aaa/.* ./bbb
2.  # 将 aaa 目录下的,所有`.`开头的文件,复制到 bbb 目录中。
3.
4.  cp -a aaa ./bbb/
5.  # 记住后面目录最好的'/' 带上 `-a` 参数

30. chmod - 用来变更文件或目录的权限

 概要

1.  chmod [OPTION]... MODE[,MODE]... FILE...
2.  chmod [OPTION]... OCTAL-MODE FILE...
3.  chmod [OPTION]... --reference=RFILE FILE...

主要用途

通过符号组合的方式更改目标文件或目录的权限。
通过八进制数的方式更改目标文件或目录的权限。
通过参考文件的权限来更改目标文件或目录的权限。

参数

mode:八进制数或符号组合。
file:指定要更改权限的一到多个文件。

选项

1.  -c, --changes:当文件的权限更改时输出操作信息。
2.  --no-preserve-root:不将'/'特殊化处理,默认选项。
3.  --preserve-root:不能在根目录下递归操作。
4.  -f, --silent, --quiet:抑制多数错误消息的输出。
5.  -v, --verbose:无论文件是否更改了权限,一律输出操作信息。
6.  --reference=RFILE:使用参考文件或参考目录RFILE的权限来设置目标文件或目录的权限。
7.  -R, --recursive:对目录以及目录下的文件递归执行更改权限操作。
8.  --help:显示帮助信息并退出。
9.  --version:显示版本信息并退出。

返回值

返回状态为成功除非给出了非法选项或非法参数。

例子

参考 man chmod 文档的 DESCRIPTION 段落得知:
u 符号代表当前用户。
g 符号代表和当前用户在同一个组的用户,以下简称组用户。
o 符号代表其他用户。
a 符号代表所有用户。
r 符号代表读权限以及八进制数 4 。
w 符号代表写权限以及八进制数 2 。
x 符号代表执行权限以及八进制数 1 。
X 符号代表如果目标文件是可执行文件或目录,可给其设置可执行权限。
s 符号代表设置权限suid和sgid,使用权限组合 u+s 设定文件的用户的ID位, g+s 设置组用户ID位。
t 符号代表只有目录或文件的所有者才可以删除目录下的文件。
+ 符号代表添加目标用户相应的权限。
- 符号代表删除目标用户相应的权限。
= 符号代表添加目标用户相应的权限,删除未提到的权限。

1.  linux文件的用户权限说明:
2.  # 查看当前目录(包含隐藏文件)的长格式。
4.  ls -la
5.  -rw-r--r-- 1 user staff 651 Oct 12 12:53 .gitmodules
6.
7.  # 第1位如果是d则代表目录,是-则代表普通文件。
8.  # 更多详情请参阅info coreutils 'ls invocation'(ls命令的info文档)的'-l'选项部分。
9.  # 第2到4位代表当前用户的权限。
10.  # 第5到7位代表组用户的权限。
11.  # 第8到10位代表其他用户的权限。

1.  # 添加组用户的写权限。
2.  chmod g+w ./test.log
3.  # 删除其他用户的所有权限。
4.  chmod o= ./test.log
5.  # 使得所有用户都没有写权限。
6.  chmod a-w ./test.log
7.  # 当前用户具有所有权限,组用户有读写权限,其他用户只有读权限。
8.  chmod u=rwx, g=rw, o=r ./test.log
9.  # 等价的八进制数表示:
10.  chmod 754 ./test.log
11.  # 将目录以及目录下的文件都设置为所有用户拥有读写权限。
12.  # 注意,使用'-R'选项一定要保留当前用户的执行和读取权限,否则会报错!
13.  chmod -R a=rw ./testdir/
14.  # 根据其他文件的权限设置文件权限。
15.  chmod --reference=./1.log ./test.log

31. chown - 用来变更文件或目录的拥有者或所属群组

chown命令 改变某个文件或目录的所有者和所属的组,该命令可以向某个用户授权,使该用户变成指定文件的所有者或者改变文件所属的组。用户可以是用户或者是用户D,用户组可以是组名或组id。文件名可以使由空格分开的文件列表,在文件名中可以包含通配符。

只有文件主和超级用户才可以便用该命令。

选项

1.  -c或——changes:效果类似“-v”参数,但仅回报更改的部分;
2.  -f或--quite或——silent:不显示错误信息;
3.  -h或--no-dereference:只对符号连接的文件作修改,而不更改其他任何相关文件;
4.  -R或——recursive:递归处理,将指定目录下的所有文件及子目录一并处理;
5.  -v或——version:显示指令执行过程;
6.  --dereference:效果和“-h”参数相同;
7.  --help:在线帮助;
8.  --reference=<参考文件或目录>:把指定文件或目录的拥有者与所属群组全部设成和参考文件或目录的拥有者与所属群组相同;
9.  --version:显示版本信息。

参数

用户:组:指定所有者和所属工作组。当省略“:组”,仅改变文件所有者;
文件:指定要改变所有者和工作组的文件列表。支持多个文件和目标,支持shell通配符。

实例

将目录 /usr/meng  及其下面的所有文件、子目录的文件主改成 liu:

1.  chown -R liu /usr/meng

32. rpm - RPM软件包的管理工具

rpm命令 是RPM软件包的管理工具。rpm原本是Red Hat Linux发行版专门用来管理Linux各项套件
的程序,由于它遵循GPL规则且功能强大方便,因而广受欢迎。逐渐受到其他发行版的采用。RPM套件管理方式的出现,让Linux易于安装,升级,间接提升了Linux的适用度。

选项

1.  -a:查询所有套件;
2.  -b<完成阶段><套件档>+或-t <完成阶段><套件档>+:设置包装套件的完成阶段,并指定套件档的文件名称;
3.  -c:只列出组态配置文件,本参数需配合"-l"参数使用;
4.  -d:只列出文本文件,本参数需配合"-l"参数使用;
5.  -e<套件档>或--erase<套件档>:删除指定的套件;
6.  -f<文件>+:查询拥有指定文件的套件;
7.  -h或--hash:套件安装时列出标记;
8.  -i:显示套件的相关信息;
9.  -i<套件档>或--install<套件档>:安装指定的套件档;
10.  -l:显示套件的文件列表;
11.  -p<套件档>+:查询指定的RPM套件档;
12.  -q:使用询问模式,当遇到任何问题时,rpm指令会先询问用户;
13.  -R:显示套件的关联性信息;
14.  -s:显示文件状态,本参数需配合"-l"参数使用;
15.  -U<套件档>或--upgrade<套件档>:升级指定的套件档;
16.  -v:显示指令执行过程;
17.  -vv:详细显示指令执行过程,便于排错。

参数

软件包:指定要操纵的rpm软件包。

实例

如何安装rpm软件包

rpm软件包的安装可以使用程序rpm来完成。执行下面的命令:

1.  rpm -ivh your-package.rpm

其中your-package.rpm是你要安装的rpm包的文件名,一般置于当前目录下。

安装过程中可能出现下面的警告或者提示:

1.  ... conflict with ...

可能是要安装的包里有一些文件可能会覆盖现有的文件,缺省时这样的情况下是无法正确安装的可以用 rpm --force -i  强制安装即可

1.  ... is needed by ...
2.  ... is not installed ...

此包需要的一些软件你没有安装可以用 rpm --nodeps -i  来忽略此信息,也就是说 rpm -i --
force --nodeps  可以忽略所有依赖关系和文件问题,什么包都能安装上,但这种强制安装的软件包不能保证完全发挥功能。

 如何安装.src.rpm软件包

有些软件包是以.src.rpm结尾的,这类软件包是包含了源代码的rpm包,在安装时需要进行编译。这类软件包有两种安装方法:

方法一:

1.  rpm -i your-package.src.rpm
2.  cd /usr/src/redhat/SPECS
3.  rpmbuild -bp your-package.specs #一个和你的软件包同名的specs文件
4.  cd /usr/src/redhat/BUILD/your-package/ #一个和你的软件包同名的目录
5.  ./configure #这一步和编译普通的源码软件一样,可以加上参数
6.  make
7.  make install

方法二:

1.  rpm -i you-package.src.rpm
2.  cd /usr/src/redhat/SPECS

前两步和方法一相同
1.  rpmbuild -bb your-package.specs #一个和你的软件包同名的specs文件

这时在 /usr/src/redhat/RPM/i386/  (根据具体包的不同,也可能是i686,noarch等等)在这个
目录下,有一个新的rpm包,这个是编译好的二进制文件。
执行 rpm -i new-package.rpm  即可安装完成。

执行 rpm -i new-package.rpm  即可安装完成

如何卸载rpm软件包

使用命令 rpm -e  包名,包名可以包含版本号等信息,但是不可以有后缀.rpm,比如卸载软件包
proftpd-1.2.8-1,可以使用下列格式:

1.  rpm -e proftpd-1.2.8-1
2.  rpm -e proftpd-1.2.8
3.  rpm -e proftpd-
4.  rpm -e proftpd

不可以是下列格式:

1.  rpm -e proftpd-1.2.8-1.i386.rpm
2.  rpm -e proftpd-1.2.8-1.i386
3.  rpm -e proftpd-1.2
4.  rpm -e proftpd-1

有时会出现一些错误或者警告:

这说明这个软件被其他软件需要,不能随便卸载,可以用rpm -e —nodeps强制卸载

如何不安装但是获取rpm包中的文件

使用工具rpm2cpio和cpio

1.  rpm2cpio xxx.rpm | cpio -vi
2.  rpm2cpio xxx.rpm | cpio -idmv
3.  rpm2cpio xxx.rpm | cpio --extract --make-directories

参数i和extract相同,表示提取文件。v表示指示执行进程,d和make-directory相同,表示根据包
中文件原来的路径建立目录,m表示保持文件的更新时间。

如何查看与rpm包相关的文件和其他信息

下面所有的例子都假设使用软件包mysql-3.23.54a-11

1、我的系统中安装了那些rpm软件包。

1.  rpm -qa 讲列出所有安装过的包

如果要查找所有安装过的包含某个字符串sql的软件包

1.  rpm -qa | grep sql

2、如何获得某个软件包的文件全名。

1.  rpm -q mysql

可以获得系统中安装的mysql软件包全名,从中可以获得当前软件包的版本等信息。这个例子中可以得到信息mysql-3.23.54a-11

3、一个rpm包中的文件安装到那里去了?

1.  rpm -ql 包名

注意这里的是不包括.rpm后缀的软件包的名称,也就是说只能用mysql或者mysql-3.23.54a-11而不是mysql-3.23.54a-11.rpm。如果只是想知道可执行程序放到那里去了,也可以用which,比如:

1.  which mysql

4、一个rpm包中包含那些文件。

一个没有安装过的软件包,使用 rpm -qlp **** .rpm
一个已经安装过的软件包,还可以使用 rpm -ql **** .rpm

5、如何获取关于一个软件包的版本,用途等相关信息?

一个没有安装过的软件包,使用 rpm -qip **** .rpm
一个已经安装过的软件包,还可以使用 rpm -qi **** .rpm

6、某个程序是哪个软件包安装的,或者哪个软件包包含这个程序。

1.  rpm -qf `which 程序名` #返回软件包的全名
2.  rpm -qif `which 程序名` #返回软件包的有关信息
3.  rpm -qlf `which 程序名` #返回软件包的文件列表

注意,这里不是引号,而是 ,就是键盘左上角的那个键。也可以使用  rpm -qilf`,同时输出软件包信息和文件列表。

7、某个文件是哪个软件包安装的,或者哪个软件包包含这个文件。

注意,前一个问题中的方法,只适用与可执行的程序,而下面的方法,不仅可以用于可执行程序,也可以用于普通的任何文件。前提是知道这个文件名。首先获得这个程序的完整路径,可以用whereis或者which,然后使用 rpm -qf  例如:

1.  whereis ftptop
2.  ftptop: /usr/bin/ftptop /usr/share/man/man1/ftptop.1.gz
3.
4.  rpm -qf /usr/bin/ftptop
5.  proftpd-1.2.8-1
6.
7.  rpm -qf /usr/share/doc/proftpd-1.2.8/rfc/rfc0959.txt
8.  proftpd-1.2.8-1

更多实例

源码包 -> 编译 -> 二进制包(rpm 包 / 系统默认包)
rpm 命名规则: 软件(软件名, 软件版本) + 系统(os 版本, os 位数) rpm 校验: SM5DLUGT -
> size modified(类型/权限) md5 device L(文件路径) user group time(modified time)
yum: 解决 rpm 依赖的问题

1.  # rpm mysql57-community-release-el6-8.noarch.rpm # 一个 rpm 包的例子
3.  /var/lib/rpm/ # 包全名 -> 包名 的数据库
4.
5.  rpm -Uivh --dodeps xxx # upgrade install verbose hash
6.  rpm -qilpfa|grep xxx # query info list(rpm包安装后的文件位置) package(rpm 包)
file(文件属于哪个rpm文件) all
7.  rpm -e # erase

8.  rpm -V # verify
9.  rpm2cpio | cpio -idv
10.
11.  # rpm 默认安装位置
12.  /etc/ 配置文件
13.  /usr/bin/ 可执行文件
14.  /urs/lib/ 程序使用的函数库
15.  /usr/share/doc/ 使用手册
16.  /usr/share/man/ manual

33. seq - 以指定增量从首数开始打印数字到尾数

 seq命令 用于产生从某个数到另外一个数之间的所有整数。

语法

1.  seq [选项]... 尾数
2.  seq [选项]... 首数 尾数
3.  seq [选项]... 首数 增量 尾数

选项

1.  -f, --format=格式 使用printf 样式的浮点格式
2.  -s, --separator=字符串 使用指定字符串分隔数字(默认使用:\n)
3.  -w, --equal-width 在列前添加0 使得宽度相同

实例

 -f选项:指定格式

1.  #seq -f"%3g" 9 11
2.  9
3.  10
4.  11

%  后面指定数字的位数 默认是 %g  , %3g  那么数字位数不足部分是空格

1.  #sed -f"%03g" 9 11
2.  #seq -f"str%03g" 9 11
3.  str009
4.  str010
5.  str011

这样的话数字位数不足部分是0, %  前面制定字符串

-w选项:指定输出数字同宽

1.  seq -w 98 101
2.  098
3.  099
4.  100
5.  101

不能和 -f  一起用,输出是同宽的。

-s选项:指定分隔符(默认是回车)

1.  seq -s" " -f"str%03g" 9 11
2.  str009 str010 str011

要指定 /t  做为分隔符号:

1.  seq -s"`echo -e "/t"`" 9 11

指定 \n  作为分隔符号:

1.  seq -s"`echo -e "\n"`" 9 11
2.  19293949596979899910911

得到的是个错误结果,不过一般也没有这个必要,它默认的就是回车作为分隔符

34. xargs - 给其他命令传递参数的一个过滤器

xargs 命令 是给其他命令传递参数的一个过滤器,也是组合多个命令的一个工具。它擅长将标准输入数据转换成命令行参数,xargs 能够处理管道或者 stdin 并将其转换成特定命令的命令参数。
xargs 也可以将单行或多行文本输入转换为其他格式,例如多行变单行,单行变多行。xargs 的默认命令是 echo,空格是默认定界符。这意味着通过管道传递给 xargs 的输入将会包含换行和空白,不过通过 xargs 的处理,换行和空白将被空格取代。xargs 是构建单行命令的重要组件之一。

xargs 命令用法

 xargs 用作替换工具,读取输入数据重新格式化后输出。

定义一个测试文件,内有多行文本数据:

1.  cat test.txt
2.
3.  a b c d e f g
4.  h i j k l m n
5.  o p q
6.  r s t
7.  u v w x y z

多行输入单行输出:
1.  cat test.txt | xargs
2.
3.  a b c d e f g h i j k l m n o p q r s t u v w x y z

使用 -n 进行多行输出

-n 选项 多行输出:

1.  cat test.txt | xargs -n3
2.
3.  a b c
4.  d e f
5.  g h i
6.  j k l
7.  m n o
8.  p q r
9.  s t u
10.  v w x
11.  y z

使用 -d 分割输入

-d 选项 可以自定义一个定界符:

1.  echo "nameXnameXnameXname" | xargs -dX
2.
3.  name name name name

结合 -n 选项 使用:

1.  echo "nameXnameXnameXname" | xargs -dX -n2
2.
3.  name name
4.  name name

读取 stdin

读取 stdin,将格式化后的参数传递给命令
假设一个命令为 sk.sh 和一个保存参数的文件 arg.txt:

1.  #!/bin/bash
2.  #sk.sh 命令内容,打印出所有参数。
3.
4.  echo $*

 arg.txt 文件内容:

1.  cat arg.txt
2.
3.  aaa
4.  bbb
5.  ccc

结合 -I 选项

xargs 的一个 选项 -I ,使用 -I 指定一个替换字符串{},这个字符串在 xargs 扩展时会被替换
掉,当 -I 与 xargs 结合使用,每一个参数命令都会被执行一次:

1.  cat arg.txt | xargs -I {} ./sk.sh -p {} -l
2.
3.  -p aaa -l
4.  -p bbb -l
5.  -p ccc -l

复制所有图片文件到 /data/images 目录下:

1.  ls *.jpg | xargs -n1 -I cp {} /data/images

结合 find 命令使用

xargs 结合 find 使用

用 rm 删除太多的文件时候,可能得到一个错误信息: /bin/rm Argument list too long  . 用
xargs  去避免这个问题:

1.  find . -type f -name "*.log" -print0 | xargs -0 rm -f

xargs -0 将  \0  作为定界符。

统计一个源代码目录中所有 php 文件的行数:

1.  find . -type f -name "*.php" -print0 | xargs -0 wc -l

查找所有的 jpg 文件,并且压缩它们:

1.  find . -type f -name "*.jpg" -print | xargs tar -czvf images.tar.gz

打印出执行的命令

结合  -t  选项可以打印出  xargs  执行的命令

1.  ls | xargs -t -I{} echo {}

会输出当前目录下的文件列表和执行的 echo 命令

使用 -p 选项确认执行的命令

-p  选项会在执行每一个命令时弹出确认,当你需要非常准确的确认每一次操作时可以使用  -p
参数,比如,查找当前目录下  .log  文件,每一次删除都需要确认:

1.  find . -maxdepth 1 -name "*.log" | xargs -p -I{} rm {}

 执行多个命令

使用  -I  选项可以让  xargs  执行多个命令

1.  cat foo.txt
2.  one
3.  two
4.  three
5.
6.  cat foo.txt | xargs -I % sh -c 'echo %; mkdir %'
7.  one
8.  two
9.  three
10.
11.  ls
12.  one two three

其他应用

xargs 其他应用
假如你有一个文件包含了很多你希望下载的 URL,你能够使用 xargs 下载所有链接:

1.  cat url-list.txt | xargs wget -c

35. stat - 用于显示文件的状态信息

stat命令 用于显示文件的状态信息。stat命令的输出信息比ls命令的输出信息要更详细。

选项

1.  -L:支持符号连接;
2.  -f:显示文件系统状态而非文件状态;
3.  -t:以简洁方式输出信息;
4.  --help:显示指令的帮助信息;
5.  --version:显示指令的版本信息。

参数

文件:指定要显示信息的普通文件或者文件系统对应的设备文件名

实例

1.  [root@localhost ~]# ls -l myfile
2.  -rw-r--r-- 1 root root 0 2010-10-09 myfile
3.
4.  [root@localhost ~]# stat myfile
5.  file: “myfile”
6.  Size: 0 Blocks: 8 IO Block: 4096 一般空文件
7.  Device: fd00h/64768d Inode: 194805815 Links: 1
8.  Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root)
9.  Access: 2010-12-12 12:22:35.000000000 +0800
10.  Modify: 2010-10-09 20:44:21.000000000 +0800
11.  Change: 2010-10-09 20:44:21.000000000 +0800
12.
13.  [root@localhost ~]# stat -f myfile
14.  File: "myfile"
15.  id: 0 Namelen: 255 type: ext2/ext3
16.  Block size: 4096 Fundamental block size: 4096
17.  Blocks: Total: 241555461 free: 232910771 Available: 220442547
18.  Inodes: Total: 249364480 Free: 249139691
19.
20.  [root@localhost ~]# stat -t myfile
21.  myfile 0 8 81a4 0 0 fd00 194805815 1 0 0 1292127755 1286628261 1286628261 4096

36. dd - 复制文件并对原文件的内容进行转换和格式化处理

dd命令 用于复制文件并对原文件的内容进行转换和格式化处理。dd命令功能很强大的,对于一些比较底层的问题,使用dd命令往往可以得到出人意料的效果。用的比较多的还是用dd来备份裸设备。但是不推荐,如果需要备份oracle裸设备,可以使用rman备份,或使用第三方软件备份,使用dd的话,管理起来不太方便。
建议在有需要的时候使用dd 对物理磁盘操作,如果是文件系统的话还是使用tar backup cpio等其
他命令更加方便。另外,使用dd对磁盘操作时,最好使用块设备文件。

选项

1.  bs=<字节数>:将ibs(输入)与obs(输出)设成指定的字节数;
2.  cbs=<字节数>:转换时,每次只转换指定的字节数;
3.  conv=<关键字>:指定文件转换的方式;
4.  count=<区块数>:仅读取指定的区块数;
5.  ibs=<字节数>:每次读取的字节数;
6.  obs=<字节数>:每次输出的字节数;
7.  of=<文件>:输出到文件;
8.  seek=<区块数>:一开始输出时,跳过指定的区块数;
9.  skip=<区块数>:一开始读取时,跳过指定的区块数;
10.  --help:帮助;
11.  --version:显示版本信息。

实例

1.  [root@localhost text]# dd if=/dev/zero of=sun.txt bs=1M count=1
2.  1+0 records in
3.  1+0 records out
4.  1048576 bytes (1.0 MB) copied, 0.006107 seconds, 172 MB/s
5.
6.  [root@localhost text]# du -sh sun.txt
7.  1.1M sun.txt

该命令创建了一个1M大小的文件sun.txt,其中参数解释:
if 代表输入文件。如果不指定if,默认就会从stdin中读取输入。
of 代表输出文件。如果不指定of,默认就会将stdout作为默认输出。
bs 代表字节为单位的块大小。
count 代表被复制的块数。
/dev/zero 是一个字符设备,会不断返回0值字节(\0)。

块大小可以使用的计量单位表

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

生成随机字符串

我们甚至可以使用 /dev/urandom 设备配合 dd 命令 来获取随机字符串。

1.  [root@localhost ~]# dd if=/dev/urandom bs=1 count=15|base64 -w 0
2.  15+0 records in
3.  15+0 records out
4.  15 bytes (15 B) copied, 0.000111993 s, 134 kB/s
5.  wFRAnlkXeBXmWs1MyGEs

37. df - 显示磁盘的相关信息

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

选项

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

参数

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

大小格式

显示值以  --block-size  和  DF_BLOCK_SIZE  , BLOCK_SIZE  和  BLOCKSIZE  环境变量
中的第一个可用  SIZE  为单位。 否则,单位默认为  1024  个字节(如果设POSIXLY_CORRECT  ,则为 512  )。
SIZE是一个整数和可选单位(例如:10M是10 1024 1024)。 单位是K,M,G,T,P,E,Z,
Y(1024的幂)或KB,MB,…(1000的幂)。

实例

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

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

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

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

查看全部文件系统:

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

显示  public  目录中的可用空间量,如以下输出中所示:

1.  df public
2.  # Filesystem 1K-blocks Used Available Use% Mounted on
3.  # /dev/loop0 18761008 15246924 2554392 86% /d Avail

38. lscpu - 显示有关CPU架构的信息

lscpu命令 是显示有关CPU架构的信息。

选项

1.  -a, --all # 打印在线和离线CPU(默认为-e)
2.  -b, --online # 仅打印在线CPU(-p的默认值)
3.  -c, --offline # 打印离线CPU
4.  -e, --extended[=<list>] # 打印出一个扩展的可读格式
5.  -p, --parse[=<list>] # 打印出可解析的格式
6.  -s, --sysroot <dir> # 将指定的目录用作系统根目录
7.  -x, --hex # 打印十六进制掩码,而不是CPU列表
8.
9.  -h, --help # 显示此帮助并退出
10.  -V, --version # 输出版本信息并退出

参数

1.  可用列:
2.  CPU 逻辑CPU编号
3.  CORE 逻辑核心号码
4.  SOCKET 逻辑套接字号
5.  NODE 逻辑NUMA节点号
6.  BOOK 逻辑书号
7.  CACHE 显示了如何在CPU之间共享高速缓存
8.  POLARIZATION 虚拟硬件上的CPU调度模式
9.  ADDRESS CPU的物理地址
10.  CONFIGURED 显示管理程序是否分配了CPU
11.  ONLINE 显示Linux是否正在使用CPU

例子

1.  [root@localhost ~]# lscpu
2.  Architecture: x86_64
3.  CPU op-mode(s): 32-bit, 64-bit
4.  Byte Order: Little Endian
5.  CPU(s): 4
6.  On-line CPU(s) list: 0-3
7.  Thread(s) per core: 1
8.  Core(s) per socket: 4
9.  Socket(s): 1
10.  NUMA node(s): 1
11.  Vendor ID: GenuineIntel
12.  CPU family: 6
13.  Model: 30
14.  Model name: Intel(R) Xeon(R) CPU X3430 @ 2.40GHz
15.  Stepping: 5
16.  CPU MHz: 2394.055
17.  BogoMIPS: 4788.11
18.  Virtualization: VT-x
19.  L1d cache: 32K
20.  L1i cache: 32K
21.  L2 cache: 256K
22.  L3 cache: 8192K
23.  NUMA node0 CPU(s): 0-3

39. lsblk - 列出块设备信息

lsblk命令 用于列出所有可用块设备的信息,而且还能显示他们之间的依赖关系,但是它不会列出RAM盘的信息。块设备有硬盘,闪存盘,cd-ROM等等。lsblk命令包含在util-linux-ng包中,现在该包改名为util-linux。这个包带了几个其它工具,如dmesg。要安装lsblk,请在此处下载util-linux包。Fedora用户可以通过命令 sudo yum install util-linux-ng  来安装该包。

选项

1.  -a, --all # 显示所有设备。
2.  -b, --bytes # 以bytes方式显示设备大小。
3.  -d, --nodeps # 不显示 slaves 或 holders。
4.  -D, --discard # print discard capabilities。
5.  -e, --exclude <list> # 排除设备 (default: RAM disks)。
6.  -f, --fs # 显示文件系统信息。
7.  -h, --help # 显示帮助信息。
8.  -i, --ascii # use ascii characters only。
9.  -m, --perms # 显示权限信息。
10.  -l, --list # 使用列表格式显示。
11.  -n, --noheadings # 不显示标题。
12.  -o, --output <list> # 输出列。
13.  -P, --pairs # 使用key="value"格式显示。
14.  -r, --raw # 使用原始格式显示。
15.  -t, --topology # 显示拓扑结构信息。

实例

lsblk命令默认情况下将以树状列出所有块设备。打开终端,并输入以下命令:

1.  lsblk
2.
3.  NAME MAJ:MIN rm SIZE RO type mountpoint
4.  sda 8:0 0 232.9G 0 disk
5.  ├─sda1 8:1 0 46.6G 0 part /
6.  ├─sda2 8:2 0 1K 0 part
7.  ├─sda5 8:5 0 190M 0 part /boot
8.  ├─sda6 8:6 0 3.7G 0 part [SWAP]
9.  ├─sda7 8:7 0 93.1G 0 part /data
10.  └─sda8 8:8 0 89.2G 0 part /personal
11.  sr0 11:0 1 1024M 0 rom

7个栏目名称如下:
1. NAME :这是块设备名。
2. MAJ:MIN :本栏显示主要和次要设备号。
3. RM :本栏显示设备是否可移动设备。注意,在本例中设备sdb和sr0的RM值等于1,这说明他们是可移动设备。
4. SIZE :本栏列出设备的容量大小信息。例如298.1G表明该设备大小为298.1GB,而1K表明该设备大小为1KB。
5. RO :该项表明设备是否为只读。在本案例中,所有设备的RO值为0,表明他们不是只读的。
6. TYPE :本栏显示块设备是否是磁盘或磁盘上的一个分区。在本例中,sda和sdb是磁盘,而sr0是只读存储(rom)。
7. MOUNTPOINT :本栏指出设备挂载的挂载点。

默认选项不会列出所有空设备。要查看这些空设备,请使用以下命令:

1.  lsblk -a

lsblk命令也可以用于列出一个特定设备的拥有关系,同时也可以列出组和模式。可以通过以下命令来获取这些信息:

1.  lsblk -m

该命令也可以只获取指定设备的信息。这可以通过在提供给lsblk命令的选项后指定设备名来实现。例如,你可能对了解以字节显示你的磁盘驱动器大小比较感兴趣,那么你可以通过运行以下命令来实现:

1.  lsblk -b /dev/sda
2.
3.  等价于
4.
5.  lsblk --bytes /dev/sda

你也可以组合几个选项来获取指定的输出。例如,你也许想要以列表格式列出设备,而不是默认的树状格式。你可能也对移除不同栏目名称的标题感兴趣。可以将两个不同的选项组合,以获得期望的输出,命令如下:

1.  lsblk -nl

要获取SCSI设备的列表,你只能使用-S选项。该选项是大写字母S,不能和-s选项混淆,该选项是用来以颠倒的顺序打印依赖的。

1.  lsblk -S

lsblk列出SCSI设备,而-s是逆序选项(将设备和分区的组织关系逆转过来显示),其将给出如下输出。输入命令:

1.  lsblk -s

40. lsof - 显示Linux系统当前已打开的所有文件列表

显示Linux系统当前已打开的所有文件列表  lsof -p pid

lsof命令 用于查看你进程打开的文件,打开文件的进程,进程打开的端口(TCP、UDP)。找回/恢复删除的文件。是十分方便的系统监视工具,因为lsof命令需要访问核心内存和各种文件,所以需要root用户执行。
在linux环境下,任何事物都以文件的形式存在,通过文件不仅仅可以访问常规数据,还可以访问网络连接和硬件。所以如传输控制协议 (TCP) 和用户数据报协议 (UDP) 套接字等,系统在后台都为该应用程序分配了一个文件描述符,无论这个文件的本质如何,该文件描述符为应用程序与基础操作系统之间的交互提供了通用接口。因为应用程序打开文件的描述符列表提供了大量关于这个应用程序本身的信息,因此通过lsof工具能够查看这个列表对系统监测以及排错将是很有帮助的。

选项

1.  -a:列出打开文件存在的进程;
2.  -c<进程名>:列出指定进程所打开的文件;
3.  -g:列出GID号进程详情;
4.  -d<文件号>:列出占用该文件号的进程;
5.  +d<目录>:列出目录下被打开的文件;
6.  +D<目录>:递归列出目录下被打开的文件;
7.  -n<目录>:列出使用NFS的文件;
8.  -i<条件>:列出符合条件的进程。(4、6、协议、:端口、 @ip )
9.  -p<进程号>:列出指定进程号所打开的文件;
10.  -u:列出UID号进程详情;
11.  -h:显示帮助信息;
12.  -v:显示版本信息。

实例

1.  lsof
2.  command PID USER FD type DEVICE SIZE NODE NAME
3.  init 1 root cwd DIR 8,2 4096 2 /
4.  init 1 root rtd DIR 8,2 4096 2 /
5.  init 1 root txt REG 8,2 43496 6121706

lsof输出各列信息的意义如下:
COMMAND:进程的名称
PID:进程标识符
PPID:父进程标识符(需要指定-R参数)
USER:进程所有者
PGID:进程所属组
FD:文件描述符,应用程序通过文件描述符识别该文件。

文件描述符列表:

1. cwd:表示current work dirctory,即:应用程序的当前工作目录,这是该应用程序启动的
目录,除非它本身对这个目录进行更改
2. txt:该类型的文件是程序代码,如应用程序二进制文件本身或共享库,如上列表中显示的
/sbin/init 程序
3. lnn:library references (AIX);
4. er:FD information error (see NAME column);
5. jld:jail directory (FreeBSD);
6. ltx:shared library text (code and data);
7. mxx :hex memory-mapped type number xx.
8. m86:DOS Merge mapped file;
9. mem:memory-mapped file;
10. mmap:memory-mapped device;
11. pd:parent directory;
12. rtd:root directory;
13. tr:kernel trace file (OpenBSD);
14. v86 VP/ix mapped file;
15. 0:表示标准输出
16. 1:表示标准输入
17. 2:表示标准错误

一般在标准输出、标准错误、标准输入后还跟着文件状态模式:
1. u:表示该文件被打开并处于读取/写入模式。
2. r:表示该文件被打开并处于只读模式。
3. w:表示该文件被打开并处于。
4. 空格:表示该文件的状态模式为unknow,且没有锁定。
5. -:表示该文件的状态模式为unknow,且被锁定。

同时在文件状态模式后面,还跟着相关的锁:

1. N:for a Solaris NFS lock of unknown type;
2. r:for read lock on part of the file;
3. R:for a read lock on the entire file;
4. w:for a write lock on part of the file;(文件的部分写锁)
5. W:for a write lock on the entire file;(整个文件的写锁)
6. u:for a read and write lock of any length;
7. U:for a lock of unknown type;
8. x:for an SCO OpenServer Xenix lock on part of the file;
9. X:for an SCO OpenServer Xenix lock on the entire file;
10. space:if there is no lock.

文件类型:

1. DIR:表示目录。
2. CHR:表示字符类型。
3. BLK:块设备类型。
4. UNIX: UNIX 域套接字。
5. FIFO:先进先出 (FIFO) 队列。
6. IPv4:网际协议 (IP) 套接字。
7. DEVICE:指定磁盘的名称
8. SIZE:文件的大小
9. NODE:索引节点(文件在磁盘上的标识)
10. NAME:打开文件的确切名称

列出指定进程号所打开的文件:

1.  lsof -p $pid

获取端口对应的进程ID=>pid

1.  lsof -i:9981 -P -t -sTCP:LISTEN

列出打开文件的进程:

 1.  lsof $filename

41. su - 用于切换当前用户身份到其他用户身份

su命令 用于切换当前用户身份到其他用户身份,变更时须输入所要变更的用户帐号与密码。

选项

1.  -c<指令>或--command=<指令>:执行完指定的指令后,即恢复原来的身份;
2.  -f或——fast:适用于csh与tsch,使shell不用去读取启动文件;
3.  -l或——login:改变身份时,也同时变更工作目录,以及HOME,SHELL,USER,logname。此外,也会变更PATH变量;
4.  -m,-p或--preserve-environment:变更身份时,不要变更环境变量;
5.  -s<shell>或--shell=<shell>:指定要执行的shell;
6.  --help:显示帮助;
7.  --version;显示版本信息。

参数

用户:指定要切换身份的目标用户。

实例

变更帐号为root并在执行ls指令后退出变回原使用者:

1.  su -c ls root

变更帐号为root并传入 -f  选项给新执行的shell:

1.  su root -f

变更帐号为test并改变工作目录至test的家目录:

1.  su -test

42. sudo - 以其他身份来执行命令

sudo命令 用来以其他身份来执行命令,预设的身份为root。在 /etc/sudoers  中设置了可执行sudo指令的用户。若其未经授权的用户企图使用sudo,则会发出警告的邮件给管理员。用户使用sudo
时,必须先输入密码,之后有5分钟的有效期限,超过期限则必须重新输入密码。

选项

1.  -b:在后台执行指令;
2.  -h:显示帮助;
3.  -H:将HOME环境变量设为新身份的HOME环境变量;
4.  -k:结束密码的有效期限,也就是下次再执行sudo时便需要输入密码;。
5.  -l:列出目前用户可执行与无法执行的指令;
6.  -p:改变询问密码的提示符号;
7.  -s<shell>:执行指定的shell;
8.  -u<用户>:以指定的用户作为新的身份。若不加上此参数,则预设以root作为新的身份;
9.  -v:延长密码有效期限5分钟;
10.  -V :显示版本信息。

参数

指令:需要运行的指令和对应的参数

43. umask - 显示或设置创建文件的权限掩码。

显示或设置创建文件的权限掩码。

1.  umask [-p] [-S] [mode]

主要用途

显示当前的文件权限掩码。
通过八进制数的方式设置创建文件的权限掩码。
通过符号组合的方式设置创建文件的权限掩码。

参数

mode(可选):八进制数或符号组合。

选项

1.  -p:当没有参数时指定该选项,执行产生的输出格式可复用为输入;
2.  -S:以符号组合的方式输出创建文件的权限掩码,不使用该选项时以八进制数的形式输出。

返回值

返回状态为成功除非给出了非法选项或非法参数。

例子

以下的例子均假设文件权限掩码为0022。

1.  # 以八进制数的形式输出创建文件的权限掩码。
2.  umask -p
3.  # 执行结果:
4.  umask 0022
5.  # 以符号组合的方式输出创建文件的权限掩码。
6.  umask -S
7.  # 执行结果:
8.  u=rwx,g=rx,o=rx

u 符号代表当前用户。
g 符号代表和当前用户在同一个组的用户,以下简称组用户。
o 符号代表其他用户。
a 符号代表所有用户。
r 符号代表读权限以及八进制数 4 。
w 符号代表写权限以及八进制数 2 。
x 符号代表执行权限以及八进制数 1 。
+ 符号代表添加目标用户相应的权限。
- 符号代表删除目标用户相应的权限。
= 符号代表添加目标用户相应的权限,删除未提到的权限。

那么刚才以符号形式输出的结果 u=rwx,g=rx,o=rx  转化为八进制数等于 0755  ;用八进制数来设置同样的权限, umask  需要额外的执行减法 0777 - 0755  即 0022  ,而 chmod  不需要。

符号组合模式的添加、删除、赋值权限。

1.  # 添加权限:
2.  # 为组用户添加写权限。
3.  umask g+w
4.  # 删除权限:
5.  # 删除其他用户的写、执行权限
6.  umask o-wx
7.  # 赋值权限:
8.  # 赋值全部用户所有权限,等价于umask u=rwx,g=rwx,o=rwx
9.  umask a=rwx
10.  # 清除其他用户的读、写、执行权限。
11.  umask o=

创建文件夹、文件(假设当前目录不存在)

1.  # 创建文件
2.  touch test.sh
3.  # 查看权限,发现执行权限的设置不起作用。
4.  stat test.sh
5.  # 创建文件夹
6.  touch newdir
7.  # 查看权限,发现执行权限的设置可以起作用。
8.  stat newdir

44. useradd - 创建的新的系统用户

useradd命令 用于Linux中创建的新的系统用户。useradd可用来建立用户帐号。帐号建好之后,再
用passwd设定帐号的密码.而可用userdel删除帐号。使用useradd指令所建立的帐号,实际上是保存在 /etc/passwd  文本文件中。
在Slackware中,adduser指令是个script程序,利用交谈的方式取得输入的用户帐号资料,然后再
交由真正建立帐号的useradd命令建立新用户,如此可方便管理员建立用户帐号。在Red Hat Linux
中, adduser命令 则是useradd命令的符号连接,两者实际上是同一个指令。

语法

1.  useradd(选项)(参数)

选项

1.  -c<备注>:加上备注文字。备注文字会保存在passwd的备注栏位中;
2.  -d<登入目录>:指定用户登入时的启始目录;
3.  -D:变更预设值;
4.  -e<有效期限>:指定帐号的有效期限;
5.  -f<缓冲天数>:指定在密码过期后多少天即关闭该帐号;
6.  -g<群组>:指定用户所属的群组;
7.  -G<群组>:指定用户所属的附加群组;
8.  -m:自动建立用户的登入目录;
9.  -M:不要自动建立用户的登入目录;
10.  -n:取消建立以用户名称为名的群组;
11.  -r:建立系统帐号;
12.  -s<shell>:指定用户登入后所使用的shell;
13.  -u<uid>:指定用户id。

参数

用户名:要创建的用户名。

实例

新建用户加入组:

1.  useradd –g sales jack –G company,employees //-g:加入主要组、-G:加入次要组

建立一个新用户账户,并设置ID:

1.  useradd caojh -u 544

需要说明的是,设定ID值时尽量要大于500,以免冲突。因为Linux安装后会建立一些特殊用户,一般0到499之间的值留给bin、mail这样的系统账号。

45. userdel - 用于删除给定的用户以及与用户相关的文件

用于删除给定的用户以及与用户相关的文件

userdel命令 用于删除给定的用户,以及与用户相关的文件。若不加选项,则仅删除用户帐号,而不删除相关文件。

选项

1.  -f:强制删除用户,即使用户当前已登录;
2.  -r:删除用户的同时,删除与用户相关的所有文件。

参数

用户名:要删除的用户名。

实例

userdel命令很简单,比如我们现在有个用户linuxde,其家目录位于 /var  目录中,现在我们来删
除这个用户:

1.  userdel linuxde # 删除用户linuxde,但不删除其家目录及文件;
2.  userdel -r linuxde # 删除用户linuxde,其家目录及文件一并删除;

请不要轻易用 -r  选项;他会删除用户的同时删除用户所有的文件和目录,切记如果用户目录下有重要的文件,在删除前请备份。
其实也有最简单的办法,但这种办法有点不安全,也就是直接在 /etc/passwd  中删除您想要删除用
户的记录;但最好不要这样做, /etc/passwd  是极为重要的文件,可能您一不小心会操作失误。

46. usermod - 用于修改用户的基本信息

usermod命令 用于修改用户的基本信息。usermod 命令不允许你改变正在线上的使用者帐号名称。
当 usermod 命令用来改变user id,必须确认这名user没在电脑上执行任何程序。你需手动更改使
用者的 crontab 档。也需手动更改使用者的 at 工作档。采用 NIS server 须在server上更动
相关的NIS设定。

选项

1.  -c<备注>:修改用户帐号的备注文字;
2.  -d<登入目录>:修改用户登入时的目录,只是修改/etc/passwd中用户的家目录配置信息,不会自动创建新的家目录,通常和-m一起使用;
3.  -m<移动用户家目录>:移动用户家目录到新的位置,不能单独使用,一般与-d一起使用。
4.  -e<有效期限>:修改帐号的有效期限;
5.  -f<缓冲天数>:修改在密码过期后多少天即关闭该帐号;
6.  -g<群组>:修改用户所属的群组;
7.  -G<群组>;修改用户所属的附加群组;
8.  -l<帐号名称>:修改用户帐号名称;
9.  -L:锁定用户密码,使密码无效;
10.  -s<shell>:修改用户登入后所使用的shell;
11.  -u<uid>:修改用户ID;
12.  -U:解除密码锁定。

参数

登录名:指定要修改信息的用户登录名。

实例

将 newuser2 添加到组 staff 中:

1.  usermod -G staff newuser2

修改newuser的用户名为newuser1:

1.  usermod -l newuser1 newuser

锁定账号newuser1:

1.  usermod -L newuser1

解除对newuser1的锁定:

1.  usermod -U newuser1

增加用户到用户组中:

1.  apk add shadow # 安装 shadow 包, usermod 命令包含在 usermod 中
2.  usermod -aG group user # 添加用户到用户组中

-a  参数表示附加,只和  -G  参数一同使用,表示将用户增加到组中。

修改用户家目录:

1.  [root@node-1 ~]# useradd lutixiaya
2.  [root@node-1 ~]# ls /home
3.  lutixiaya
4.  [root@node-1 ~]# usermod -md /data/new_home lutixiaya
5.  [root@node-1 ~]# ls /home/
6.  [root@node-1 ~]# ls /data/
7.  new_home

47. dnf - 新一代的RPM软件包管理器

DNF 是新一代的rpm软件包管理器。他首先出现在 Fedora 18 这个发行版中。而最近,它取代了
yum,正式成为 Fedora 22 的包管理器。
DNF包管理器克服了YUM包管理器的一些瓶颈,提升了包括用户体验,内存占用,依赖分析,运行速度等多方面的内容。DNF使用 RPM, libsolv 和 hawkey 库进行包管理操作。尽管它没有预装在
CentOS 和 RHEL 7 中,但你可以在使用 YUM 的同时使用 DNF 。你可以在这里获得关于 DNF 的
更多知识:《 DNF 代替 YUM ,你所不知道的缘由》
DNF 的最新稳定发行版版本号是 1.0,发行日期是2015年5月11日。 这一版本的额 DNF 包管理器
(包括在他之前的所有版本) 都大部分采用 Python 编写,发行许可为GPL v2.

安装 DNF 包管理器

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

1、为了安装 DNF ,您必须先安装并启用 epel-release 依赖。
在系统中执行以下命令:

1.  yum install epel-release

1.  yum install epel-release -y

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

1.  yum install dnf

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

1.  dnf –version

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

1.  dnf repolist

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

1.  dnf repolist all

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

1.  dnf list

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

1.  dnf list installed

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

1.  dnf list available

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

1.  dnf search nano

 查找某一文件的提供者

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

1.  dnf provides /bin/bash

查看软件包详情

1.  dnf info nano

安装软件包

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

1.  dnf install nano

升级软件包

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

1.  dnf update systemd

检查系统软件包的更新

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

1.  dnf check-update

升级所有系统软件包

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

1.  dnf update 或 dnf upgrade

删除软件包

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

1.  dnf remove nano 或 dnf erase nano

删除无用孤立的软件包

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

1.  dnf autoremove

删除缓存的无用软件包

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

1.  dnf clean all

查看所有的软件包组

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

1.  dnf grouplist

安装一个软件包组

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

1.  dnf groupinstall ‘Educational Software’

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

1.  dnf groupupdate ‘Educational Software’

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

1.  dnf groupremove ‘Educational Software’

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

1.  dnf –enablerepo=epel install phpmyadmin

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

1.  dnf reinstall nano

48. dpkg - Debian Linux系统上安装、创建和管理软件包

dpkg命令 是Debian Linux系统用来安装、创建和管理软件包的实用工具。

选项

1.  -i:安装软件包;
2.  -r:删除软件包;
3.  -P:删除软件包的同时删除其配置文件;
4.  -L:显示于软件包关联的文件;
5.  -l:显示已安装软件包列表;
6.  --unpack:解开软件包;
7.  -c:显示软件包内文件列表;
8.  --confiugre:配置软件包。

参数

Deb软件包:指定要操作的.deb软件包

实例

1.  dpkg -i package.deb # 安装包
2.  dpkg -r package # 删除包
3.  dpkg -P package # 删除包(包括配置文件)
4.  dpkg -L package # 列出与该包关联的文件
5.  dpkg -l package # 显示该包的版本
6.  dpkg --unpack package.deb # 解开deb包的内容
7.  dpkg -S keyword # 搜索所属的包内容
8.  dpkg -l # 列出当前已安装的包
9.  dpkg -c package.deb # 列出deb包的内容
10.  dpkg --configure package # 配置包

49. dpkg-query - Debian Linux中软件包的查询工具

dpkg-query命令 是Debian Linux中软件包的查询工具,它从dpkg软件包数据库中查询并辨识软件
包的信息。

选项

1.  -l:列出符合匹配模式的软件包;
2.  -s:查询软件包的状态信息;
3.  -L:显示软件包所安装的文件列表;
4.  -S:从安装的软件包中查询文件;
5.  -w:显示软件包信息;
6.  -c:显示软件包的控制文件路径;
7.  -p:显示软件包的细节。

参数

软件包名称:指定需要查询的软件包。

实例

查找文件file1在哪个包里安装:

1.  dpkg-query -S file1

 列出ubuntu下所安装软件列表:

1.  dpkg-query -W --showformat='${Package} ${Version}\n' > filename

查看软件包详细信息:

1.  dpkg-query -s capistrano

查看软件包安装时安装到系统的文件列表:

1.  dpkg-query -L capistrano

列出所有安装的包:

1.  dpkg-query -l

查看软件包的确切状态(是否安装)以及版本号:

1.  dpkg-query -W -f='${Status} ${Version}\n' apache-perl

 

 

50. firewall-cmd - Linux上新用的防火墙软件,跟iptables差不多的工具

firewall-cmd 是 firewalld的字符界面管理工具,firewalld是centos7的一大特性,最大的好处有两个:支持动态更新,不用重启服务;第二个就是加入了防火墙的“zone”概念。

firewalld跟iptables比起来至少有两大好处:

1. firewalld可以动态修改单条规则,而不需要像iptables那样,在修改了规则后必须得全部刷
新才可以生效。
2. firewalld在使用上要比iptables人性化很多,即使不明白“五张表五条链”而且对TCP/IP协议也不理解也可以实现大部分功能。

firewalld自身并不具备防火墙的功能,而是和iptables一样需要通过内核的netfilter来实现,也就是说firewalld和 iptables一样,他们的作用都是用于维护规则,而真正使用规则干活的是内核的netfilter,只不过firewalld和iptables的结 构以及使用方法不一样罢了

选项

通用选项

1.  -h, --help # 显示帮助信息;
2.  -V, --version # 显示版本信息. (这个选项不能与其他选项组合);
3.  -q, --quiet # 不打印状态消息;

状态选项

1.  --state # 显示firewalld的状态;
2.  --reload # 不中断服务的重新加载;
3.  --complete-reload # 中断所有连接的重新加载;
4.  --runtime-to-permanent # 将当前防火墙的规则永久保存;
5.  --check-config # 检查配置正确性;

日志选项

1.  --get-log-denied # 获取记录被拒绝的日志;
2.  --set-log-denied=<value> # 设置记录被拒绝的日志,只能为'all','unicast','broadcast','multicast','off' 其中的一个;

实例

1.  # 安装firewalld
2.  yum install firewalld firewall-config
3.
4.  systemctl start firewalld # 启动
5.  systemctl stop firewalld # 停止
6.  systemctl enable firewalld # 启用自动启动
7.  systemctl disable firewalld # 禁用自动启动
8.  systemctl status firewalld # 或者 firewall-cmd --state 查看状态
9.
10.  # 关闭服务的方法
11.  # 你也可以关闭目前还不熟悉的FirewallD防火墙,而使用iptables,命令如下:
12.
13.  systemctl stop firewalld
14.  systemctl disable firewalld
15.  yum install iptables-services
16.  systemctl start iptables
17.  systemctl enable iptables

配置firewalld

1.  firewall-cmd --version # 查看版本
2.  firewall-cmd --help # 查看帮助
3.
4.  # 查看设置:
5.  firewall-cmd --state # 显示状态
6.  firewall-cmd --get-active-zones # 查看区域信息
7.  firewall-cmd --get-zone-of-interface=eth0 # 查看指定接口所属区域
8.  firewall-cmd --panic-on # 拒绝所有包
9.  firewall-cmd --panic-off # 取消拒绝状态
10.  firewall-cmd --query-panic # 查看是否拒绝
11.
12.  firewall-cmd --reload # 更新防火墙规则
13.  firewall-cmd --complete-reload

14.  # 两者的区别就是第一个无需断开连接,就是firewalld特性之一动态添加规则,第二个需要断开连接,类似重启服务
15.
16.
17.  # 将接口添加到区域,默认接口都在public
18.  firewall-cmd --zone=public --add-interface=eth0
19.  # 永久生效再加上 --permanent 然后reload防火墙
20.
21.  # 设置默认接口区域,立即生效无需重启
22.  firewall-cmd --set-default-zone=public
23.
24.  # 查看所有打开的端口:
25.  firewall-cmd --zone=dmz --list-ports
26.
27.  # 加入一个端口到区域:
28.  firewall-cmd --zone=dmz --add-port=8080/tcp
29.  # 若要永久生效方法同上
30.
31.
# 打开一个服务,类似于将端口可视化,服务需要在配置文件中添加,/etc/firewalld 目录下有
services文件夹,这个不详细说了,详情参考文档
32.  firewall-cmd --zone=work --add-service=smtp
33.
34.  # 移除服务
35.  firewall-cmd --zone=work --remove-service=smtp
36.
37.  # 显示支持的区域列表
38.  firewall-cmd --get-zones
39.
40.  # 设置为家庭区域
41.  firewall-cmd --set-default-zone=home
42.
43.  # 查看当前区域
44.  firewall-cmd --get-active-zones
45.
46.  # 设置当前区域的接口
47.  firewall-cmd --get-zone-of-interface=enp03s
48.
49.  # 显示所有公共区域(public)
50.  firewall-cmd --zone=public --list-all
51.
52.  # 临时修改网络接口(enp0s3)为内部区域(internal)
53.  firewall-cmd --zone=internal --change-interface=enp03s
54.
55.  # 永久修改网络接口enp03s为内部区域(internal)
56.  firewall-cmd --permanent --zone=internal --change-interface=enp03s

服务管理

1.  # 显示服务列表
2.  Amanda, FTP, Samba和TFTP等最重要的服务已经被FirewallD提供相应的服务,可以使用如下命令查看:
3.
4.  firewall-cmd --get-services
5.
6.  # 允许SSH服务通过
7.  firewall-cmd --new-service=ssh
8.
9.  # 禁止SSH服务通过
10.  firewall-cmd --delete-service=ssh
11.
12.  # 打开TCP的8080端口
13.  firewall-cmd --enable ports=8080/tcp
14.
15.  # 临时允许Samba服务通过600秒
16.  firewall-cmd --enable service=samba --timeout=600
17.
18.  # 显示当前服务
19.  firewall-cmd --list-services
20.
21.  # 添加HTTP服务到内部区域(internal)
22.  firewall-cmd --permanent --zone=internal --add-service=http
23.  firewall-cmd --reload # 在不改变状态的条件下重新加载防火墙

 端口管理

1.  # 打开443/TCP端口
2.  firewall-cmd --add-port=443/tcp
3.
4.  # 永久打开3690/TCP端口
5.  firewall-cmd --permanent --add-port=3690/tcp
6.
7.  # 永久打开端口好像需要reload一下,临时打开好像不用,如果用了reload临时打开的端口就失效了
8.  # 其它服务也可能是这样的,这个没有测试
9.  firewall-cmd --reload
10.
11.  # 查看防火墙,添加的端口也可以看到
12.  firewall-cmd --list-all

直接模式

1.  # FirewallD包括一种直接模式,使用它可以完成一些工作,例如打开TCP协议的9999端口
2.
3.  firewall-cmd --direct -add-rule ipv4 filter INPUT 0 -p tcp --dport 9000 -j ACCEPT
4.  firewall-cmd --reload

自定义服务管理

1.  (末尾带有 [P only] 的话表示该选项除了与(--permanent)之外,不能与其他选项一同使用!)
2.  --new-service=<服务名> 新建一个自定义服务 [P only]
3.  --new-service-from-file=<文件名> [--name=<服务名>]
4.  从文件中读取配置用以新建一个自定义服务 [P only]
5.  --delete-service=<服务名>
6.  删除一个已存在的服务 [P only]
7.  --load-service-defaults=<服务名>
8.  Load icmptype default settings [P only]
9.  --info-service=<服务名>
10.  显示该服务的相关信息
11.  --path-service=<服务名>
12.  显示该服务的文件的相关路径 [P only]
13.  --service=<服务名> --set-description=<描述>
14.  给该服务设置描述信息 [P only]
15.  --service=<服务名> --get-description
16.  显示该服务的描述信息 [P only]
17.  --service=<服务名> --set-short=<描述>
18.  给该服务设置一个简短的描述 [P only]
19.  --service=<服务名> --get-short
20.  显示该服务的简短描述 [P only]
21.
22.  --service=<服务名> --add-port=<端口号>[-<端口号>]/<protocol>
23.  给该服务添加一个新的端口(端口段) [P only]
24.
25.  --service=<服务名> --remove-port=<端口号>[-<端口号>]/<protocol>
26.  从该服务上移除一个端口(端口段) [P only]

控制端口 / 服务

可以通过两种方式控制端口的开放,一种是指定端口号另一种是指定服务名。虽然开放 http 服务就是开放了 80 端口,但是还是不能通过端口号来关闭,也就是说通过指定服务名开放的就要通过指定服务名关闭;通过指定端口号开放的就要通过指定端口号关闭。还有一个要注意的就是指定端口的时候一定要指定是什么协议,tcp 还是 udp。知道这个之后以后就不用每次先关防火墙了,可以让防火墙真正的生效。

1.  firewall-cmd --add-service=mysql # 开放mysql端口
2.  firewall-cmd --remove-service=http # 阻止http端口
3.  firewall-cmd --list-services # 查看开放的服务
4.  firewall-cmd --add-port=3306/tcp # 开放通过tcp访问3306
5.  firewall-cmd --remove-port=80tcp # 阻止通过tcp访问3306
6.  firewall-cmd --add-port=233/udp # 开放通过udp访问233
7.  firewall-cmd --list-ports # 查看开放的端口

伪装 IP

1.  firewall-cmd --query-masquerade # 检查是否允许伪装IP
2.  firewall-cmd --add-masquerade # 允许防火墙伪装IP
3.  firewall-cmd --remove-masquerade# 禁止防火墙伪装IP

端口转发

端口转发可以将指定地址访问指定的端口时,将流量转发至指定地址的指定端口。转发的目的如果不指定 ip 的话就默认为本机,如果指定了 ip 却没指定端口,则默认使用来源端口。 如果配置好端口转发之后不能用,可以检查下面两个问题:

1. 比如我将 80 端口转发至 8080 端口,首先检查本地的 80 端口和目标的 8080 端口是否开
放监听了
2. 其次检查是否允许伪装 IP,没允许的话要开启伪装 IP

1.  firewall-cmd --add-forward-port=port=80:proto=tcp:toport=8080 # 将80端口的流量转发至8080
2.  firewall-cmd --add-forward-port=port=80:proto=tcp:toaddr=192.168.0.1 # 将80端口的流量转发至192.168.0.1 

3.  firewall-cmd --add-forward-port=port=80:proto=tcp:toaddr=192.168.0.1:toport=8080 # 将80端口的流量转发至192.168.0.1的8080端口

1. 当我们想把某个端口隐藏起来的时候,就可以在防火墙上阻止那个端口访问,然后再开一个不规
则的端口,之后配置防火墙的端口转发,将流量转发过去。
2. 端口转发还可以做流量分发,一个防火墙拖着好多台运行着不同服务的机器,然后用防火墙将不
同端口的流量转发至不同机器。 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值