Linux命令: -------------------------------------------------------------------------- 文章收入自: https://dongshao.blog.csdn.net/article/details/86822769?spm=1001.2101.3001.6661.1&utm_medium=distribute.pc_relevant_t0.none-task-blog-2%7Edefault%7ECTRLIST%7ERate-1-86822769-blog-120997798.pc_relevant_layerdownloadsortv1&depth_1-utm_source=distribute.pc_relevant_t0.none-task-blog-2%7Edefault%7ECTRLIST%7ERate-1-86822769-blog-120997798.pc_relevant_layerdownloadsortv1&utm_relevant_index=1 https://blog.csdn.net/carefree2005/article/details/120997798?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522166479242916782390563433%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=166479242916782390563433&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~top_click~default-1-120997798-null-null.142^v51^new_blog_pos_by_title,201^v3^control_1&utm_term=mkfs&spm=1018.2226.3001.4187 https://blog.csdn.net/k346k346/category_9267835.html(已收入至第142篇) https://dablelv.blog.csdn.net/?type=blog https://blog.csdn.net/General_zy/article/details/124506399 https://blog.csdn.net/whatday/article/details/78467023?ops_request_misc=&request_id=&biz_id=102&utm_term=dpkg&utm_medium=distribute.pc_search_result.none-task-blog-2~all~sobaiduweb~default-6-78467023.142^v59^js_top,201^v3^control_2&spm=1018.2226.3001.4187 -------------------------------------------------------------------------- ●man 命令: 1.命令简介 man(manual) 命令用于查看命令帮助、配置文件帮助和编程帮助等信息。 Linux 提供了丰富的命令以及帮助手册,当需要了解某个命令的作用及用法时,可以使用 man 查看一下其帮助手册,同时也可以使用 man man 查看 man 命令的使用方法。当需要了解与编程相关的系统调用以及库函数的用法时,也可以通过 man 查看接口的帮助手册。此外,系统相关的配置文件的介绍也可以通过 man 来查看。 man 可以查询不同类型的帮助手册,当目标存在多个不同类型的帮助手册时,我们可以指定要查找的手册类型,也可以不指定,此时 man 会搜索所有类型的帮助手册,但是只会按照预定义的顺序展示第一个。预定义的顺序可以使用环境变量 $MANSECT 或配置文件 /usr/local/etc/man_db.conf 中的 SECTION 指令指定,默认为: 1 8 3 2 5 4 9 6 7 帮助手册分为多种类型,即不同的 section,主要有: 1 可执行程序或 Shell 命令 1p 可执行程序或 Shell 命令(POSIX 版) 2 系统调用(内核提供的函数) 3 库调用(程序库中的函数) 4 特殊文件(通常在/dev中找到) 5 文件格式和约定,如 /etc/passwd 6 游戏 7 杂项(包括宏包和约定),例如 man(7)、groff(7) 8 系统管理命令(通常只针对 root 用户) 9 内核相关文件[非标准] 帮助手册约定内容包括: NAME 名称 SYNOPSIS 简介 CONFIGURATION 配置 DESCRIPTION 描述 OPTIONS 选项 EXIT STATUS 退出码 RETURN VALUE 返回值 ERRORS 错误 ENVIRONMENT 环境变量 FILES 相关文件 VERSIONS 版本 CONFORMING TO 遵循的规则 NOTES 注意事项 BUGS 缺陷 EXAMPLE 示例 AUTHORS 作者 COPYRIGHT 版权 SEE ALSO 拓展阅读 HISTORY 维护历史 在表现形式上,手册遵循如下规则: 粗体内容:重点关键词 斜体内容:待替换内容。因为终端渲染问题,一般使用下划线或彩色文本替代斜体 [-abc]:中括号内的选项或内容是可选的 -a|-b:被 | 分隔的选项是多选一,不能一起使用 ...:三个点号表示重复 2.命令格式 man [OPTION]... [[SECTION] PAGE]... man 可以不跟任何选项与参数,会输出如下提示信息: What manual page do you want? 3.选项说明 阅读下面的选项说明,需要注意以下几点: (1)没有参数的选项可以重复出现,有参数的选项如果重复出现,后面选项的参数将会覆盖前面的参数; (2)长选项的必填参数对于短选项也是必须的。 一般选项: -C, --config-file=FILE 使用指定的用户配置文件而不是默认的 ~/.manpath -d, --debug 打印 debug 信息 -D, --default 此选项通常作为第一个选项,将 man 的行为重置为默认行为。它的用途是重置那些可能已经在 $MANOPT 中设置的选项。在 -D 后面的选项会正常生效 --warnings[=WARNINGS] 启动来自 groff 的告警。groff 是 GNU 版 troff,是文字排版工具 主要操作模式: -f, --whatis 等同于 whatis 命令,显示手册页中的简短说明(如果可用),详见 whatis(1) -k, --apropos 等同于 apropos 命令,按照关键字搜索手册页中的简短描述并显示任何匹配,详见 apropos(1) -K, --global-apropos 在所有手册页中搜索文本。这是蛮力搜索,可能需要一些时间,如果可以,应该指定一个 section 来减少需要搜索的手册页数量 -l, --local-file 激活本地模式。格式化和显示本地手册文件,而不是通过搜索系统的手册集 -w, --where, --path, --location 不显示手册页内容,输出手册的位置 -W, --where-cat, --location-cat 不显示手册页内容,输出 cat 文件的位置 -c, --catman 此选项不用于一般用途,只能由管理员命令 catman 使用 -R encoding, --recode=encoding 以指定编码输出手册内容 寻找手册页: -L, --locale=LOCALE man 通常通过调用 C 函数setlocale(3)来确定当前的语言环境,该函数询问各种环境变量,可能包括 $LC_MESSAGES 和 $LANG。该选项可以临时改变 man 的语言环境 -m, --systems=SYSTEM[,...] 访问其他系统的手册页集,可指定多个不同的系统 -M, --manpath=path 指定手册页的路径。该选项将会覆盖环境变量 $MANPATH 且使 man 忽略选项 -m 选项 -S, -s, --sections=LIST 指定 man 搜索的手册页类型列表,使用冒号或逗号分隔,man 将按照给定的顺序进行搜索。该选项将覆盖环境变量 $MANSECT -e , --extension=SUB-EXTENSION 将搜索限制在扩展类型为 SUB-EXTENSION 的手册页之内 -i, --ignore-case 搜索手册页时忽略大小写(默认) -I, --match-case 搜索手册页时大小写敏感 --regex 以正则表达式搜索手册页并显示所有匹配的手册页 --wildcard 以通配符搜索手册页并显示所有匹配的手册页 --names-only 当使用选项 --regex 或 --wildcard 时,只搜索手册页的 NAME 部分,不搜索 DESCRIPTION 部分 -a, --all 显示所有匹配的手册页而不是仅显示第一个匹配的手册页 -u, --update 该选项导致 man 对其数据库缓存执行 inode 级别的一致性检查,以确保它们是文件系统的准确表示。只有安装了设置了 setuid 位的 man 才会产生有用的效果 --no-subpages 出线成对的手册页名时,第二个手册页名作为单独的手册页名,而是不第一个手册页的子手册页。比如有些命令存在子命令,例如 git 控制格式化输出: -P, --pager=PAGER 指定浏览手册页的工具,man 默认使用 less -s。该选项覆盖 $MANPAGER 环境变量,后者又覆盖 $PAGER 环境变量。它不与 -f 或 -k 连用 -r, --prompt=PROMPT 如果使用 less 作为手册页的浏览工具,man 将尝试设置其提示和一些合理的选项。默认提示为 Manual page name(sec) line x -7, --ascii 使用 ASCII 字符浏览手册页 -E, --encoding=ENCODING 使用指定编码输出手册也内容 --no-hyphenation, --nh 换行处不使用连字符 --no-justification, --nj 不调整字距离以铺满整行 -p, --preprocessor=STRING 指定在 nroff 或 troff/groff 之前运行的预处理程序的顺序 -t, --troff 使用 groff -mandoc 将手册页格式化为标准输出。给定 -H、-T 或 -Z 不需要此选项 -T, --troff-device[=DEVICE] 此选项用于更改 groff(或 troff)的输出设备,使其适合于默认设备之外的设备 -H, --html[=BROWSER] 此选项将导致 groff 生成 HTML 输出,并将在 web 浏览器中显示该输出 -X, --gxditview[=DPI] 使用 gxditview 程序在图形窗口中显示 groff 的输出。DPI(点/英寸)可能是 75、75-12、100 或 100-12,默认为 75 -Z, --ditroff groff 将运行 troff,然后使用适当的后处理器生成适合所选设备的输出。如果 groff 表示 groff -mandoc,那么 该选项将抑制 groff 使用后处理器 获取帮助: -?, --help 输出帮助并推出 --usage 打印一个简短的用法并退出 -V, --version 输出版本并退出 实际上,日常使用 man 时很少会用到 man 的选项,最常用的是指定手册类型和手册名: man SECTION PAGE 4.交互式命令 由于 man 默认使用 less 作为手册的浏览工具,这里给出 less 常用的浏览导航交互式命令。如果忘记命令,可以键入 h 或 H 查看命令的帮助信息。 ENTER 向前滚动一行 y 向后滚动一行 d 向前滚动半屏 u 向后滚动半屏 f 向前滚动一屏 b 向后滚动一屏 g 跳转到文件首行 G 跳转到文件末行 /PATTERN 向前搜索指定内容 n 跳转到下一个匹配项 N 跳转到前一个匹配项 h 显示帮助信息 q 退出 5.常用示例 (1)查看用户命令 man 的帮助手册。 man man # 或 man 1 man 如果想查看 POSIX 版本的命令帮助手册,指定 SECTION 为 1p 即可。 man 1p man (2)查看系统调用 read 的帮助手册。 man 2 read (3)查看库函数 printf 的帮助手册。 man 3 printf (4)查看特殊的设备文件 tty 的帮助手册。 man 4 tty (5)查看用户信息文件 /etc/passwd 格式说明。 man 5 passwd (6)查看用于格式化手册的宏。 man 7 man (7)查看系统管理命令 mount。 man 8 mount (8)查看手册的地址而不是手册内容,以 man 命令为例。 man -w man /usr/share/man/man1/man.1.gz ●xargs 命令: 1.命令简介 xargs 可以将 stdin 中以空格或换行符进行分隔的数据,形成以空格分隔的参数(arguments),传递给其他命令。因为以空格作为分隔符,所以有一些文件名或者其他意义的字符串内含有空格的时候,xargs 可能会误判。简单来说,xargs 的作用是给其他命令传递参数,是构建单行命令的重要组件之一。 之所以要用到 xargs,是因为很多命令不支持使用管道 | 来传递参数,例如: find /sbin -perm +700 | ls -l # 这个命令是错误,因为标准输入不能作为ls的参数 find /sbin -perm +700 | xargs ls -l # 这样才是正确的 2.命令格式 xargs [OPTIONS] [COMMAND] 3.选项说明 注意,长选项的强制性参数对于短选项也是强制的。 -0, --null 如果输入的 stdin 含有特殊字符,例如反引号 `、反斜杠 \、空格等字符时,xargs 将它还原成一般字符。为默认选项 -a, --arg-file=FILE 从指定的文件 FILE 中读取输入内容而不是从标准输入 -d, --delimiter=DEL 指定 xargs 处理输入内容时的分隔符。xargs 处理输入内容默认是按空格和换行符作为分隔符,输出 arguments 时按空格分隔 -E EOF_STR EOF_STR 是 end of file string,表示输入的结束 -e, --eof[=EOF_STR] 作用等同于 -E 选项,与 -E 选项不同时,该选项不符合 POSIX 标准且 EOF_STR 不是强制的。如果没有 EOF_STR 则表示输入没有结束符 -I REPLACE_STR 将 xargs 输出的每一项参数单独赋值给后面的命令,参数需要用指定的替代字符串 REPLACE_STR 代替。REPLACE_STR 可以使用 {} $ @ 等符号,其主要作用是当 xargs command 后有多个参数时,调整参数位置。例如备份以 txt 为后缀的文件:find . -name "*.txt" | xargs -I {} cp {} /tmp/{}.bak -i, --replace[=REPLACE_STR] 作用同 -I 选项,参数 REPLACE_STR 是可选的,缺省为 {}。建议使用 -I 选项,因为其符合 POSIX -L MAX_LINES 限定最大输入行数。隐含了 -x 选项 -l, --max-lines[=MAX_LINES] 作用同 -L 选项,参数 MAX_LINES 是可选的,缺省为 1。建议使用 -L 选项,因为其符合 POSIX 标准 -n, --max-args=MAX_ARGS 表示命令在执行的时候一次使用参数的最大个数 -o, --open-tty 在执行命令之前,在子进程中重新打开stdin作为/dev/TTY。如果您希望xargs运行交互式应用程序,这是非常有用的 -P, --max-procs=MAX_PROCS 每次运行最大进程;缺省值为 1。如果 MAX_PROCS 为 0,xargs 将一次运行尽可能多的进程。一般和 -n 或 -L 选项一起使用 -p, --interactive 当每次执行一个 argument 的时候询问一次用户 --process-slot-var=NAME 将指定的环境变量设置为每个正在运行的子进程中的唯一值。一旦子进程退出,将重用该值。例如,这可以用于初始负荷分配方案 -r, --no-run-if-empty 当 xargs 的输入为空的时候则停止 xargs,不用再去执行后面的命令了。为默认选项 -s, --max-chars=MAX_CHARS 命令行的最大字符数,指的是 xargs 后面那个命令的最大命令行字符数,包括命令、空格和换行符。每个参数单独传入 xargs 后面的命令 --show-limits 显示操作系统对命令行长度的限制 -t, --verbose 先打印命令到标准错误输出,然后再执行 -x, --exit 配合 -s 使用,当命令行字符数大于 -s 指定的数值时,退出 xargs --help 显示帮助信息并退出 --version 显示版本信息并退出 4.常用示例 (1)将 Shell 的特殊字符反引号还原为一般字符。 echo '`0123`4 56789' | xargs -t echo echo `0123`4 56789 `0123`4 56789 如果直接进行如下操作,会报无法找到命令 01234 的错误,因为反引号在 Shell 中会将 01234 作为一个命令来执行,但是 01234 不是一个命令。-t 表示先打印命令,然后再执行。 echo `01234` 56789 -bash: 01234: command not found 56789 (2)设置 xargs 读入参数时的结束标识,以逗号结束。这里要注意结束标志必须要是单独的字段,即以空格或者换行符分隔的字段。 echo 01234 , 56789 | xargs -E "," 01234 (3)使用 rm、mv 等命令同时操作多个文件时,有时会报 “argument list too long” 参数列表过长的错误,此时可以使用 xargs 来解决。xargs 将标准输入的字符串分隔后,作为参数传递给后面的命令。例如,给当前目录的所有文件添加后缀名。 ls | xargs -t -i mv {} {}.bak # 选择符合条件的文件 ls | grep -E "201701|201702|201703" | xargs -I {} mv {} {}.bak (4)设置命令行的最大字符数。参数默认一个一个单独传入命令中执行。 echo "01234 56789" | xargs -t -s 11 echo 01234 01234 echo 56789 56789 (5)设置标准输入中每次多少行作为命令的参数,默认是将标准输入中所有行的归并到一行一次性传给命令执行。 echo -e "01234\n56789\n01234" | xargs -t -L 2 echo echo 01234 56789 01234 56789 echo 01234 01234 (6)将文件内容以空格分隔合并为一行输出。 # 列出文件内容 cat test.txt a b c d e f g h i j k l m n o # 多行输入合并为一行输出 cat test.txt | xargs a b c d e f g h i j k l m n o (7)与 ps、grep、awk 和 kill 结合,强制终止指定进程。 ps -ef | grep spp | awk '{printf "%s ",$2}' | xargs kill -9 ps -ef|grep spp用于查找包含 spp 的进程,awk '{printf "%s ",$2,FNR}将目标进程 ID 打印输出,xargs kill -9则将目标进程 ID 作为参数传递给kill -9用于杀死进程。 ●od 命令: 1.功能简介 od(Octal Dump)命令用于将指定文件内容以八进制、十进制、十六进制、浮点格式或 ASCII 编码字符方式显示,通常用于显示或查看文件中不能直接显示在终端的字符。od 命令系统默认的显示方式是八进制。 常见的文件为文本文件和二进制文件。od 命令主要用来查看保存在二进制文件中的值,按照指定格式解释文件中的数据并输出,不管是 IEEE754 格式的浮点数还是 ASCII 码,od 命令都能按照需求输出它们的值。 大家也可以了解一下 hexdump 命令,以十六进制输出,但感觉 hexdump 命令没有 od 命令强大。 2.命令格式 od [OPTION]... [FILE]... 3.选项说明 -A RADIX --address-radix=RADIX 选择以何种基数表示地址偏移 -j BYTES --skip-bytes=BYTES 跳过指定数目的字节 -N BYTES --read-bytes=BYTES 输出指定字节数 -S [BYTES] --strings[=BYTES] 输出长度不小于指定字节数的字符串,BYTES 缺省为 3 -v --output-duplicates 输出时不省略重复的数据 -w [BYTES] --width[=BYTES] 设置每行显示的字节数,BYTES 缺省为 32 字节 -t TYPE --format=TYPE 指定输出格式,格式包括 a、c、d、f、o、u 和 x,各含义如下: a:具名字符;比如换行符显示为 nl c:可打印字符或反斜杠表示的转义字符;比如换行符显示为 \n d[SIZE]:SIZE 字节组成一个有符号十进制整数。SIZE 缺省为 sizeof(int) f[SIZE]:SIZE 字节组成一个浮点数。SIZE 缺省为 sizeof(double) o[SIZE]:SIZE 字节组成一个八进制整数。SIZE 缺省为 sizeof(int) u[SIZE]:SIZE 字节组成一个无符号十进制整数。SIZE 缺省为 sizeof(int) x[SIZE]:SIZE 字节组成一个十六进制整数。SIZE 缺省为 sizeof(int) SIZE 可以为数字,也可以为大写字母。如果 TYPE 是 [doux] 中的一个,那么 SIZE 可以为 C = sizeof(char),S = sizeof(short),I = sizeof(int),L = sizeof(long)。如果 TYPE 是 f,那么 SIZE 可以为 F = sizeof(float),D = sizeof(double) ,L = sizeof(long double) --help 在线帮助 --version 显示版本信息 4.常用示例 (1)设置第一列偏移地址以十进制显示。 od -Ad testfile 偏移地址显示基数有:d for decimal, o for octal, x for hexadecimal or n for none。 (2)od 不显示第一列偏移地址。 od -An testfile (3)以十六进制输出,默认以四字节为一组(一列)显示。 od -tx testfile (4)以十六进制输出,每列输出一字节。 od -tx1 testfile (5)显示ASCII字符和ASCII字符名称,注意换行符显示方式的区别。 #显示ASCII字符 [b3335@localhost]$ echo lvlv|od -a 0000000 l v l v nl 0000005 #显示ASCII字符名称 [b3335@localhost]$ echo lvlv|od -tc 0000000 l v l v \n 0000005 (6)以十六进制显示的同时显示原字符。 [b3335@localhost]$ echo lvlv|od -tcx1 0000000 l v l v \n 6c 76 6c 76 0a 0000005 (7)指定每行显示512字节。 od -w512 -tx1 testfile (8)od 命令输出时去除列与列之间的空格符。 当我们需要将文件内容显示为十六进制,需要输出连续的单个字节,每个字节以十六进制显示。这时我们可以通过od命令将文件以单个字节为一组,十六进制输出在同一行,并去除每个字节之间的空格。目前还不知道怎么通过指定od命令的相关选项去除列与列之间的空格,也许od命令本身并不支持。我的做法是: (a)使用-An不输出偏移地址; (b)使用-v输出时不省略重复的数据; (c)使用-tx1以单个字节为一组按照十六进制输出,-w1每列输出一个字节; (d)最后通过管道传递给 awk 的标准输入,通过awk不换行输出所有行,拼接为一行输出。 具体命令如下: od -An -w1 -tx1 testfile|awk '{for(i=1;i<=NF;++i){printf "%s",$i}}' ●shutdown 命令: 1.功能 shutdown 指令可以关闭所有程序,并依用户的需要,进行重启或关机操作。 使用 shutdown 命令时,在系统关机前,可以通知所有登录者系统将要关闭。此时 login 指令会被冻结,新用户将不能再登录,这是推荐使用的安全关机方式。关机之前,所有进程都会受到 shutdown 指令所发送的关闭进程信号,然后向 init 程序发送信号,要求它改变运行等级(runlevel)。 Linux 系统有 7 个运行级别: 运行级别0:系统停机状态,系统默认运行级别不能设为0,否则不能正常启动; 运行级别1:单用户工作状态,root权限,用于系统维护,禁止远程登陆; 运行级别2:多用户状态(没有NFS); 运行级别3:完全的多用户状态(有NFS),登陆后进入控制台命令行模式; 运行级别4:系统未使用,保留; 运行级别5:X11控制台,登陆后进入图形GUI模式; 运行级别6:系统正常关闭并重启,默认运行级别不能设为6,否则不能正常启动。 2.命令格式 shutdown [选项] [参数] 3.选项说明 -c cancel,其他用户可以取消目前正在执行的关机程序,或者Control-C终止shutdown程序 -k 仅仅向每个登录用户发出警告信息,并不真正关机 -f 重新启动时不执行fsck文件系统检查命令; -F 重新启动时执行fsck文件系统检查命令; -h 关机(halt)或关闭电源(power off),至于选择哪一种取决于系统的关机脚本(有時候可以在 BIOS 中更改) -H 关机(halt); -P 关机,等价于 poweroff 命令 -n 不调用 init 程序进行关机,而由 shutdown 自己进行 -r 重启。等价于 reboot 命令 -t <秒数> 送出警告信息和删除信息之间要延迟多少秒 --help 显示帮助信息 --version 显示版本 4.常用示例 (1)立刻关机,其中 now 相当于时间为 0 的状态。 shutdown -H now //或 halt (2)系统在今天的 20:25 分关机。 shutdown -H 20:25 (3)系统立刻重新启动。 shutdown -r now //或 reboot (4)发送后面的警告信息,再过 30 分钟系统会自动重启。 shutdown -r +30 'The system will reboot' (5)仅发出警告,系统并不会关机。 shutdown -k now 'This is just a warning message' (6)立即关机并切断电源。 shutdown -P now //或 poweroff (7)恶作剧,仅发出警告,什么都不会发生。 shutdown +10 -k '10分钟后关机' 5.常见问题 (1)shutdown -h、shutdown -H和shutdown -P的区别? shutdown -H是关机操作,停止系统运行,但并未关闭电源,shutdown -P是关闭电源操作。shutdown -h则根据系统的默认设置来选择是否关闭电源 。关闭电源会送出 ACPI 指令通知PSU(Power Supply Unit)电源。 (2)shutdown默认操作进入单用户维护模式。 //十分钟后进入单用户维护模式 shutdown +10 ●declare/typeset 命令(builtin): 1.功能简介 declare(别名 typeset)属 Shell 内建命令,用于申明 Shell 变量并设置变量属性,或查看已定义的 Shell 变量和函数。若不加上任何参数,只执行 declare/typeset 则会显示全部的 Shell 变量与函数(与执行 set 指令的效果相同)。 2.命令格式 declare [-aAfFgilrtux] [-p] [name[=value] ...] typeset [-aAfFgilrtux] [-p] [name[=value] ...] 3.选项说明 -a 申明数组变量 -A 申明关联数组,可以使用字符串作为数组索引 -f 仅显示已定义的函数 -F 不显示函数定义 -g 指定变量为全局变量,即使在函数内定义变量 -i 声明整型变量 -l 将变量值的大写字母变为小写 -r 设置只读属性 -t 设置变量跟踪属性,用于跟踪函数进行调试,对于变量没有特殊意义 -u 变量值的小写字母变为大写 -x 将指定的Shell变量换成环境变量 -p 显示变量定义的方式和值 + 取消变量属性,但是 +a 和 +r 无效,无法删除数组和只读属性,可以使用unset删除数组,但是 unset 不能删除只读变量 4.示例 (1)定义关联数组并访问。 declare -A assArray=([lucy]=beijing [yoona]=shanghai) #读取关联数组全部内容 echo ${assArray[*]} #或 echo ${assArray[@]} #输出 beijing shanghai #读取指定索引的数组值 echo ${assArray[lucy]} #输出: beijing #列出数组索引列表 echo ${!assArray[*]} #或 echo ${!assArray[@]} #输出 yoona lucy (2)定义只读变量。 declare -r name1="lvlv1" #或 typeset -r name2="lvlv2" #或 readonly name3="lvlv3" Shell 规定,只读变量生命周期与当前 Shell 脚本进程相同,且不能消除只读属性和删除只读变量,除非 kill 当前 Shell 脚本进程。 (3)使用-p选项显示变量 name1 和 name2 的定义方式和当前值。 declare -p name1 name2 #输出 declare -r name1="lvlv1" declare -r name2="lvlv2" (4)使用-x选项将shell变量转换为临时环境变量,供当前Shell会话的其他shell进程使用,退出当前Shell会话则失效。 declare -x name1; (5)显示所有 Shell 环境变量。 declare -x (6)使用+x选项取消变量为环境变量。 delcare +x name1 (7)申明整型变量,赋值浮点型数值将报错。 declare -i integer=666 ●sort 命令: 1.命令简介 以行为单位对文本文件的内容进行排序,将结果显示在标准输出,比较原则是从行首字符向后,依次按 ASCII 码值进行比较,最后按升序输出。如果 file 参数指定多个文件,那么 sort 命令将这些文件纵向连接起来,当作一个文件进行排序。 不加任何选项时,将对整行从第一个字符开始依次向后直到行尾按照 ASCII 码值做升序排序。 2.命令格式 sort [OPTION]... [FILE]... sort [OPTION]... --files0-from=F 3.选项说明 注意,长选项的强制性参数对于短选项也是强制的。 -b, --ignore-leading-blanks 忽略每行前面的空格字符 -c, --check, --check=diagnose-first 只检查文件是否已排序,不进行排序 -C, --check=quiet, --check=silent 类似于 -c,但不报告第一个乱序的行 -d, --dictionary-order 按照字典序,只考虑字母、数字及空格字符,忽略其他字符 --files0-from=F 从文件 F 中以 NUL 字符结尾的字符串作为输入文件名;如果 F 是 -,则从标准输入中读取文件名 -f, --ignore-case 排序时,将小写字母视为大写字母 -i, --ignore-nonprinting 排序时,只考虑可打印字符,忽略不可打印字符 -m, --merge 合并多个已排序的文件 -n, --numeric-sort 按数值大小排序 -o, --output=FILE 将排序结果输出到指定文件 -r,--reverse 逆向输出排序结果(降序排序) -t, --field-separator=SEP 指定排序时使用的分隔字符,sort命令默认字段分隔符为空格和Tab -u, --unique 相同的数据中,仅输出一行 -k,--key=POS1[,POS2] 以第 POS1 栏到 POS2 栏排序,默认到最后一栏 --help 显示帮助信息并退出 --version 显示版本信息并退出 28 29 30 31 32 4.常用示例 (1)对 /etc/passwd 进行排序。 cat /etc/passwd | sort adm:x:3:4:adm:/var/adm:/sbin/nologin apache:x:48:48:Apache:/var/www:/sbin/nologin bin:x:1:1:bin:/bin:/sbin/nologin daemon:x:2:2:daemon:/sbin:/sbin/nologin (2)/etc/passwd 内容以冒号:来分隔,以第三栏至行末尾栏来排序。 cat /etc/passwd | sort -t ':' -k 3 root:x:0:0:root:/root:/bin/bash uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin operator:x:11:0:operator:/root:/sbin/nologin bin:x:1:1:bin:/bin:/sbin/nologin games:x:12:100:games:/usr/games:/sbin/nologin (3)如果对 /etc/passwd,以第六个域的第 2 个字符到第 4 个字符进行升序排序,再基于第一个域进行反向排序。 cat /etc/passwd | sort -t ':' -k 6.2,6.4 -k 1,1r sync:x:4:65534:sync:/bin:/bin/sync proxy:x:13:13:proxy:/bin:/bin/sh bin:x:2:2:bin:/bin:/bin/sh sys:x:3:3:sys:/dev:/bin/sh bin:x:3:3:sys:/dev:/bin/sh 可以看出,六个域的第 2 个字符到第 4 个字符是升序排序。六个域的第 2 个字符到第 4 个字符如果相同则分为一组,组内再按照第一个域进行降序排序。注意,-r 需要与第二个 -k 的 连写,否则对前面两个 -k 均有效。 ●uniq 命令: 1.命令简介 用于去除有序文件中的重复行并将结果输出到标准输出。为了使uniq 起作用,所有的重复行必须是相邻的,所以 uniq 经常和 sort 合用。 2.命令格式 uniq [OPTION]... [INPUT [OUTPUT]] 3.选项说明 -c, --count 显示行出现的次数 -d, --repeated 仅显示重复出现的行,即出现次数 >=2 的行,且只打印一次 -D, --all-repeated[=delimit-method] 仅显示重复的行,即出现次数 >=2 的行,且打印重复行的所有行。其中 delimit-method 表示对重复行集合的分隔方式,有三种取值,分别为none、prepend和separate。其中none表示不进行分隔,为默认选项,uniq -D等同于uniq --all-repeated=none;prepend表示在每一个重复行集合前面插入一个空行;separate表示在每个重复行集合间插入一个空行。 -f, --skip-fields=N 忽略前N个字段。字段由空白字符(空格符、Tab)分隔。如果您的文档的行被编号,并且您希望比较行中除行号之外的所有内容。如果指定了选项 -f 1,那么下面相邻的两行: 1 这是一条线 2 这是一条线 将被认为是相同的。如果没有指定 -f 1 选项,它们将被认为是不同的 -i, --ignore-case 忽略大小写字符的不同 -s, --skip-chars=N 跳过前面N个字符不比较 -u, --unique 只显示唯一的行,即出现次数等于1的行 -w, --check-chars=N 指定每行要比较的前N个字符数 --help 显示帮助信息并退出 --version 显示版本信息并退出 4.常用示例 先构造一个示例文件 testfile,其内容如下: hello world friend hello world hello (1)对无序文件去重无效。直接删除未经排序的文件,将会发现没有任何行被删除: uniq testfile hello world friend hello world hello (2)uniq 结合 sort 命令,对排序文件去重。 cat testfile | sort | uniq friend hello world (3)排序之后删除了重复行,同时在行首位置输出该行重复的次数。 #sort testfile | uniq -c 1 friend 3 hello 2 world (4)仅显示存在重复的行,并在行首显示该行重复的次数: #sort testfile | uniq -dc 3 hello 2 world (5)仅显示不重复的行。 sort testfile | uniq -u friend (6)仅显示重复的行,且显示重复行的所有行。 sort testfile | uniq -D hello hello hello world world (7)uniq 默认是比较相邻行的所有内容来判断是否重复,我们可以通过选项-w或--check-chars=N指定比较前 N 个字符。比如我们有如下内容的文件 test.txt: apple application api 打印前三个字符相同的行: uniq -w3 -D test.txt apple application ●rz 命令与 sz 命令: 1.rz 命令 1.1 命令简介 rz 命令(Receive ZMODEM),使用 ZMODEM 协议,将本地文件批量上传到远程 Linux/Unix 服务器,注意不能上传文件夹。 当我们使用虚拟终端软件,如 XShell、SecureCRT 或 PuTTY 来连接远程服务器后,使用 rz 命令可以上传本地文件到远程服务器。输入 rz 回车后,会出现文件选择对话框,选择需要上传文件,一次可以指定多个文件,上传到服务器的路径为当前执行 rz 命令的目录。 此外,可以在虚拟终端软件设置上传时默认加载的本地路径和下载的路径。如SecureCRT软件 -> Options -> session options -> X/Y/Zmodem 下可以设置上传和下载的目录。 1.2 命令格式 rz [OPTIONS] 1.3 选项说明 -+, --append 将文件内容追加到已存在的同名文件 -a, --ascii 以文本方式传输 -b, --binary 以二进制方式传输,推荐使用 --delay-startup N 等待 N 秒 -e, --escape 对所有控制字符转义,建议使用 -E, --rename 已存在同名文件则重命名新上传的文件,以点和数字作为后缀 -p, --protect 对 ZMODEM 协议有效,如果目标文件已存在则跳过 -q, --quiet 安静执行,不输出提示信息 -v, --verbose 输出传输过程中的提示信息 -y, --overwrite 存在同名文件则替换 -X, --xmodem 使用 XMODEM 协议 --ymodem 使用 YMODEM 协议 -Z, --zmodem 使用 ZMODEM 协议 --version 显示版本信息 --h, --help 显示帮助信息 以上为常见的命令选项,更多的选项说明,请参见rz的帮助手册。 1.4 常用示例 (1)以二进制,并对控制字符进行转义,替换已存在的同名文件。 rz -bye 2.sz 命令 2.1 命令简介 sz 命令(Send ZMODEM)通过 ZMODEM 协议,可将多个文件从远程服务器下载到本地。注意不能下载文件夹,如果下载文件夹,请先打包再下载。 2.2 命令格式 rz [OPTIONS] FILES 2.3 选项说明 命令选项基本与 rz 相同,请参考上文 rz 的命令选项或者 sz 的manual,或者运行命令sz -h查看。 2.4 常用示例 (1)下载多个文件 sz file1 file2 file3 实测 sz 不用选项-bye,使用 XShell,也可以正确传输文本文件与二进制文件。 3.FAQ (1)rz 命令和 sz 命令如何上传、下载文件夹? 很遗憾,据我所知,rz 命令和 sz 命令不能直接上传、下载文件夹,可先将文件夹打包,当作文件上传和下载。 (2)经常把 rz 和 sz 弄混淆,该如何正确记忆? 之所以将 rz 称之为上传工具,是因为我们以本地机器为中心。从远程服务器的角度,很容易理解rz为什么叫作 Receive ZMODEM,因为服务器需要从本地机器接收文件。sz命令则表示从服务器发送文件到本地,也叫下载文件。 ●tcpdump 命令: 1.命令简介 tcpdump 是一款类 Unix/Linux 环境下的抓包工具,允许用户截获和显示发送或收到的网络数据包。tcpdump 是一个在 BSD 许可证下发布的自由软件。 2.命令格式 tcpdump [ -AbdDefhlLnNOpqRStuUvxX ] [ -B buffer_size ] [ -c count ] [ -C file_size ] [ -F file ] [ -G rotate_seconds ] [ -i interface ] [ -m module ] [ -M secret ] [ -r file ] [ -s snaplen ] [ -T type ] [ -w file ] [ -W filecount ] [ -E spi@ipaddr algo:secret,... ] [ -y datalinktype ] [ -z postrotate-command ] [ -Z user ] [ expression ] 3.选项说明 -A 以 ASCII 码方式显示每一个数据包(不会显示数据包中链路层头部信息)。在抓取包含网页数据的数据包时,可方便查看数据 -b 用 ASDOT 符号而不是 ASPLAIN 符号在 BGP 数据包中打印 AS 号 -B, --buffer-size=BUFFER_SIZE 设置操作系统捕捉缓冲大小,单位 KB -c [数据包数目] 收到指定的数据包数目后,就停止进行捕获操作 -C FILE_SIZE 与 -w FILE 选项配合使用。该选项使得 tcpdump 在把原始数据包直接保存到文件中之前,检查此文件大小是否超过 file-size。如果超过了,将关闭此文件,另创一个文件继续保存原始数据包。新创建的文件名与 -w 选项指定的文件名一致, 但文件名后多了一个数字,该数字会从1开始随着新创建文件的增多而增加。 file-size的单位是百万字节(nt: 这里指1,000,000个字节,并非1,048,576个字节, 后者是以1024字节为1k, 1024k字节为1M计算所得, 即1M=1024*1024 =1,048,576) -d 把编译过的数据包编码转换成可阅读的格式,并倾倒到标准输出 -dd 把编译过的数据包编码转换成C语言的格式,并倾倒到标准输出 -ddd 把编译过的数据包编码转换成十进制数字的格式,并倾倒到标准输出 -D, --list-interfaces 打印系统中所有 tcpdump 可以在其上进行抓包的网络接口。每一个接口会打印出数字编号, 相应的接口名字, 以及一个可能的网络接口描述。其中网络接口名字和数字编号可以用在tcpdump的-i [flag]选项(nt:把名字或数字代替flag), 来指定要在其上抓包的网络接口。此选项在不支持接口列表命令的系统上很有用(nt: 比如, Windows 系统, 或缺乏 ifconfig -a 的UNIX系统); 接口的数字编号在windows 2000 或其后的系统中很有用, 因为这些系统上的接口名字比较复杂, 而不易使用。如果tcpdump编译时所依赖的libpcap库太老,-D 选项不会被支持, 因为其中缺乏 pcap_findalldevs()函数 -e 每行打印输出中将包括数据包的数据链路层头部信息 -f 显示外部的IPv4地址时(nt:foreign IPv4 addresses, 可理解为非本机ip地址), 采用数字方式而不是名字。此选项是用来对付Sun公司的NIS服务器的缺陷(nt: NIS, 网络信息服务, tcpdump 显示外部地址的名字时会用到它提供的名称服务): 此NIS服务器在查询非本地地址名字时,常常会陷入无尽的查询循环)。由于对外部(foreign)IPv4地址的测试需要用到本地网络接口(nt: tcpdump 抓包时用到的接口)及其IPv4 地址和网络掩码. 如果此地址或网络掩码不可用, 或者此接口根本就没有设置相应网络地址和网络掩码(nt: linux 下的 'any' 网络接口就不需要设置地址和掩码, 不过此'any'接口可以收到系统中所有接口的数据包), 该选项不能正常工作。 -F FILE 使用file文件作为过滤条件表达式的输入, 此时命令行上的输入将被忽略 -G [rotate_seconds] 类似于-C [file_size]命令选项,-C按文件大小来新建文件存储数据包,-G则根据指定的时间周期,将监听到的数据包写入新的文件,新建的文件名由-w选项指定,并且文件名后接有时间串,时间串的格式由strftime(3)指定。如果没有指定时间串的格式,新的文件将覆盖旧的文件。如果与 -C 选项同时使用的话,文件名称格式将是 file。 -h,--help 打印tcpdump的帮助信息和libpcap的版本信息。(nt:libpcap是unix/linux平台下的网络数据包捕获函数包) --version 打印 tcpdump 和 libpcap 的 version -i [interface],--interface=interface 指定 tcpdump 需要监听的接口。如果没有指定,tcpdump 会从系统接口列表中搜寻编号最小的已配置好的接口(不包括 loopback 接口)。一但找到第一个符合条件的接口,搜寻马上结束。 在采用2.2版本或之后版本内核的Linux操作系统上, 'any'这个虚拟网络接口可被用来接收所有网络接口上的数据包(nt: 这会包括目的是该网络接口的,也包括目的不是该网络接口的)。需要注意的是如果真实网络接口不能工作在'混杂模式'(promiscuous)下,则无法在'any'这个虚拟网络接口上抓取其数据包。 如果 -D 标志被指定,tcpdump会打印系统中的接口编号,而该编号就可用于此处的 interface 参数 -l 对标准输出进行行缓冲(nt: 使标准输出设备遇到一个换行符就马上把这行的内容打印出来) -L 列出指定网络接口所支持的数据链路层的类型后退出.(nt: 指定接口通过-i 来指定) -n 不把主机的网络地址转换成名字 -m MODULE 通过 module 指定的 file 装载 SMI 和 MIB 模块(nt: SMI,Structure of Management Information, 管理信息结构;MIB, Management Information Base, 管理信息库。可理解为,这两者用于SNMP(Simple Network Management Protoco)协议数据包的抓取。具体SNMP 的工作原理未知, 另需补充)。 此选项可多次使用,从而为tcpdump装载不同的MIB模块 -M SECRET 如果 TCP 数据包(TCP segments)有TCP-MD5选项(在RFC 2385有相关描述), 则为其摘要的验证指定一个公共的密钥 secret -n 不将地址(比如主机地址、端口号等)转换到对应的名字 -N 不要打印主机名的域名资格,比如打印 nic 而不是 nic.ddn.mil -O,--no-optimize 不启用进行包匹配时所用的优化代码. 当怀疑某些bug是由优化代码引起的, 此选项将很有用 -p,--no-promiscuous-mode 把网络接口设置为非'混杂'模式。但必须注意,在特殊情况下此网络接口还是会以'混杂'模式来工作;从而 -p 的设与不设,不能当做以下选项的代名词:'ether host {local-hw-add}'或'ether broadcast'(nt: 前者表示只匹配以太网地址为host的包, 后者表示匹配以太网地址为广播地址的数据包 -q 快速打印输出,即打印很少的协议相关信息,从而输出行都比较简短 -r [file] 从指定的文件读取数据包,如果 file 为 - 符号, 则tcpdump会从标准输入中读取包数据 -R 设定tcpdump对ESP/AH数据包的解析按照RFC1825而不是RFC1829(nt:AH:认证头,ESP:安全负载封装,这两者会用在IP包的安全传输机制中)。如果此选项被设置,tcpdump将不会打印出'禁止中继'域(nt: relay prevention field)。另外,由于ESP/AH规范中没有规定ESP/AH数据包必须拥有协议版本号域,所以tcpdump不能从收到的ESP/AH数据包中推导出协议版本号 -s, --snapshot-length=SNAPLEN 设置 tcpdump 的数据包抓取长度为 SNAPLEN,而不是默认的 262144 字节。如果产生包截短这种情况, tcpdump的相应打印输出行中会出现''[|proto]''的标志(proto 实际会显示为被截短的数据包的相关协议层次). 需要注意的是, 采用长的抓取长度(nt: snaplen比较大), 会增加包的处理时间, 并且会减少tcpdump 可缓存的数据包的数量, 从而会导致数据包的丢失. 所以, 在能抓取我们想要的包的前提下, 抓取长度越小越好。把snaplen 设置为0意味着让tcpdump自动选择合适的长度来抓取数据包 -S,--absolute-tcp-sequence-numbers 打印 TCP 数据包的顺序号时, 使用绝对的顺序号, 而不是相对的顺序号.(nt: 相对顺序号可理解为, 相对第一个TCP 包顺序号的差距,比如, 接受方收到第一个数据包的绝对顺序号为232323, 对于后来接收到的第2个,第3个数据包, tcpdump会打印其序列号为1, 2分别表示与第一个数据包的差距为1 和 2. 而如果此时-S 选项被设置, 对于后来接收到的第2个, 第3个数据包会打印出其绝对顺序号:232324, 232325) -t 在每行输出中不打印时间戳 -tt 不对每行输出的时间进行格式处理(nt: 这种格式一眼可能看不出其含义, 如时间戳打印成1261798315) -ttt tcpdump 输出时, 每两行打印之间会延迟一个段时间,单位毫秒 -tttt 在每行打印的时间戳之前添加日期的打印 -ttttt 设置每一行输出时相对于第一行的时间间隔,单位毫秒 -T TYPE 强制 tcpdump 按 type 指定的协议所描述的包结构来分析收到的数据包。目前已知的type可取的协议为: (1)aodv(Ad-hoc On-demand Distance Vector protocol, 按需距离向量路由协议, 在Ad hoc(点对点模式)网络中使用); (2)cnfp(Cisco NetFlow protocol); (3)rpc(Remote Procedure Call); (4)rtp(Real-Time Applications protocol); (5)rtcp(Real-Time Applications con-trol protocol); (6)snmp(Simple Network Management Protocol); (7)tftp(Trivial File Transfer Protocol, 碎文件协议); (8)vat(Visual Audio Tool,可用于在internet上进行电视电话会议的应用层协议), 以及wb(distributed White Board,可用于网络会议的应用层协议) -u 打印出未加密的 NFS 句柄(nt:handle可理解为NFS中使用的文件句柄, 这将包括文件夹和文件夹中的文件) -U 使得当 tcpdump 在使用 -w 选项时,其文件写入与包的保存同步。(nt:即当每个数据包被保存时, 它将及时被写入文件中,而不是等文件的输出缓冲已满时才真正写入此文件)。-U标志在老版本的libpcap库(nt:tcpdump所依赖的报文捕获库)上不起作用, 因为其中缺乏pcap_cump_flush()函数 -v 产生详细的输出。比如包的生存时间、标识、总长度以及IP包的一些选项。这也会打开一些附加的包完整性检测, 比如对IP或ICMP包头部的校验和 -vv 产生比-v更详细的输出。比如NFS(Network File System)回应包中的附加域将会被打印,SMB(Server Message Block)数据包也会被完全解码 -vvv 更详细的输出。例如,telent时所使用的SB,SE选项将会被打印, 如果telnet同时使用-X图形界面选项,其相应的图形选项将会以16进制的方式打印出。 -w FILE 把包数据直接写入文件而不进行分析和打印输出,这些包数据可在随后通过-r选项来重新读入并进行分析和打印 -W FILECOUNT 此选项与 -C 选项配合使用,这将限制可打开的文件数目, 并且当文件数据超过这里设置的限制时, 依次循环替代之前的文件, 这相当于一个拥有filecount 个文件的文件缓冲池。同时,该选项会使得每个文件名的开头会出现足够多并用来占位的0,可以方便这些文件被正确的排序 -x:打印每个包的头部数据, 同时会以16进制打印出每个包的数据(但不包括连接层的头部),总共打印的数据大小不会超过整个数据包的大小与snaplen 中的最小值。必须要注意的是, 如果高层协议数据没有snaplen这么长,并且数据链路层(比如,Ethernet层)有填充数据, 则这些填充数据也会被打印 -xx:打印每个包的头部数据, 同时会以16进制打印出每个包的数据, 其中包括数据链路层的头部 -X:当分析和打印时, tcpdump会打印每个包的头部数据,同时会以16进制和ASCII码形式打印出每个包的数据(但不包括链路层的头部)。这对于分析一些新协议的数据包很方便 -XX:当分析和打印时,tcpdump会打印每个包的头部数据,同时会以16进制和ASCII码形式打印出每个包的数据, 其中包括数据链路层的头部.这对于分析一些新协议的数据包很方便 -y [datalinktype],--linktype=datalinktype:设置tcpdump只捕获数据链路层协议类型是datalinktype的数据包 -z [postrotate-command]:与-C或-G联用,当每一个文件被关闭时执行命令postrotate-command。比如,-z gzip或-z bzip2将对每一个保存的文件进行压缩 -Z , --relinquish-privileges=USER 使 tcpdump 放弃自己的超级权限(如果以 root 用户启动 tcpdump,tcpdump 将会有超级用户权限),并把当前 tcpdump 的用户 ID 设置为 USER,组 ID 设置为 USER 属组的 ID expression 条件表达式用于选择捕获符合条件的数据包,无 expression,网络上任何两台主机间的所有数据包都将被截获 4.常用示例 4.1 监视指定主机的数据包 (1)打印所有到达或从主机 sunrise 发出的数据包,host 可以是 IP 地址或主机名。 tcpdump host sunrise (2)打印主机 A 与 B 或 C 之间来往的所有数据包。 tcpdump host A and \( B or C \) (3)打印 ace 与任何其他主机之间通信的 IP 数据包,但不包括与 helios 之间的数据包. tcpdump ip host ace and not helios 4.2 监视指定网络的数据包 (1)打印本地主机与 Berkeley 网络上的主机之间的所有通信数据包。 tcpdump net ucb-ether (2)打印所有通过网关 snup 的 ftp 数据包。注意,表达式被单引号括起来了,这可以防止 Shell 对其中的括号进行错误解析。 tcpdump 'gateway snup and (port ftp or ftp-data)' (3)打印不是本地网络的数据包。 tcpdump ip and not net localnet 4.3 监视指定协议的数据包 (1)打印 TCP 会话中的的开始和结束数据包,并且数据包的源或目的不是本地网络上的主机。(nt:localnet,实际使用时要真正替换成本地网络的名字) tcpdump 'tcp[tcpflags] & (tcp-syn|tcp-fin) != 0 and not src and dst net localnet' (2)打印长度超过 576 字节,并且网关地址是 snup 的 IP 数据包。 tcpdump 'gateway snup and ip[2:2] > 576' ip[2:2] 表示整个 IP 数据包的长度。 (3)打印除’echo request’或者’echo reply’类型以外的 ICMP 数据包(比如,需要打印所有非 ping 程序产生的数据包时可用到此表达式 。(nt: ‘echo reuqest’ 与 ‘echo reply’ 这两种类型的 ICMP 数据包通常由 ping 程序产生) tcpdump 'icmp[icmptype] != icmp-echo and icmp[icmptype] != icmp-echoreply' 4.4 监视指定主机和端口的数据包 (1)抓取主机 100.94.138.110 所有经由接口 eth1 接收的数据包,且端口号是20700。 tcpdump -i eth1 -lnXps0 dst 100.94.138.110 and dst port 20700 -c 10 命令选项说明:lnXps0 请参照上文的命令选项详解,-c 10 表示只捕捉 10 个数据包。 ●split 命令: 1.命令简介 split 命令用于将一个大文件分割成较小的文件,默认每 1000 行分割成一个小文件。有时需要将文件分割成更小的片段,比如为提高可读性、生成日志等。 2.命令格式 split [OPTION]... [FILE [PREFIX]] 将文件 FILE 切分输出到 PREFIXaa、PREFIXab,以此类推。默认按 1000 行为单位进行切分,前缀 PREFIX 默认为 x。 如果没有文件,或者当文件是 -,从标准输入读取。 3.选项说明 注意,长选项的强制性参数对于短选项也是强制的。 -a, --suffix-length=N 指定分割后文件名的后缀字符数目(后缀长度),默认是 2 -b, --bytes=SIZE 指定每一子输出文件的大小,单位 byte -C, --line-bytes=SIZE 子文件中,单行的最大字节数 -d 使用数字作为后缀,从 0 开始 --numeric-suffixes[=FROM] 作用同-d,但可以设置起始数字 -x 使用从 0 开始的十六进制后缀,而不是字母 -, -l, --lines=NUMBER 指定多少行分割成一个小文件 -t, --separator=SEP 使用 SEP 替代换行符作为记录分隔符 --verbose 分割文件时输出冗余信息 --help 显示帮助信息并退出 --version 显示版本信息并退出 4.常用示例 (1)将 /etc/passwd 每十行分割成一个小文件,小文件名的前缀是 lvlv。 split -10 /etc/passwd lvlv // 使用 ls 查看分割出来的小文件 ls lvlvaa lvlvab lvlvac lvlvad lvlvae (2)按 10 行分割文件,每个文件的后缀从 000 开始。 split -a3 -d -10 /etc/passwd lvlv ●col 命令: 1.命令简介 col(control)命令是一个标准输入文本过滤器,它从标准输入读取内容,过滤掉控制字符反向换行符(RLF-Reverse Line Feed)和半反向换行符(HRLF-Halt RLF)后输出到标准输出。还可以将空白符用等价制表符(Tab)或空格(Space)来替换。 在许多 Linux 说明文件里,包含控制字符。当我们运用 Shell 特殊字符 > 和 >> 把说明文件的内容输出成纯文本文件时,控制字符会变成乱码,col 命令则能有效滤除这些控制字符。 2.命令格式 col [OPTIONS] 3.选项说明 -b, --no-backspaces 不输出任何退格符,只打印写入每个列位置的最后一个字符 -f, --fine 允许正向半换行符(half-forward line feeds)。通常,处于半行分界线上的字符打印在下一行 -h, --tabs 将多个空格转换为Tab,一般 4 个 空格转为 1 个 Tab -l, --lines NUMBER 设置缓冲行为 NUMBER,默认为 128 -p, --pass 不转换未识别的控制符 -x, --spaces 将 Tab 转为多个空格,一般 1 一个 Tab 转为 4 个空格 -H, --help 显示帮助信息并退出 -V, --version 显示版本信息并退出 4.常用示例 (1)将 Tab 替换为空格,一般 1 个 Tab 转为 4 个空格。 echo -e "123\t456" | col -x (2)将空格替换为 Tab,一般 4 个 空格转为 1 个 Tab。 echo -e "123 456" | col -h (3)将帮助文档内的控制符删除。以 col 命令的 manual 为例。 man col | col -b > newFile 5.相关疑问 RLF 字符(reverse line feed)是反向换行符,HRLF字符(half-reverse line feed)是半反向换行符。百度知道中有网友的回答,但是我还是不太清楚这两个字符的作用和应用场景,请知道的大牛评论告知,万分感谢。 ●wc 命令: 1.命令简介 wc(word count)命令用于统计文件字节、字符、单词与行的数量。 2.命令格式 wc [OPTION]... [FILE]... wc [OPTION]... --files0-from=F 3.选项说明 -c, --bytes 仅显示字节数 -m, --chars 仅显示字符数 -l, --lines 仅显示行数 --files0-from=F 从文件 F 中获取以 NULL 字符结尾的文件名作为输入,如果 F 等于连字符 -,则从标准输入读取 -L, --max-line-length 显示文件中最长行的字符数 -w, --words 显示单词数,单词以空格分隔 --help 显示帮助信息并退出 --version 显示版本信息并退出 4.示例 (1)使用 wc 统计 /etc/passwd 行数、单词数和字节数。 wc /etc/passwd 40 45 1719 /etc/passwd 40 是行数,45 是单词数,1719 是字节数。 (2)wc 的命令比较简单,每个参数使用如下: # 统计行数,在统计记录数时,很常用 wc -l /etc/passwd 40 /etc/passwd # 表示系统有40个账户 # 统计单词出现次数 wc -w /etc/passwd 45 /etc/passwd # 统计文件的字节数 wc -c /etc/passwd 1719 # 统计文件的字符数,如果是 ASCII、Latin-1 等单字节编码的字符,字符数等于字节数 wc -m /etc/passwd 1719 (3)从文件读取输入文件名。如果有多个文件名,并且希望 wc 从一个文件中读取它们,那么使用 -files0-from 选项。这里将文件名称必须以 NULL 字符结束写在文件fileNames.txt 中。 wc --files0-from=fileNames.txt 在 vim 中输入 NULL 字符,可以通过 digraph 输入,具体操作步骤是:在输入模式按一下Ctrl+k,然后输入NU。关于 digraph 和其它输入方式具体参见 Vim 中读写特殊字符。 ●cut 命令: 1.命令简介 cut 是一个选取命令,以行为单位,选择性输出符合条件的内容到标准输出。 cut 命令主要用途有两个,其一是用来显示文件的内容,它依次读取所指明的文件列表,将它们的内容输出到标准输出上;其二是连接两个或多个文件,如 cut f1 f2 > f3 将把文件 f1 和 f2 的内容合并起来,然后通过输出重定向符 > 的作用,将它们放入文件 f3 中。 2.命令格式 cut OPTION... [FILE]... 在没有提供文件或文件是 - 的情况下,cut 从标准输入读取内容。 3.选项说明 注意,长选项的强制性参数对于短选项也是强制的。 -b, --bytes=LIST 设置输出的字节数或范围 -c, --characters=LIST 设置输出的字符数或范围 -d, --delimiter=DELIM 指定列(或字段)的分隔字符。默认分隔符是制表符 Tab。只能和 -f 选项一起使用 -f, --fields=LIST 设置输出字段,默认字段分隔符是空格。-f 会打印不包含分隔符的行,除非指定了 -s 选项 -n 与 -b 选项连用,不分割多字节字符 --complement 反向选择字节、字符或字段 -s, --only-delimited 若行没有分隔符,则不显示该行。此选项只能和 -f 选项一起使用 --output-delimiter=STRING 使用字符串作为输出分隔符,默认是输入分隔符 -z, --zero-terminated 行分隔符是 NUL,而不是 LF --help 显示帮助信息并退出 --version 显示版本信息并退出 当使用 -b、-c 或 -f 选项时,LIST 由一个范围(range)或逗号隔开的多个范围组成。范围的表示形式有: N 第 N 个字节、字符或字段。N 从 1 开始计数 N- 从第 N 个字节、字符或字段直至行尾 N-M 从第 N 到第 M(包括 M)个字节、字符或字段 -M 从第 1 到第 M(并包 M)个字节、字符或字段 4.常用示例 首先给出用于测试的本文件 testfile,其内容如下: hello world i am lvlv i like linux (1)以字符为单位输出指定范围的字符。使用 cut 命令选择第 3 到第 5 个字符输出: cut -c 3-5 testfile llo am lik 如果没有指定结束字符的位置,即cut -c 3- testfile,则输出第三个字符到最后一个字符。同样我们可以使用字节为单位来进行,如果文本文件是单字节编码的字符,那么cut -b 3-5 testfile等同于cut -c 3-5 testfile。 (2)以字段为单位输出指定字段。输出第二列和第三列的内容: cut -d " " -f 1 testfile world am lvlv like linux 注意,因为第一行没有第三列,所以输出为空。 (3)选项提取指定字段之外的列。输出第一列之外的内容: cut -d " " -f 1 --complement testfile world am lvlv like linux ●df 命令: 1.命令简介 df(Disk Free)命令用于查看 Linux 文件系统的磁盘空间占用情况。可以利用该命令来获取硬盘被占用了多少空间,以及剩余空间等信息,默认显示单位为 KB。 本文描述的是 GNU 版的 df,其它版本(如 POSIX 版)的实现会有所不同。 2.命令格式 df [OPTION]... [FILE]... 参数 FILE 表示文件系统上的文件。如果给定参数 FILE,则 df 分别展示各个文件所在文件系统的信息,如果没有给定 FILE,则默认输出所有已挂载的文件系统的载信息。 3.选项说明 -a, --all 显示所有的文件系统,包括虚拟文件系统 -B, --block-size=SIZE 使用指定的块大小 -h, --human-readable 以易读的方式显示磁盘空间已用与未用的大小 --direct 显示文件的统计信息,而不是挂载点 --total 显示所有文件系统总的使用情况 -H, --si 使用 1000 而非 1024 作为换算单位 -i, --inodes 显示索引节点 inode 信息,而非磁盘块的使用情况 -k, --local 同 --block-size=1K,即将块大小设置为 1KB -l, --local 只输出本地文件系统信息 -P 输出格式为 POSIX -t , --type=TYPE 显示指定的文件系统 -T, --print-type 显示文件系统类型 -x, --exclude-type=TYPE 显示指定的文件系统之外的文件系统 --no-sync 不进行磁盘同步,默认选项 --help 显示帮助信息并退出 --version 显示版本信息并退出 5.常用示例 (1)以易读方式显示文件系统空间使用情况,并输出文件系统类型。 df -hT Filesystem Type Size Used Avail Use% Mounted on /dev/mapper/vg_mic-lv_root ext4 50G 16G 32G 33% / tmpfs tmpfs 16G 0 16G 0% /dev/shm /dev/sda1 ext4 485M 38M 422M 9% /boot /dev/mapper/vg_mic-lv_home ext4 210G 197G 2.7G 99% /home 上面的示例输出信息表示的意思分别是: 第一列:filesystem代表文件系统在哪个分区,所以列出设备名称。其中/dev/mapper/vg_mic-lv_root这行的意思是,你有一个VG (volume group,卷组)叫作vg_mic, vg_mic里面有一个LV(logical volume,逻辑卷)叫作lv_root。其实这个/dev/mapper/vg_mic-lv_root是一个连接文件,连接到/dev/dm-0的,可以用ll /dev/mapper/vg_mic-lv_root查看。实际上,可以将vg_mic-lv_root看作一个分区来对待就可以了。如果想查看实际的物理分区,可以使用命令pvdisplay [ 1 , 2 ] ^{[1,2]} [1,2]。 第二列:Type代表文件系统类型。比如第三行的tmpfs是一种基于内存的文件系统,类似于ramdisk。tmpfs可以使用RAM,也可以使用swap分区来存储文件,提高文件的读写读写速度。再如第三行的/dev/sda1分区的文件系统是ext4。 第三列:Size 代表分区的大小。 第四列:Used表示已经使用的大小。 第五列:Avail表示可用的大小。 第六列:Use%表示以百分比显示已经使用的比例。 第七列:Mounted on表示磁盘分区挂载的目录,即挂载点。 这里列一下Linux系统中磁盘与其它外设的命名规则,以及磁盘分区的命名规则。常见的设备与其在Linux中的文件名如下表: 设备 文件名 IDE硬盘 /dev/hd[a-d] SCSI/SATA/USB硬盘与U盘 /dev/sd[a-p] 软驱 /dev/fd[0-1] 打印机 25针:/dev/lp[]0-2 USB:/dev/usb/lp[0-15] 鼠标 USB:/dev/usb/mouse[0-15] ps2:/dev/psaux 当前CD ROM/DVD ROM cdrom 当前鼠标 /dev/mouse 磁带机 IDE:/dev/ht0 SCSI:/dev/st0 需要注意的是,每个磁盘驱动器的磁盘分区(partition)不同时,磁盘文件名还会改变。此外,磁带机的文件名,在某些不同的 Linux 发行版本中可能不一样。 IDE磁盘,一般可以接4个,磁盘名称分别是hda,hdb,hdc和hdd。以hda为例,如果分为四个分区,则四个分区的名称分别为hda1,hda2,hda3和hda4,其他三个磁盘的分区名称以此类推。 一个 IDE 磁盘、SATA磁盘和SCSI 磁盘主分区与扩展分区加在一起最多4个,扩展分区最多只有一个,扩展分区中再开辟逻辑分区。 IDE 磁盘最多可以分63个分区,59个逻辑分区。 SATA硬盘最多15个分区,11个逻辑分区。 SCSI硬盘最多16个分区,12个逻辑分区。 SATA 硬盘的分区名称与IDE磁盘的分区名称类似,以第一块 SATA 磁盘 sda 为例,那么各个分区的名称分别是 sda1,sda2,sda3…,以此类推。可见,IDE 磁盘与 SATA 磁盘的分区号均是从 1 开始的 [ 3 ] ^{[3]} [3]。 SCSI 硬盘的分区名称与 SATA 硬盘分区名称相同。 (2) 查看全部文件系统。 df -a Filesystem 1K-blocks Used Available Use% Mounted on rootfs - - - - / /dev/vda1 30830592 9330332 19911116 32% / devtmpfs 7569484 0 7569484 0% /dev sysfs 0 0 0 - /sys proc 0 0 0 - /proc securityfs 0 0 0 - /sys/kernel/security tmpfs 7570224 1232632 6337592 17% /dev/shm ... 系统里面存在很多特殊的文件系统,这些比较特殊的文件系统几乎都是在内存当中(如 /proc 挂载点),所以,这些特殊文件系统都不会占据硬盘空间。 ●umask 命令(builtin): 1.命令简介 umask 为 Shell 内建命令,用于设置创建文件时的权限掩码。 权限掩码由 3 个八进制数字组成,将 777(八进制)减掉权限掩码后,即可得到新建文件的默认权限。它与 chmod 的效果刚好相反。 2.命令格式 umask [-p] [-S] [MODE] 后不跟任何选项与参数单独执行 umask,则以八进制格式显示当前权限掩码。 3.选项说明 -p [MODE] 以八进制数字形式显示或设置权限掩码。当 MODE 没有提供时,显示当前权限掩码。为默认选项 -S [MODE] 以字符形式显示或设置新建文件的默认权限。当 MODE 没有提供时,显示新建文件的默认权限 注意:出于安全的考虑,文件的执行权限不能通过权限掩码来设置,必须手工修改。 4.常用示例 (1)显示当前权限掩码。 umask 0022 (2)以字符形式显示新建文件的默认权限。 umask -S u=rwx,g=rx,o=rx 等于八进制权限位 0777 减去掩码 0022,即 0755,以字符形式显示为 u=rwx,g=rx,o=rx。 (3)设置权限掩码并查看。 #设置权限掩码 umask 044 #查看权限掩码 umask 044 ●chattr 与 lsattr 命令: 1.简介 chattr 与 lsattr 分别用于改变和显示文件属性,与 chmod 命令相比,chmod 只改变文件的读写、执行权限,更底层的属性控制是由 chattr 来改变。 2.chattr 命令 2.1 命令格式 chattr [ -RVf ] [ -v version ] [ mode ] files... 2.2 参数说明 -R 递归地改变指定目录下文件的属性。此选项忽略符号链接; -V 显示命令执行的详细信息; -f 大部分错误信息不输出; -v 设置文件版本号; + 在原有参数设定基础上,追加参数; - 在原有参数设定基础上,移除参数; = 更新指定参数设定 最关键的是 [mode] 部分,[mode] 部分由 + - = 和字符 [acdeijstuADST] 组合而成,这部分是用来控制文件的属性。 chattr 可以改变的文件系统属性有: 属性 含义 a append only,只允许向文件追加数据,不允许删除和修改文件内容。如果目录有具有这个属性,系统将只允许在目录下简历和修改文件,不允许删除任何文件。只有root才能设置该属性 c compress,自动将文件压缩,在读取时自动解压缩 d No dump,在进行文件系统备份时,dump指令忽略此文件 e extent format,在ext文件系统中,表示该文件使用区段(extents)映射磁盘上的块 i immutable,不允许对文件进行任何的修改。对于目录而言,只能修改目录之下的文件,不允许建立和删除文件。只有root能设置此属性 j journal,设定此参数使得当通过mount参数:data=ordered 或者 data=writeback 挂 载的文件系统,文件在写入时会先被记录(在journal中)。如果filesystem被设定参数为 data=journal,则该参数自动失效 s secure deletion,系统在删除文件时,使用0填充文件所在的区域 t no tail-merging,文件拥有t属性时,与其它文件合并时末端不会存在局部块碎片 u undeletable,与s相反,删除文件时,文件内容其实还存在磁盘中,以便以后能够恢复删除的文件 A Atime,不能修改文件的最后访问时间 D 如果一个目录设置了D属性,任何改变将同步到磁盘;这等价于mount命令中的dirsync选项,同步目录 S Sync,一旦应用程序对文件执行了写操作,则立刻将改动同步到磁盘 T 目录设置T属性,Orlov块分配器将该目录视为目录层次结构的顶部,提示块分配器该目录下的子目录是无关的,将被分散的分配 注意: chattr 指令所修改的文件属性和 chmod 指令修改的文件属性是两个不同层次的属性,前者是底层文件系统来设定的,而 chmod 指令则是站在用户使用的角度来设定的。 2.3 常见示例 (1)用 chattr 命令防止系统中某个关键文件被修改: chattr +i /etc/resolv.conf 然后用mv /etc/resolv.conf等命令作用于该文件,都会得到 Operation not permitted 的结果。vim 编辑该文件时会提示W10: Warning: Changing a readonly file错误。要想修改此文件需要把 i 属性去掉: chattr -i /etc/resolv.conf (2)让某个文件只能追加内容,不能删除或修改,一些日志文件适用于这种操作。 chattr +a /data1/user_act.log 3.lsattr 命令 3.1 命令格式 lsattr [ -RVadv ] [ files... ] 3.2 命令选项 -R 递归列出子目录及其文件的属性 -V 显示lsattr版本信息 -a 显示所有隐藏的文件属性 -d 如果是目录,则只显示目录本身的属性,而非目录内的文件名 -v 显示文件版本号 3.3 使用示例 [root@add_friend_protect ~/dablelv]# lsattr -vV lsattr 1.41.12 (17-May-2010) 18446744072009275534 --------------- ./demo 18446744072009481631 --------------- ./inputFile.txt 18446744072009374382 -----a--------- ./input_file.txt 第一行为 lsattr 版本信息,第一列为文件版本号,最后一个文件 input_file.txt 属性 a,表示只追加属性。 ●su 与 sudo 命令: 1.su 命令 1.1 命令简介 su 用于临时切换身份到另一个指定的用户,未指定用户名默认为 root。使用 su 切换用户身份后,默认情况下不改变当前工作目录,但会改变 HOME、SHELL、USER、LOGNAME 等 Shell 的环境变量。 1.2 命令格式 su [OPTIONS] [-] [USER [ARG...]] 1.3 选项说明 -c, --command=CMD 执行完指定命令后,立即恢复原来的用户身份 --session-command=CMD 等同于选项 -c,但不创建新会话 -, -l, --login 切换用户身份时启动一个新的 Shell。此选项可同时改变工作目录和 HOME、SHELL、USER、LOGNAME 等环境变量,也包括环境变量 PATH -f, --fast 不必读启动文件(如 csh.cshrc 等),仅用于 csh 或 tcsh 两种 Shell -m, --preserve-environment 保留原用户的 Shell 环境变量 -p 同 -m -s, --shell=SHELL 指定使用的 Shell -h, --help 显示帮助信息并退出 -v, --version 显示版本信息并退出 2.sudo 命令 2.1 命令简介 sudo 可以用指定的用户身份执行指定的指令,而无需输入指定用户的密码,只需要输入当前用户的密码。未指定用户名默认为 root。 2.2 命令格式 sudo [OPTIONS] [CMD] 没有选项与命令单独执行 sudo,将列出 sudo 简要使用方法。 2.3 选项说明 -A 使用辅助程序(可能是图形化界面的程序)读取用户的密码并将密码输出到标准输出。如果设置了环境变量 SUDO_ASKPASS,它会指定辅助程序的路径,否则,由配置文件 /etc/sudo.conf 的 askpass 选项来指定辅助程序的路径。如果没有可用的辅助程序,sudo 将错误退出 -b 选项 -b(background)把 sudo 所要运行的命令放到后台运行 -E 选项 -E(preserve Environment)向安全策略指示用户希望保存他们现有的环境变量。如果指定了 -E 选项,且用户没有保留环境变量的权限,则安全策略可能返回错误 -H 选项 -H(Home)将 HOME 环境变量设置为目标用户的家目录,目标用户默认为 root -h 选项 -h(help)显示帮助信息并退出 -i [CMD] 选项 -i(simulate initial login)将模拟初始登录,即启动目标用户在 /etc/passwd 中配置的 Shell,相关的资源文件将被读取并执行,比如 ~/.profile 和 ~/.login。如果后跟命令 CMD,则 CMD 将被传递给 Shell 并被执行 -K 选项 -K(sure Kill)类似于 -k,它只用于删除了用户的缓存凭据,不能与命令或其他选项一起使用 -k [CMD] 单独使用 -k(kill)选项时,使密码缓存失效,也就是下次执行 sudo 时便需要输入密码。如果后跟命令,表示忽略缓存密码,需要用户重新输入密码 ,新输入的密码不会更新密码缓存 -l[l] [CMD] 如果选项 -l(list)后不跟命令,则列出 sudo 允许当前用户(或使用 -U 指定的其他用户)执行的指令和无法执行的指令。如果指定了命令并被安全策略所允许,则将显示该命令绝对路径以及命令参数。如果指定了命令不被允许,sudo 以状态码 1 退出。如果使用 -ll 或多次指定 -l 选项,则使用长格式输出 -n 选项 -n(non-interactive)表示以非交互模式执行 sudo,阻止 sudo 向用户询问密码。如果执行命令时需要密码,则 sudo 将报错误信息并退出 -p PROMPT 改变询问密码的提示符号 -s [CMD] 选项 -s(shell)执行环境变量 SHELL 表示的 Shell,如果 SHELL 没有值,则执行目标用户在配置文件 /etc/passwd 中配置的 Shell。如果选项后跟命令,则传递给 Shell 执行,如果没有指定命令,则执行交互式 Shell -U USER 选项 -U(other user)与 -l 选项一起使用,以指定应列出其权限的用户。sudoers 策略仅允许 root 用户或当前主机上具有 ALL 权限的用户使用此选项 -u USER 选项 -u(user)指定执行命令时使用的用户身份,默认为 root。如果使用 uid 则使用 #uid 表示用户 -V 选项 -V(version)显示版本信息并退出 -v 选项 -v(validate)使密码有效期延长 5 分钟 注意: sudo 运行时要参照配置文件 /etc/sudousers ,配置文件配置了用户能够执行的命令。 2.4 常用示例 (1)以指定用户身份执行命令。 sudo –u USERNAME CMD 3.su 和 sudo 命令的区别 (1)功能不同 su 用来长时间切换用户,常见用法是su USERNAME,未指定 USERNAME 默认切换至 root。 sudo 允许被授权的用户以其他用户或者管理员身份来执行命令,可以使用 -u 选项来指明需要使用的用户身份,默认是 root。sudo 使一般用户不需要知道超级用户的密码即可获得权限。首先超级用户将普通用户的名字、可以执行的特定命令、按照哪种用户或用户组的身份执行等信息,登记在特殊的文件中(通常是 /etc/sudoers),即完成对该用户的授权(此时该用户称为 sudoer)。若其未经授权的用户企图使用 sudo,则会发出警告的邮件给管理员。用户使用 sudo 时,必须先输入当前用户密码,如果当前用户是 root 或者当前用户与目标用户一致,无需输入密码,之后的一段时间内(默认为 5 分钟,可在 /etc/sudoers 配置),使用 sudo 不需要再次输入密码。 ●screen 命令: 1.命令简介 screen 是 GNU 开发的终端会话管理工具,可以新建和管理多个终端会话,并提供切换、分离、挂载等相应的功能。 每个终端会话可以创建 1~10 个窗口,其重要的特点就是终端断开连接后,screen 创建的终端会话中的任务是保存在后台运行的,不会因为终端窗口关闭或者断开连接而终止执行。 详细说明参见GNU Screen官方站点。 2.命令格式 screen [OPTIONS] [ CMD [ ARGS ] ] screen -r [[PID.]TTY[.HOST]] screen -r SESSIONOWNER/[[PID.]TTY[.HOST]] 3.选项说明 -A 将所有窗口都调整为目前终端机的大小 -d, -D [PID.TTY.HOST] 分离指定的 screen 会话 -h NUM 将历史记录回滚缓冲区指定为 NUM 行 -m 即使目前处于 screen 会话,仍强制建立新的 screen 会话 -r [PID.TTY.HOST] -r SESSIONOWNER/[PID.TTY.HOST] 恢复离线的 screen 会话 -R 先试图恢复离线的会话,若找不到离线的会话,再建立新的 screen 会话 -s PROGRAM 指定建立新窗口时所要执行的 Shell,用以取代环境变量 SHELL 表示的 Shell -S SESSIONNAME 创建一个指定名称的新 session -v 显示版本信息 -x 恢复之前离线的 screen 会话 -ls, --list 显示目前所有的 screen 会话 -wipe [MATCH] 检查目前所有的 screen 会话,并删除已经无法使用的 screen 会话 1 4.常用示例 screen -S yourname: 新建一个叫 yourname 的 session screen -ls: 列出当前所有的screen session,注意显示的screen会话的命名格式是pid.name,其中pid指的是screen的进程号,name就是screen会话的名称 screen -r yourname: 回到yourname这个session; screen -d yourname: detach某个session; screen -d: detach当前session; screen -d -r yourname: 分离已经连接的 session,重新回到 yourname exit:关闭当前窗口,并且切换到下一个窗口(当退出最后一个窗口时,该screen会话自动终止,并且退回到原始 Shell 状态) 进入一个 screen 会话中,才可以切换窗口,在每个 screen session 下,所有快捷键都以 Ctrl+a 开始。常用快捷键如下: Ctrl+a+?:显示所有键绑定信息 Ctrl+a+c:创建一个新的运行shell窗口并切换到该窗口 Ctrl+a+n:切换到下一个window Ctrl+a+p:切换到前一个window Ctrl+a+0..9:切换到第 0..9 个window Ctrl+a [Space]:由视窗0循序切换到视窗9 Ctrl+a+d:分离当前screen会话,即退出当前screen会话。将目前的screen session (可能含有多个 windows) 丢到后台执行,并会回到还没进 screen 时的状态,此时在 screen session 里,每个 window 内运行的 process (无论是前台/后台)都在继续执行,即使 logout 也不影响。 Ctrl+a+z -> 把当前session放到后台执行,用 shell 的 fg 命令则可回去。 Ctrl+a Ctrl+a:在两个最近使用的window间切换。 Ctrl+a+x:锁住当前的window,需用用户密码解锁。 Ctrl+a+w:显示所有窗口列表。 Ctrl+a+t:time,显示当前时间和系统的平均负载(Load Average,是一段时间内系统的平均负载,这个一段时间一般取1分钟、5分钟、15分钟)。 Ctrl+a+k:kill window,强行关闭当前的window Ctrl+a+[:进入copy mode,在copy mode下可以回滚、搜索、复制就像使用vi一样,常用快捷键有: Ctrl+b:Backward,PageUp Ctrl+f:Forward,PageDown H:High,将光标移至左上角 L:Low,将光标移至左下角 0:移到行首 $:行末 w:forward one word,以字为单位往前移 b:backward one word,以字为单位往后移 Space:第一次按为标记区起点,第二次按为终点 Esc 结束copy mode Ctrl+a+]:paste,把刚刚在 copy mode 选定的内容贴上。 ●tar 命令: 1.命令简介 tar 命令用于将 Linux 的文件和目录创建为档案或将档案还原为文件和目录。此外,tar 也可以在档案中改变文件,或者向档案中加入新的文件。本程序最初的设计目的是将文件备份到磁带上(Tape ARchive),因而得名 tar。 tar 的工作过程主要分为两个步骤,正向是打包与压缩,反向是解压缩与还原。打包指的是将一大堆文件或目录变成一个总的文件,压缩则是将一个大的文件通过一些压缩算法变成一个小文件。反向的解压缩与还原刚好是相反的过程。tar 的压缩与解压缩,用到的主要是 gzip 与 bzip2 命令。 2.命令格式 tar [OPTIONS] [FILE]... 3.选项说明 -A, --catenate, --concatenate 新增文件到已存在的存档 -c,--create 建立新的存档 -C, --directory=DIR 将 tar 的工作目录从当前目录改为指定目录。该选项对顺序敏感,即影响其后的所有选项 -d, --diff, --compare 对比档案与文件系统的差异 --delete 从档案中删除制定的文件 -f, --file=ARCHIVE 指定存档文件 -j, --bzip2 通过 bzip2 命令压缩或解压缩档案 -k, --keep-old-files 还原档案时,保留当前目录下的原有文件不被覆盖 -l, --check-links 如果不是所有链接都被转储,则打印一条消息 -m, --touch 还原文件时,不变更文件的更改时间 -N, --newer, --after-date=DATE 只将较指定日期更新的文件保存到档案中 -O, --to-stdout 将提取的文件名和目录名打印到标准输出 -p, --preserve-permissions, --same-permissions 提取文件时保留文件原来的权限 -P, --absolute-names 创建存档时不移除文件名称前的 / 号 -r, --append 追加文件到档案的末尾 -t, --list 列出档案的内容 -u, --update 添加比档案中文件更新的文件到档案中 -v, --verbose 显示指令执行过程 -W, --verify 向档案写入文件后尝试验证 -x, --extract, --get 从档案提取文件 -z, --gzip, --gunzip, --ungzip 通过 gzip 命令压缩或解压档案 -Z, --compress, --uncompress 通过 compress 指令处理备份文件 --exclude=PATTERN 排除符合指定模式的文件 -?, --help 显示短选项的概要信息并退出 --usage 显示可用选项列表并退出 --version 显示版本和版权信息并退出 4.常用示例 打包 (1)将目录 /home/stud/wang 打包成 lvlv.tgz,同时使用 gzip 进行压缩。 tar –czvf lvlv.tgz /home/stud/wang (2)将目录 /home/stud/wang 打包成 lvlv.tbz2,同时使用 bzip2 进行压缩。 tar –cjvf lvlv.tgz2 /home/stud/wang (3)将指定目录下的目录或文件进行打包。 tar –czvf wang.tar.gz -C /home/stud/ wang 解包 (1)将档案 lvlv.tgz 还原为原目录,同时使用 gzip 进行解压缩。 tar -xzvf lvlv.tgz (2)将档案 lvlv.tbz2 还原为原目录,同时使用 bzip2 进行解压缩。 tar -xjvf lvlv.tbz2 (3)将 lvlv.tgz 解包到指定目录,同时使用 gzip 进行解压缩。 tar -xzvf lvlv.tgz -C DIR 查看 (1)只查看档案的文件列表,不进行解包。 tar -tzvf wang.tar.gz ●cat 命令: 1.简介 cat 命令用于连接文件的内容并打印到标准输出。 2.命令格式 cat [OPTION]... [FILE]... 在没有文件或文件是 - 时,读取标准输入。 3.选项说明 - 从标准输入获取内容 -A, --show-all 等价于选项 -vET,显示文件内所有不可打印的字符 -b, --number-nonblank 和 -n 相似,只不过对于空白行不编号 -e 等价于 -vE -E, --show-ends 在每行结束处显示 $ -n, --number 由 1 开始对所有输出的行数编号 -s, --squeeze-blank 当遇到有连续两行以上的空白行,就代换为一行的空白行 -t 等价于 -vT 选项 -T, --show-tabs 将 TAB 字符显示为 ^I -v, --show-nonprinting 使用 ^ 和 M- 符号,除了 LFD 和 TAB 之外 --help 显示帮助信息并退出 --version 显示版本信息并退出 4.常用示例 (1)查看文件内容。 cat filename (2)将几个文件合并为一个文件。 cat file1 file2 > file (3)从标准输入读取内容并重定向到文件。键入 Ctrl + d 结束输入。 cat > filename (4)把 file1 的文档内容加上行号后重定向到 file2。 cat -n file1 > file2 (5)将文件 file1 和标准输入内容,纵向连接后重定向至文件 file2。 cat file1 - > file2 (6)清空文件内容。 cat /dev/null > file ●cd 命令(builtin): 1.命令简介 cd(Change Directory)命令是 Shell 的内建命令(bash builtin),用来切换工作目录至指定的目录dirname。 其中 dirname 可以是绝对路径或相对路径。若目录名称省略,则变换至使用者的home directory(也就是刚login时所在的目录)。另外,~ 也表示为 home directory 的意思,. 则是表示目前所在的目录,… 则表示目前目录位置的上一层目录。 2.命令格式 cd [-L|-P] [DIR] 3.选项说明 -p 如果要切换到的目标目录是一个符号连接,直接切换到符号连接指向的目标目录 -L 如果要切换的目标目录是一个符号的连接,直接切换到字符连接名代表的目录,而非符号连接所指向的目标目录。 - 当仅使用一个横杠 - 时,当前工作目录将被切换到环境变量 OLDPWD 所表示的目录 -- 两个横杠,当前工作目录将被切换到用户家目录 4.常用示例 (1)回到上一层目录。 cd .. (2)回到根目录。 cd / (3)回到上次使用的目录。 cd – (4)回到用户家目录。 cd ~ # 或 cd -- 注意: (1)登录 Linux 主机后,命令行最左侧[lvlv@echidna ~/code]$中,~ 表示在当前用户的家目录,$ 表示是普通用户权限,# 则表示超级用户权限。echidna 表示当前主机的名称,lvlv 则表示当前登录的用户名称。查看当前主机名称用 hostname 命令。 ●touch 命令: 1.命令简介 touch 命令用于修改文件或者目录的访问时间、内容修改时间和状态更改时间。默认情况,若文件不存在则新建。 2.命令格式 touch [OPTION]... FILE... 3.选项说明 -a 改变档案的访问时间 -c, --no-create 不创建任何文件 -d, --date=STRING 使用指定的时间修改文件时间属性,而非当前时间 -f 不使用,是为了与其他 Unix 系统的相容性而保留 -h, --no-dereference 只改变符号链接的时间属性,而不是链接的文件 -m 改变档案的修改时间 -r, --reference=FILE 使用参考文件的创建时间,而不是当前时间 -t STAMP 指定文件的创建时间而不是当前时间,时间 STAMP 格式与 date 命令相同 --help 显示帮助信息并退出 --version 显示版本信息并退出 4.常用示例 (1)改变文件的时间(最近访问,最近修改和最近改动)为当前系统时间。 touch filename (2)如果目标文件不存在,则新建一个文件 touch filename ●rm 命令: 1.命令简介 rm(remove)命令用于删除文件或者目录。 使用 rm 命令要格外小心,因为一旦删除了一个文件就无法再恢复它,所以在删除文件之前,最好再看一下文件的内容,确定是否要真要删除。 2.命令格式 rm [OPTION]... FILE... 3.选项说明 -d, --dir 删除空目录 -f, --force 忽略不存在的文件和参数,永不提示 -i 在每一次删除文件或目录之前先询问用户是否确定删除,如果不删除则跳过当前文件或者目录 -I 删除超过三个文件或在递归删除时,提示一次。比 -i 提醒程度较松,同时也能防止大多数错误。如果选择不删除,则终止整个操作 --interactive[=WHEN] 提醒的方式根据 WHEN 的取值:never 表示不进行提示,once 等同于 -I 选项,always 等同于 -i 选项。不指定 WHEN 默认为 always --one-file-system 在递归删除层次结构时,跳过与相应命令行参数不同的文件系统上的任何目录 --no-preserve-root 对根目录不做特殊对待 --preserve-root 不删除根目录,为默认选项 -r, -R, --recursive 递归处理,将指定目录下的所有文件与子目录一并删除 -v, --verbose 显示指令的详细执行过程 --help 显示帮助信息 --version 显示版本信息 4.常用示例 (1)删除目录 dir。 rm –r dir (2)删除当前目录下所有文件及目录,不包含点号 . 开头的隐藏文件和目录。 rm -r * (3)删除当前目录下所有隐藏的文件及目录。 rm -rf .* 因为当前目录(.)和上一层目录(…)无法删除,会产生如下错误信息。 rm: refusing to remove ‘.’ or ‘..’ directory: skipping ‘.’ rm: refusing to remove ‘.’ or ‘..’ directory: skipping ‘..’ 如果想丢弃上面的错误信息可以使用如下命令: rm -rf .* 2>/dev/null 该命令表示丢弃标准错误输出。数字 2 是标准错误输出的描述符,/dev/null 是一个特殊的设备文件,即空设备,类似于 Windows 的回收站,主要用于丢弃不需要的输出。注意重定向操作符 > 与两边操作数不能有空格。 ●mv 命令: 1.命令简介 mv (move) 用来移动或改名文件和目录。 移动文件时如果目标文件已经存,则目标文件的内容将被覆盖。 mv 命令可以用来将源文件移至一个目标文件中,或将一组文件移至一个目标目录中。源文件被移至目标文件有两种不同的结果: (1)如果目标文件是目录,源文件会被移到此目录下,且文件名不变。当目标文件是目录时,源文件或目录参数可以有多个,则所有的源文件都会被移至目标目录中。所有移到该目录下的文件都将保留以前的文件名。 (2) 如果目标文件不是目录文件,则源文件名(只能有一个)会变为此目标文件名,并覆盖己存在的同名文件。如果源文件和目标文件在同一个目录下,mv 的作用就是改文件名。 注意: (1) mv 与 cp 的结果不同,mv 像是文件“搬家”,文件个数并未增加。而 cp 对文件进行复制,文件个数增加了。 (2) 尽管其手册没有说明,使用 mv 移动目录时如果目标目录非空将失败。确定安全的情况下,可以使用cp -rf yourdir dst && rm -r yourdir。 2.命令格式 mv [OPTION]... [-T] SOURCE DEST mv [OPTION]... SOURCE... DIRECTORY mv [OPTION]... -t DIRECTORY SOURCE... 3.选项说明 --backup=[=CONTROL] 若需覆盖文件,则覆盖前先行备份 -b 当文件存在时,覆盖前,为其创建一个备份。功能类似于--backup,但是不需要接收参数 -f, --force 若目标文件或目录与现有的文件或目录重复,则直接覆盖现有的文件或目录,不进行提示 -i, --interactive 交互式操作,覆盖前先行询问用户,如果源文件与目标文件或目标目录中的文件同名,则询问用户是否覆盖目标文件。用户输入”y”,表示将覆盖目标文件;输入”n”,表示取消对源文件的移动。这样可以避免误将文件覆盖 -n, --no-clobber 不覆盖现有的同名文件或目录;如果同时指定多个以下选项,-i, -f, -n,则只有最后一个生效 --strip-trailing-slashes 删除参数 SOURCE 中所有目录末端的斜杠 -S, --suffix=SUFFIX 为备份文件指定后缀,而不使用默认的后缀 -t, --target-directory=DIRECTORY 指定源文件要移动到的目标目录 -u, --update 当源文件比目标文件新或者目标文件不存在时,才执行移动操作 -v, --verbose 冗余模式执行 mv,解释 mv 命令的执行过程 --help 显示帮助信息并退出 --version 显示版本信息并退出 4.常用示例 (1)将文件 old 改名为 new。 mv old new (2)将目录 /usr/men 中的所有文件移到当前目录(用.表示)中。 mv /usr/men/* . ●cp 命令: 1.简介 cp 命令主要用于复制文件或目录,可以将一个或多个源文件或者目录复制到指定目的文件或目录。当一次复制多个文件时,目标文件参数必须是一个已经存在的目录,否则将出现错误。 2.命令格式 cp [OPTION]... [-T] SOURCE DEST cp [OPTION]... SOURCE... DIRECTORY cp [OPTION]... -t DIRECTORY SOURCE... 3.选项说明 -a, --archive 此参数的效果和同时指定"-dR --preserve=all"参数相同; --backup[=CONTROL] 备份即将被覆盖的目的文件; -b 等同于 --backup,但不接受参数; --copy-contents 递归拷贝时,拷贝特殊文件的内容; -d 当复制符号连接时,保留符号连接; -f, --force 强行复制文件或目录,不论目标文件或目录是否已存在; -i, --interactive 覆盖既有文件之前先询问用户; -H 遵循源文件中的命令行符号链接; -l, --link 对源文件建立硬连接,而非复制文件; -L, --dereference 总是遵循源文件中的命令行符号链接; -n, --no-clobber 不覆盖既有文件; -P, --no-dereference 不遵循源文件的符号连接; -p 等同于 --preserve=mode,ownership,timestamps; --preserve[=ATTR_LIST] 保留指定的文件属性,而非默认的 mode,ownership,timestamps。其它的属性也可以指定,如 context, links, xattr, all; -c 等同于 --preserve=context; --no-preserve=ATTR_LIST 不保留指定的文件属性; --parents 在目录下使用完整的源文件名; -R, -r, --recursive 递归处理,将指定目录下的所有文件与子目录一并处理; --reflink[=WHEN] 控制克隆/CoW 副本。请查看下面的内容; --remove-destination 移动每一个已经存在的目标文件; --sparse=WHEN 控制创建稀疏文件; --strip-trailing-slashes 删除参数SOURCE中所有目录末端的斜杠; -s, --symbolic-link 对源文件建立符号连接,而非复制文件; -S, --suffix=SUFFIX 在备份文件时,用指定的后缀“SUFFIX”代替文件的默认后缀; -t, --target-directory=DIRECTORY 拷贝所有 SOURCE 指定的文件到目标目录 DIRECTORY; -T, --no-target-directory 没有目标目录,将目标文件DEST视为正常文件; -u, --update 使用这项参数后只会在源文件的更改时间较目标文件新时或是名称相互对应的目标文件并不存在时,才复制文件; -v, --verbose 冗余模式执行cp命令,解释cp的执行过程。 -x, --one-file-system 保留在当前的文件系统上。 -Z, --context=CONTEXT 将指定的文本内容变为安全的内容,该选项仅限于 SELinux 内核使用。 --help 显示帮助信息。 --version 显示版本信息。 选项补充说明。 (1)默认情况下,源文件的稀疏性仅仅通过简单的方法判断,对应的目标文件目标文件也被为稀疏。这是因为默认情况下使用了--sparse=auto 参数。如果明确使用 --sparse=always 参数则不论源文件是否包含足够长的0 序列也将目标文件创文 建为稀疏件。使用--sparse=never 参数禁止创建稀疏文件。 (2)当指定了--reflink[=always]参数时,执行轻量化的复制,即只在数据块被修改的情况下才复制。如果复制失败或者同时指定了--reflink=auto,则返回标准复制模式。 (3)备份文件的后缀为"~",除非以--suffix选项或是SIMPLE_BACKUP_SUFFIX环境变量指定。版本控制的方式可通过--backup选项或VERSION_CONTROL环境变量来选择。以下是可用的变量值: none, off:不进行备份(即使使用了–backup 选项); numbered, t:备份文件加上数字进行排序; existing, nil:若有数字的备份文件已经存在则使用数字,否则使用普通方式备份; simple, never:永远使用普通方式备份。 (4)有一个特别情况,如果同时指定--force和--backup选项,而源文件和目标文件是同一个已存在的一般文件的话,cp会将源文件备份。 4.常用示例 (1)复制 dir 目录到 dir2。 cp -r dir dir2 (2)复制文件 a、b、c、d 到 dir2。 cp a b c d dir2 (3)交互式地将目录 /usr/men 中的以 m 打头的所有 .c 文件复制到目录 /usr/zh 中。 cp -i /usr/men m*.c /usr/zh 我们在 Linux 下使用 cp 命令复制文件时候,有时候会需要覆盖一些同名文件,覆盖文件的时候都会有提示:需要不停的按 Y 来确定执行覆盖。 ●rename 命令: 1.命令简介 功能类似于 mv,可实现文件或者目录的重命名。mv 不能批量处理,而 rename 可以。 2.命令格式 rename [OPTIONS] EXPRESSION REPLACEMENT FILE... EXPRESSION:原字符串,即文件名需要替换的字符串; REPLACEMENT :目标字符串,将文件名中含有的原字符替换成目标字符串; FILE…:指定要改变文件名的文件列表。 rename 支持的通配符: ? 可替代单个字符 * 可替代多个字符 [charset] 可替代charset集中的任意单个字符 3.选项说明 -s, --symlink 不要重命名符号链接,而是重命名它的目标 -v, --verbose 以冗余模式运行,显示哪些文件已被重命名 -o, --no-overwrite 不要覆盖现有文件 -i, --interactive 更名前询问是否确定 -h, --help 显示帮助信息并退出 -V, --version 显示版本信息 4.常用示例 (1)重命名文件 lvlv 为 lala。 rename v a lv?? (2)将当前目录下的所有文件的后缀名由 .html 改为 .php。 rename .html .php * ●echo 命令: 1.简介 echo 命令用于在 Shell 中打印 Shell 变量的值,或者直接输出指定的字符串。 2.命令格式 echo [选项] [参数] 3.选项说明 -n 输出时,不在行尾添加换行符 -e 使反斜杠的转义功能生效 -E 禁用反斜杠的转义功能,为默认选项 --help 显示帮助信息并退出 --version 显示版本信息并退出 使用 -e 选项时,若字符串中出现以下字符,则特别加以处理,而不会将它当成一般文字输出: \\:反斜杠; \a:发出警告声; \b:删除前一个字符; \c:截断不输出\c后面的内容; \f:换行,但光标仍旧停留在原来的位置; \n:换行且光标移至行首; \r:光标移至行首,但不换行; \t:插入tab; \v:与\f相同; \nnn:插入nnn(八进制)所代表的ASCII字符; \xHH:插入HH(十六进制)所代表的ASCII字符; 4.常用示例 (1)不换行输出。 echo默认换行输出,使echo不换行输出有两种方法。 方法一:使用命令选项-n禁止输出换行符。 echo -n what you want to output **方法二:**使用命令选项 -e 让echo识别转义字符\c,echo默认是不识别转义字符的。转义字符\c使用man echo查看echo的使用手册,其意思是produce no further output,表示截断不输出\c后面的内容。 echo -e lalalala\cend #输出:lalalala (2)使用echo打印带有颜色的字体。 Linux终端下输出带颜色的文字只需在文字前面添加如下格式: \033[显示方式;前景色;背景色m 其中\033是ESC健的八进制,\033[即告诉终端后面是设置颜色的参数,显示方式,前景色,背景色均是数字。数字含义如下: 显示方式 意义 0 终端默认设置 1 高亮显示 4 使用下划线 5 闪烁 7 反白显示 8 不可见 颜色数字代号如下: 前景色 背景色 颜色 30 40 黑色 31 41 红色 32 42 绿色 33 43 黃色 34 44 蓝色 35 45 紫红色 36 46 青蓝色 37 47 白色 (a)显示红色字体: ``` echo -e "\e[1;31mThis is red text\e[0m" ``` 输出: This is red text 其中,\e[0m表示恢复终端默认设置。 (b)显示绿色背景字体: echo -e "\e[1;42mGreed Background\e[0m" Greed Background 输出: 这里写图片描述 (c)文字闪动。使用前景色31(红色),背景色42(绿色)闪动: echo -e "\033[5;31;42mMySQL Server Stop...\033[0m" ●tee 命令: 1.命令简介 tee 命令从标准输入读取数据后,将数据重定向到给定的文件和标准输出。给定的文件可以有多个。 因为 tee 意为字母 T,数据从左边(标准输入)流入,从右边(标准输出)和下面(文件)分流输出,字母 T 的形状很形象地说明了数据的流向,故将该命令命名为 tee。数据流向过程如下图所示。 ls -l |tee file.txt| less stdout -----------------> stdout | v file.txt 2.命令格式 tee [OPTION]... [FILE]... 3.选项说明 -a, --append 向文件中重定向时使用追加模式 -i, --ignore-interrupts 忽略中断(interrupt)信号 --help 显示帮助信息并退出 --version 显示版本信息并退出 4.常用示例 (1)标准错误输出和标准输出同时输出到屏幕和指定文件 file1 与 file2。 make 2>&1 | tee file1 file2 2>&1 表示将标准错误输出重定向到标准输出;tee 表示将命令结果同时输出到屏幕和文件。 ●ls 命令: 1.简介 ls(list)命令用来显示目录内容或文件信息,使用率较高。ls 命令的输出信息可以进行彩色加亮显示,以区分不同类型的文件。 2.命令格式 ls [OPTION]... [FILE]... 3.选项说明 -a, --all 显示所有档案及目录(ls内定将档案名或目录名称以“.”开头的文件视为影藏文件,默认不会列出); -A, --almost-all 显示除影藏文件“.”和“..”以外的所有文件列表 --author 与 -l 选项结合使用,打印出每一个文件的作者 -b, --escape 将文件中的不可输出的字符以反斜线“\”加字符编码的方式输出; --block-size=SIZE 指定文件大小的统计单位。SIZE 可以取如下字符串,或对应的数值: KB 1000, K 1024, MB 1000*1000, M 1024*1024,以及G, T, P, E, Z, Y等 -B, --ignore-backups 不要列出以~结尾的隐含条目,默认列出; -c 与“-l”选项连用时,展示 ctime;与“-lt”选项连用时,输出按照文件状态改变时间排序,排序的依据是文件的索引节点中的ctime字段 -C 多列显示输出结果。这是默认选项 --color[=WHEN] 使用不同的颜色高亮显示不同类型文件,WHEN的默认取值为'always',也可以是'never'或'auto'; -d, --directory 仅显示目录名,而不显示目录下的内容列表。显示符号链接文件本身,而不显示其所指向的目录或文件; -D, --dired 以Emacs的dired模式输出 -f 此参数的效果和同时指定“aU”参数相同,并关闭“-ls --color”参数效果 -F, --classify 在每个输出项后追加文件的类型标识符,具体含义:“*”表示具有可执行权限的普通文件,“/”表示目录,“@”表示符号链接,“|”表示命令管道FIFO,“=”表示sockets套接字。当文件为普通文件时,不输出任何标识符 --file-type 与 -F 选项功能相同,但是不显示 * --format=WORD WORD 可取值为 across,等价于 -x 选项。取值为 commas,等价于 -m。取值为horizontal,等价于-x。取值为long,等价于-l。取值为single-column,等价于-1。取值为verbose,等价于-l。取值为vertical,等价于-C --full-time 列出完整的日期与时间 -g 类似于 -l,但不列出所属者 --group-directories-first 目录排在文件之前列出 -G, --no-group 在长格式(-l)输出时,不输出组名 -h, --human-readable 以可读方式显示文件大小 --si 以 1000 代替 1024 计算文件大小 -H, --dereference-command-line 使用命令列中的符号链接指示的真正目的地 --dereference-command-line-symlink-to-dir 遵循命令行中列出的符号链接 --hide=PATTERN 不列出符合 PATTERN 模型的隐藏文件 --indicator-style=WORD 追加指示符 WORD 到每一个文件或目录名称后,none默认 slash (-p), file-type (--file-type), classify (-F); -i, --inode 显示文件索引节点号(inode)。一个索引节点代表一个文件 -I, --ignore=PATTERN 不列出匹配 PATTERN 的文件或目录名 -k 以 KB 为单位显示文件大小,类似于 --block-size=1K -1 数字 1,与“-C”选项功能相反,所有输出信息用单列格式输出,不输出为多列; -l 以长格式显示目录下的内容列表。输出的信息从左到右依次包括文件类型、权限模式、硬链接数、所有者、组、文件大小、文件的最后修改时间和文件/目录名; -L, --dereference 如果遇到性质为符号链接的文件或目录,直接列出该链接所指向的原始文件或目录; -m 用逗号区隔每个文件和目录的名称 -n 以用户识别码和群组识别码替代其名称 -N, --literal 直接列出文件和目录名称,包括控制字符 -o 此参数的效果类似于 -l,但不列出用户组信息 -p, --indicator-style=SLASH 追加指定指示符到文件或目录后,SLASH 可取值 none、slash、file-type 或 classify -q, --hide-control-chars 用 ? 号取代控制字符,列出文件和目录名称 --show-control-chars 显示文件和目录名称中的控制字符 -Q, --quote-name 把文件和目录名称以双引号“”标示起来; --quoting-style=WORD 使用指定的引号模式来标识档案名称,WORD的取值有:literal, locale, shell, shell-always, c, escape; -r, --reverse 反序排列 -R, --recursive 递归处理,将指定目录下的所有文件及子目录一并处理 -s, --size 显示文件和目录的大小,以区块为单位 -S 以文件大小进行排序,最大的第一个 --sort=WORD 以指定的内容进行排序,而非默认的档案名称,WORD可取值:none(不排序,等于-U);extension(以条目名的最后一个扩展名排序,等于-X);size(以用条目大小排序,等于-S);time(以条目内容最后被修改时间排序,等于-t);version(以条目版本进行排序,等于-v); --time=WORD 当使用-t或--sort=time来按照时间排序时,WORD可取值为atime、access、use(表示使用访问时间排序);或者ctime、status(状态改变时间排序),来取代默认以内容修改时间排序; --time-style=STYLE:使用-l选项时,显示时间使用指定的样式风格STYLE,可取值为full-iso,long-iso,iso,locale,还有+FORMAT,FORMAT,这两项设置格式可以参考date命令的设置方法; -t 用文件和目录的内容修改时间排序; -T, --tabsize=COLS 设置每一列之间的Tab间隔符代表的宽度为COLS,默认为8个空格; -u 与 -lt 同用,表示使用访问时间排序,与-l同用,显示访问时间而非内容修改时间; -U 列出文件和目录名称时不予排序; -v 文件和目录的名称列表以版本进行排序 -w, --width=COLS 设置每列的最大字符数为 COLS -x 以从左到右,由上至下的横列方式显示文件和目录名称 -X 以文件和目录的最后一个扩展名排序 --help 显示帮助信息 --version 显示版本信息 4.常用示例 (1)以长格式显示隐藏文件,包括当前目录和父级目录。 [dablelv@TENCENT64 ~]$ ll -a total 148 drwxr-x--- 8 dablelv dablelv 4096 Nov 23 23:56 . drwxr-xr-x 22 root root 4096 Jun 7 15:15 .. -rw------- 1 dablelv dablelv 71812 Nov 24 00:38 .bash_history -rw-r--r-- 1 dablelv dablelv 2153 May 2 2017 .bash_profile -rw------- 1 dablelv dablelv 595 Nov 24 16:57 .lesshst drwx------ 2 dablelv dablelv 4096 Jul 23 20:42 .ssh 第一列:文件类型与权限; 第二列:硬链接数; 第三列:属主; 第四列:文件属组,注意不是属主所在的用户组; 第五列:大小,单位为字节; 第六列:创建或最后的内容修改时间; 第七列:文件名或目录名。 输出结构示意图如下: 有多少文件名连接到此 容量默认单位 bytes(字节) 索引节点(i-node) ^ ^ | | | d rwxr-xr-x 1 root root 4096 Jul 18 08:56 /home 文件类型 权限 属主 属组 创建或修改文档 文档路径名 内容的时间 实际上 ll 是ls -l的别称,使用 alias 命令可以查看相关命令的别称。 [dablelv@TENCENT64 ~]$ alias alias l.='ls -d .* --color=auto' alias ll='ls -l --color=auto' alias ls='ls --color=auto' alias vi='vim' alias which='alias | /usr/bin/which --tty-only --read-alias --show-dot --show-tilde' (2)以指定的文件大小类型展示。 [dablelv@TENCENT64 ~]$ ll --block-size=K total 24K drwxrwxr-x 10 dablelv dablelv 4K Nov 21 15:08 code_root -rwxrwxr-x 1 dablelv dablelv 1K Nov 21 00:18 dable.php -rw-rw-r-- 1 dablelv dablelv 1K Nov 21 00:18 dablelala.php -rw-rw-r-- 1 dablelv dablelv 0K Nov 23 23:56 dablelv~ -rw-rw-r-- 1 dablelv dablelv 1K Nov 21 00:40 dablenewnew drwxrwxrwx 2 dablelv dablelv 4K Nov 21 00:29 new drwxrwxr-x 6 dablelv dablelv 4K Nov 21 00:24 test (3)ls 命令按照修改日期递减排序 ls -t 1 如果想按照修改日期递增的话使用ls -rt 就行了。 (4)ls 命令按照文件大小递减排序。 # 递减排序 ls -Sh # 递增排序 ls -Shr ●scp 命令: 1.命令简介 scp(secure copy)命令是一个基于 SSH 安全的进行远程文件拷贝命令,用于在 Linux 下远程拷贝文件,和它类似的命令有 cp,不过 cp 只是在本机进行拷贝不能跨服务器,而且 scp 支持对传输的数据进行加密。 2.命令格式 scp [-1246BCpqrv] [-c cipher] [-F ssh_config] [-i identity_file] [-l limit] [-o ssh_option] [-P port] [-S program] [[user@]host1:]file1 ... [[user@]host2:]file2 3.选项说明 -1 使用 SSH 协议版本 1 -2 使用 SSH 协议版本 2 -4 使用 ipv4 -6 使用 ipv6 -B 以批处理模式运行,阻止 scp 询问口令 -C 使用压缩,将 -C 标志传递给 SSH,从而打开压缩功能 -c CIPHER 使用指定的秘钥对传输的文件进行加密 -F SSH_CONFIG 指定 SSH 配置文件 -i IDENTITY_FILE 从指定文件中读取传输时使用的密钥,此参数直接传递给 ssh -l LIMIT 指定宽带限制 -o SSH_OPTION 指定使用的 ssh 选项,可以使用 SSH_CONFIG 中使用的 ssh 选项 -P PORT 指定远程主机的端口号 -p 保留文件的最后修改时间,最后访问时间和权限模式 -q 静默模式,不显示复制进度以及来自 ssh 的警告和诊断消息 -r 以递归方式复制整个目录 -S PROGRAM 指定加密传输时所使用的程序。此程序必须能够理解 ssh 的选项 -v 使用冗余模式,使 scp 和 ssh 打印调试信息以及进度 注意事项: (1)scp 返回 0 成功,>0 失败; (2)使用 scp 在不同主机之间进行文件传输,需要确保两台设备都开启了ssh远程登录服务,且两台设备能互相通信; (3)使用 scp 命令要确保使用的用户具有可读取远程服务器相应文件的权限,否则scp 命令无法起作用。 4.常用示例 (1)远程主机之间,使用 scp 拷贝多个文件。 方法一:将多个文件放在同一个目录中,使用scp -r来拷贝,参考如下代码: scp -r uername@sourceHostName:sourcedir username@destinationHostName:destinationdir 方法二:将多个文件或者目录使用tar打包后作为单个文件传输。 方法三:scp支持同时拷贝多个文件的功能。 scp file1 file2 remote_username@remote_ip:remote_folder (2)从本地复制文件到远程。 命令格式: scp local_file remote_username@remote_ip:remote_folder # 或 scp local_file remote_username@remote_ip:remote_file # 或 scp local_file remote_ip:remote_folder # 或 scp local_file remote_ip:remote_file 第1,2个指定了用户名,命令执行后需要再输入密码,第1个仅指定了远程的目录,文件名字不变,第2个指定了文件名; 第3,4个没有指定用户名,命令执行后需要输入用户名和密码,第3个仅指定了远程的目录,文件名字不变,第4个指定了文件名。 应用实例: scp /home/space/music/1.mp3 root@www.runoob.com:/home/root/others/music scp /home/space/music/1.mp3 root@www.runoob.com:/home/root/others/music/001.mp3 scp /home/space/music/1.mp3 www.runoob.com:/home/root/others/music scp /home/space/music/1.mp3 www.runoob.com:/home/root/others/music/001.mp3 (3)使用 scp 复制目录。 命令格式: scp -r local_folder remote_username@remote_ip:remote_folder # 或 scp -r local_folder remote_ip:remote_folder 第 1 个指定了用户名,命令执行后需要再输入密码; 第 2 个没有指定用户名,命令执行后需要输入用户名和密码。 应用实例: scp -r /home/space/music/ root@www.runoob.com:/home/root/others/ scp -r /home/space/music/ www.runoob.com:/home/root/others/ 上面命令将本地 music 目录复制到远程 others 目录下。 (4)从远程复制到本地。 从远程复制到本地,只要将从本地复制到远程的命令的后2个参数调换顺序即可,如下实例 应用实例: scp root@www.runoob.com:/home/root/others/music /home/space/music/1.mp3 scp -r www.runoob.com:/home/root/others/ /home/space/music/ **说明:**如果远程服务器防火墙有为scp命令设置了指定的端口,我们需要使用 -P 参数来设置命令的端口号,命令格式如下: #scp 命令使用端口号 4588 scp -P 4588 remote@www.runoob.com:/usr/local/sin.sh /home/administrator (5)使用 expect 和 scp 实现不同主机之间文件的自动传输。 脚本如下: #!/usr/bin/expect set timeout 5 spawn scp dablelv@172.25.44.22:/yourpath/yourfile root@10.130.89.104:/destinationpath expect "dablelv@172.25.44.22's password:" send "123456\n" expect "root@10.130.89.104's password:" send "123456\n" interact eof 脚本解释: 第一行:#!/usr/bin/expect 指明该脚本由expect来解析。这里的expect其实和linux下的bash、Windows下的cmd.exe是一类东西,都是可执行程序,也可用于脚本的解析器。expect的主要作用是解析自动交互的脚本,比如实现ssh的自动登录,无需手动输入密码等。 第二行:set timeout 5 用于设置expect的expect命令的等待时间为5秒,如果expect等待的值在5秒内没有出现在标准输出,那么expect脚本继续执行。expect的默认timeout为10s。 第三行:spawn scp dablelv@172.25.44.22:/yourpath/yourfile 。spawn是expect的内置命令,不是Linux可执行程序,使用which spawn 是查不到spawn所在路径的。这个就好比cd是shell的内建命令,离开shell,就无法执行cd一样。 它主要的功能是给ssh运行进程加个壳,用来传递交互指令。 它主要的功能是给后面需要执行的命令加个壳,用来传递交互指令。 第四行:expect "dablelv@172.25.44.22's password:" expect命令也是expect的内建命令,其作用就是等待标准输出出现指定的值,如果有则立即返回,向下执行;否则就一直等待,等待的最长时间由上面的set timeout来指定。 第五行:send "123456\n"就是在expect等待到指定的值之后向标准输出发送的值,这里就是执行交互动作,与手工输入密码的动作等效。效果上跟用户手动在终端上输入123456之后敲一个回车一样。 第六、七行实现的功能同第五六行,因为scp需要登录到两个主机实现文件的网络传输,所以这里是登录第二台主机需要输入的密码。 第八行:interact eof 表示expect脚本执行结束。执行完成上述命令后,此时Expect会把控制权交给控制台,这个时候就变回手工操作。如果是使用ssh登录其它主机的话,需要保持在交互状态,那么此时需要interact,如果没有这一句登录完成后会立刻退出,而不是留在远程终端上。如果你只是登录过去执行一段命令就退出,可将其改为expect eof。 如果出现 ": no such file or directory 这样的错误,很可能是因为在本地Windows环境编辑,上传到Linux下执行因文件格式不同导致的,可使用vi或者vim在末行模式使用:set ff来查看文件格式,如果是dos格式的话,那么需要使用:set ff=unix 来改变文件格式。 ●find 命令: 1.命令简介 find 命令用于在指定目录查找文件,可以指定一些匹配条件,如按文件名、文件类型、文件属主甚至是时间戳来查找文件,默认递归查找。 2.命令格式 find [-H] [-L] [-P] [-D debugopts] [-Olevel] [path...] [expression] (1)基本命令选项-H、-L、和-P控制着对符号链接的处理方式; (2)如果没有给定搜索路径 [path…],则默认为当前目录; (3)如果没有给定表达式 [expression],则默认为-print,将匹配的文件输出到标准输出。 其实[-H] [-L] [-P] [-D debugopts] [-Olevel]这几个选项并不常用,expression 可以拆解为"-options -test -action",将在第四节详细介绍。 3.选项说明 -P 永远不跟随符号链接。这是默认行为。当发现待查询的文件是一个符号链接,使用的信息应采取的符号链接本身的性质 -L 跟随符号链接,当发现检验或打印信息的文件是一个符号链接,使用的信息应采取的符号链接对应的文件。使用此选项意味着-noleaf,当后面使用-P时,-noleaf仍然有效; -H 不跟随符号链接,除了在处理命令行参数。当发现检验或打印文件有关的信息,这些信息必须是符号链接本身的性质,唯一例外是指定的命令行参数是一个文件符号链接,则使用链接的文件。当-H生效时,命令行的参数有一个指向目录的符号链接,该目录内容将被检查,当然选项`-maxdepth 0`将会阻止这个操作; -D DEBUGOPTIONS 使 find 打印诊断信息,使用时debug选项使用逗号分隔,可以使用"find -D help"查看完整有效的debug选项,有效的有: help:解释debug选项; tree:以原始优化的方式显示表达式树; stat:打印文件使用stat和lstat命令显示的信息; opt:打印与表达式树优化有关的诊断信息; rates:打印动作执行成功和失败次数的总体信息; -OLEVEL 启动查询优化,对执行动作重新排序来加速整体效果,优化等级有 0、1、2、3 四个级别 注意:如果 -P、-L、-H 同时指定,以最后一个为准。 4.命令表达式(expression) find 命令表达式可以分为三类: 一是普通选项(options),总是真,在其它表达式前指定,设置搜索路径的深度、查看帮助、版本信息等; 二是比较测试(tests),给定find查找满足特定条件的文件; 三是动作(actions),对查找到的文件,执行指定的操作。 对于多个表达式,find 从左向右处理,所以表达式的前后顺序不同会有不同的搜索性能。 find 首先对整个命令行进行语法解析,并应用给定的options,然后定位到搜索路径path下开始对路径下的文件或子目录进行表达式评估或测试(test),评估或测试的过程是按照表达式的顺序从左向右进行(此处不考虑操作符的影响),如果最终表达式评估结果为true,则输出该文件全路径名。 对于 find 来说,一个非常重要的概念:find的搜索机制是根据表达式返回的 true/false 决定的,每搜索一次都判断一次是否能确定最终评估结果为true,只有评估的最终结果为 true 才算找到,并切入到下一个搜索点。 4.1 表达式操作符(operators) 操作符控制表达式运算方式。确切地说,是控制 expression 中的 options/tests/actions 的运算方式,无论是options、tests还是actions,它们都可以给定多个,例如: find /tmp -maxdepth 3 -mindepth 1 -type f -name "*.log" -exec ls '{}' \; -print 该find中给定了两个option(-maxdepth 3 -mindepth 1),两个test(-type f -name "*.log"),两个action(-exec ls '{}' \; -print),它们之间从前向后按顺序进行评估,所以如果想要改变运算逻辑,需要使用操作符来控制。 注意,理解and和or的评估方式非常重要,写在and或or后面的表达式很可能不起作用,而导致跟预期结果不一样。 下面的操作符优先级从高到低。 ( expr ) :优先级最高。为防止括号被shell解释(进入子shell),所以需要转义,即\(...\)。 ! expr :对expr的true和false结果取反。同样需要使用引号包围。 -not expr :等价于"! expr"。 expr1 expr2 :等同于and操作符。 expr1 -a expr2 :等同于and操作符。 expr1 -and expr2 :首先要求expr1为true,然后expr2以expr1搜索的结果为基础继续检测,然后再返回检测值为true的文件。因为expr2是以expr1结果为基础的,所以如果expr1返回false,则expr2直接被忽略而不会进行任何操作。 expr1 -o expr2 :等同于or操作符。 expr1 -or expr2 :expr1返回true或false都不影响expr2的检测,它们是独立的。如果expr1返回true,则独立输出该结果,然后开始评测expr2。所以既返回expr1为ture的,也返回expr2为true的文件,但两者同名的文件只返回一次。 expr1 , expr2 :逗号操作符表示列表的意思,expr1和expr2都会被评估,但expr1的true或false是被无视的,只有expr2的结果才是最终状态值。 关于and和or操作符,一定要知道and后表达式操作的对象是前表达式的结果,而or操作符则不是。例如: find /tmp -type f -name "*.log" 它是一个and操作符,-name表达式是在-type筛选的结果基础上再匹配文件名的。但如果是: find /tmp -type f -o -name "*.log" 则-name操作的对象是/tmp,所以返回结果中即有任意普通文件,也有任意log文件,但两者同名的文件只返回一次。 总之,要明确的是or操作符不以前面结果为基础,且or前面表达式为true的结果也会输出。 4.2 表达式说明 (1)普通选项。 -d:等同于-depth,为了与FreeBSD, NetBSD, MacOS X and OpenBSD进行兼容; --daystart:从本日开始计算时间,在使用(-amin、-atime、-cmin、-mmin和-mtime)选项时,时间从当前开始,而非24小时前; -depth:查找文件时,首先查找当前目录中的文件,然后再在其子目录中查找; -follow:该选项已经废弃,请使用-L; -help, --help:显示find基本用法; -ignore_readdir_race:默认情况下,find无法获取文件状态时,将发出错误信息。使用该选项后,将不会报错; -maxdepth [levels]:设置最大搜索目录层级; -mindepth [levels]:设置最小搜索目录层级; -mount:查找文件时不跨越文件系统mount位置,同-xdev; -noignore_readdir_race:与-ignore_readdir_race作用相反,为默认选项; -noleaf:不去考虑目录至少需拥有两个硬连接存在; -regextype [type]:指明正则表达式语法规则; -version, --version:打印版本信息; -warn:打开警告; -nowarn:关闭警告; -xautofs:查找文件时不在autofs文件系统查询; -xdev:作用同-mount; (2)比较测试。 +n:大于指定的n; -n:小于指定的n; n:等于指定的n; -amin [n]:文件最后访问时间为n分钟之前; -anewer [file]:待查找的目标文件最后访问时间要比指定文件file的最后修改时间要新; -ctime [n]:文件状态改变时间在n*24小时之前; -empty:寻找文件大小为0 Byte的文件或目录下没有任何子目录或文件的空目录; -executable:寻找可执行文件与可搜索的目录; -false:将find指令的返回值皆设为false; -fstype [type]:只寻找指定文件系统类型下的文件或目录; -gid [n]:文件所属用户组ID为n; -group [gname]:文件所属用户组名为gname; -ilname [pattern]:与-lname作用相似,但匹配时忽略大小写; -iname [pattern]:与-name作用相似,但匹配是忽略大小写。比如匹配模式是"fo*" -inum [n]:查找文件inode节点号为n; -ipath [pattern]:作用同-iwholename,该命令选项已被废弃,所以请不要使用它; -iregex [pattern]:与-regex作用相同,但忽略大小写; -iwholename [pattern]:作用与-iwholename相似,但忽略大小写; -links [n]:文件有n个硬连接; -lname [pattern]:查找符号链接,所指文件内容符合指定模式pattern; -mmin n:查找在指定时间前被更改过的文件或目录,单位以分钟计算; -mtime n:查找指定时间前被更改过的文件或目录,单位以天(24h)计算; -name [pattern]:指定名称的文件或目录, -newer [file]:查找最后修改时间比指定文件file还要新的文件; -newerXY [reference]:比指定的文件或者时间[reference]要新的文件,X和Y是占位符,可取值如下: a:reference的访问时间; B:reference的创建时间; c:reference的inode状态改变时间; m:reference的修改时间; t:reference为直接指定的时间。 -nogroup:查无有效属组的文件文件或目录,即文件的属组在/etc/groups中不存在; -nouser:查无有效属主的文件,即文件的属主在/etc/passwd中不存; -path [pattern]:查找指定目录格式的文件或目录,如此可以避免对整个目录进行查找,比如 find . -path "./src/*sc"可以避免对目录./inc/的查找; -perm [mode]:查找指定的权限的文件或目录,需要完全匹配; -perm -[mode]:查找指定权限的文件或目录,不需要完全匹配,注意与不加横杠mode的区别; -perm /[mode]:查找指定权限的文件或目录,不需要完全匹配,不需要每个类型的用户都满足,注意与mode、-[mode]的区别; -readable:查找拥有可读权限的文件或目录; -regex [pattern]:文件名称匹配正则表达式pattern; -samefile [name]:查找inode名称为[name]的文件; -size n[cwbkMG]:查找指定大小的文件; -true:将find指令的返回值皆设为false; -type [c]:查找指定类型的文件,类型c可取值: b - 块设备文件。 c - 字符设备文件。 d - 目录。 f - 普通文件 l - 符号链接文件。 p - 管道文件。 s - socket。 -uid [n]:查找用户ID为n的文件; -used [n]:查找文件或目录状态改变过之后,在n天内被访问过的文件或目录; -user [uname]:查找符和指定所有者名称的文件或目录; -wholename [pattern]:等同于-path; -writable:具有可写权限的文件。它会考虑访问控制列表(access control lists)等的特殊权限,只要是可写就满足。它会忽略掉-perm的测试(不是writeable); -xtype [c]:等同于-type选项,除非文件是符号链接;当制定选项-P或-H时,连接文件所指文件类型是[c]则满足条件,如果指定选项-L,[c]为l才有效,表名查找符号链接; -context [pattern]: (3)动作选项。 actions部分一般是执行某些命令,或实现某些功能。这部分是 find 的 command line 部分。 -delete:删除文件,如果删除成功则返回true,如果删除失败,将给出错误信息。"-delete"动作隐含了"-depth"这个option。 -exec [command] ;:注意有个分号";"结尾,该action是用于执行给定的命令。如果命令的返回状态码为0则该action返回true,command后面的所有内容都被当作command的参数,直到分号";"为止,其中参数部分使用字符串"{}"时,它表示find找到的文件名,即在执行命令时,"{}"会被逐一替换为find到的文件名,"{}"可以出现在参数中的任何位置,只要出现,它都会被文件名替换。注意,分号";"需要转义,即"\;",如有需要,可以将"{}"用引号包围起来。 -exec command {} +:这种-exec动作变种,只允许使用find查找到的文件一次; -execdir command ;:与-exec相似,区别在于执行command时的working path是从匹配到的文件的所在目录; -execdir command {} +:与-exec command {} +相似,区别也是在于命令的工作路径; -fls [file]:总是返回true,将打印的结果输出到指定的文件file中; -fprint [file]:总是返回true,将找到的文件的全路径输出到指定的文件file中; -fprint0 [file]:类似于-print0,将结果写入文件file; -fprintf [file] [format]:类似于-printf,将结果写入指定的文件file; -ls:总是返回true。将找到的文件以"ls -dils"的格式打印出来,其中文件的size部分以KB为单位; -ok [command] ;:类似于-exec,但在执行命令前会交互式进行询问; -okdir [command] ;:类似于-execdir,但在执行命令前会交互式进行询问; -print:总是返回true。这是默认的action,输出搜索到文件的全路径名,并尾随换行符"\n"。由于在使用"-print"时所有的结果都有换行符,如果直接将结果通过管道传递给管道右边的程序,应该要考虑到这一点:文件名中有空白字符(换行符、制表符、空格)将会被右边程序误分解,如文件"ab c.txt"将被认为是ab和c.txt两个文件,如不想被此分解影响,可考虑使用"-print0"替代"-print"将所有换行符替换为"\0"; -print0:总是返回true。输出搜索到文件的全路径名,并尾随空字符"\0"。由于尾随的是空字符,所以管道传递给右边的程序,然后只需对这个空字符进行识别分隔就能保证文件名不会因为其中的空白字符被误分解; -printf [format]:以指定的格式输出匹配的文件名; -prune:使用这一选项可以使find命令不在当前指定的目录中查找,如果同时使用-depth选项,那么-prune将被find命令忽略。比如:find /apps -path "/apps/bin" -prune -o –print在/apps目录下查找文件,但不希望在/apps/bin目录下查找; -quit:立即退出,没有子进程会继续运作,但没有更多的路径,在命令行中指定将被处理; 5.常用示例 (1)在/logs目录中查找更改时间在5日以前的文件并删除它们。 find /logs -type f -mtime +5 -exec rm {} ; (2)列出当前目录及子目录下所有文件和文件夹。 find . (3)在/home目录下查找以.txt结尾的文件名。 find /home -name "*.txt" #同上,但忽略大小写 find /home -iname "*.txt" (4)当前目录及子目录下查找所有以.txt和.pdf结尾的文件。 find . \( -name "*.txt" -o -name "*.pdf" \) #或 find . -name "*.txt" -o -name "*.pdf" (5)匹配文件路径或者文件。 find /usr/ -path "*local*" (6)基于正则表达式匹配文件路径。 find . -regex ".*\(\.txt\|\.pdf\)$" #同上,但忽略大小写 find . -iregex ".*\(\.txt\|\.pdf\)$" (7)使用否定参数!,找出/home下不是以.txt结尾的文件。 find /home ! -name "*.txt" (8)根据文件类型进行搜索。 find . -type [类型参数] 类型参数列表: c - 字符设备文件。 d - 目录。 f - 普通文件 l - 符号链接文件。 p - 管道文件。 s - socket。 (9)向下搜索的最大深度限制为3。 find . -maxdepth 3 -type f (10)搜索出深度距离当前目录至少2个子目录的所有文件。 find . -mindepth 2 -type f (11)根据文件时间戳进行搜索,搜索恰好在七天前被访问过的所有文件。 find . -type f -atime 7 (12)搜索超过七天内被访问过的所有文件。 find . -type f -atime +7 (13)搜索访问时间超过10分钟的所有文件。 find . -type f -amin +10 (14)找出比file.log修改时间更长的所有文件。find find . -type f -newer file.log (15)根据文件大小进行匹配。 find . -type f -size 文件大小 单元文件大小单元: b —— 块(512字节) c —— 字节 w —— 字(2字节) k —— 千字节 M —— 兆字节 G —— 吉字节 #搜索大于10KB的文件 find . -type f -size +10k #搜索小于10KB的文件 find . -type f -size -10k #搜索等于10KB的文件 find . -type f -size 10k (16)删除匹配文件,#删除当前目录下所有.txt文件。 find . -type f -name "*.txt" -delete (17)根据文件权限/所有权进行匹配。 #当前目录下搜索出权限为777的文件 find . -type f -perm 777 #找出当前目录下权限不是644的php文件 find . -type f -name "*.php" ! -perm 644 #找出当前目录用户tom拥有的所有文件 find . -type f -user tom #找出当前目录用户组sunk拥有的所有文件 #find . -type f -group sunk (18)借助-exec选项与其他命令结合使用。 找出当前目录下所有root的文件,并把所有权更改为用户tom find .-type f -user root -exec chown tom {} \; 上例中,{} 用于与-exec选项结合使用来匹配所有文件,然后会被替换为相应的文件名。 #找出自己家目录下所有的.txt文件并删除 find $HOME/. -name "*.txt" -ok rm {} \; 上例中,-ok和-exec行为一样,不过它会给出提示,是否执行相应的操作。 #查找当前目录下所有.txt文件并把他们拼接起来写入到all.txt文件中 find . -type f -name "*.txt" -exec cat {} \;> all.txt #将30天前的.log文件移动到old目录中 find . -type f -mtime +30 -name "*.log" -exec cp {} old \; #找出当前目录下所有.txt文件并以“File:文件名”的形式打印出来 find . -type f -name "*.txt" -exec printf "File: %s\n" {} \; #因为单行命令中-exec参数中无法使用多个命令,以下方法可以实现在-exec之后接受多条命令 -exec ./text.sh {} \; (19)搜索但跳出指定的目录,查找当前目录或者子目录下所有.txt文件,但是跳过子目录sk。 find . -path "./sk" -prune -o -name "*.txt" -print (20)要列出所有大小为零的文件。 find . -empty (21)find 命令 -perm 的权限的加减号的区别。 首先创建了 4 个具有 suid 和 sgid 属性的文件,因为是大写的 S,所以实际上无效,但不影响我们来说明 -perm 选项指定权限时加减号的区别。 ls -l ./testdir ------S--- 1 root root 0 2016-11-06 10:39 2000 ---S------ 1 root root 0 2016-11-06 10:39 4000 ---S--S--- 1 root root 0 2016-11-06 10:39 6000 -rwS--S--- 1 root root 0 2016-11-06 10:39 6600 假定我执行 find . -type f -perm 6000 那么我们显然可以得到下面的结果 ./60000 这属于完全匹配。如果执行find . -type f -perm -6000呢,其结果是: ./6000 ./6600 这里的横杠-表示权限位有1的位置一定要正确匹配,其他权限位无所谓。这里要转成二进制来说,首先6000转成三位的二进制是下面这个样子: 110 000 000 000 这表示前面两个 1 一定要匹配,其他无所谓。那能匹配的就是 6000、6600 这两个文件,其权限二进制转换过来分别是: 110 000 000 000 110 110 000 000 而如果是执行find . -type f -perm +6000呢?我们看看结果: ./6000 ./2000 ./4000 ./6600 +号的意思是,每一组的权限,只要有一个组拥有给定的权限,就满足条件,也就是说前2位中,只要有一个1就行,所以上面的都符合要求,因为翻译成二进制变成: 110 000 000 000 010 000 000 000 100 000 000 000 110 110 000 000 所以,从上面的结果可以看出,命令find . -type f -perm +6000就是指定目录下所有具有suid或者sgid属性的文件。 注意:find的 +mode已经废弃,建议使用/mode来代替+mode。 (22)删除文件大小为零的文件。 find ./ -size 0 -exec rm {} \; #或 find ./ -size 0 -ok rm {} \; #或 rm -i find ./ -size 0 #或 find ./ -size 0 | xargs rm -f -ok和-exec的作用相同,只不过以一种更为安全的模式来执行该参数所给出的shell命令,在执行每一个命令之前,都会给出提示,让用户来确定是否执行。例如find . -name "*.conf" -mtime +5 -ok rm {} \;,在当前目录中查找所有文件名以.LOG结尾、最近更改时间在5日以上的文件,并删除它们,只不过在删除之前先给出提示。 ●grep 命令: 1.命令简介 grep(Globally search a Regular Expression and Print)是 GNU 开发的一款免费开源的文本搜索工具。 grep 家族包括 grep、egrep 和 fgrep,其功能是在给定的文件中查找一个指定格式或者内容的字符串,并将匹配的字符串所在行打印出来。如果不指定任何文件名称或给定的文件名为连字符 -,则从标准输入设备读取文本,然后在这些文本中进行查找。grep 支持正则表达式表示待搜索的文本,完成文本匹配。 2.命令格式 grep [OPTION...] PATTERNS [FILE...] grep [OPTION...] -e PATTERNS ... [FILE...] grep [OPTION...] -f PATTERN_FILE ... [FILE...] 3.选项说明 注意,长选项的参数对于短选项也是必须的。 匹配器选择: -E,--extended-regexp 使用扩展正则表达式解释匹配模式 -F, --fixed-strings 将匹配模式看作固定字符串而不是正则表达式 -G, --basic-regexp 使用基本正则表达式解释匹配模式 匹配控制: -e, --regexp=PATTERNS 匹配模式。如果使用此选项多次或与 -f(--file)选项组合使用,搜索给定的所有模式。此选项可用于保护以 “-” 开头的模式 -f, --file=FILE 将匹配模式写在文件中,文件中一行内容对应一个匹配模式 -i, --ignore-case 忽略字符大小写 -v, --invert-match 反向选择,显示不包含匹配文本的所有行 -w, --word-regexp 整个单词匹配才算匹配 -x, --line-regexp 整行匹配才算匹配 -y 过时的 -i 同义词 一般输出控制: -c, --count 只输出匹配的行数,不是匹配字符串的个数 --color, --colour[=WHEN] 将找到的关键词加上颜色显示。WHEN 可取值 never、always 或 auto -L, --files-without-match 不输出包含匹配模式文件的文件名 -l, --files-with-matches 只输出包含匹配模式文件的文件名 -o, --only-matching 只显示匹配的字符串,并以单独行输出 -q, --quiet, --silent 静默模式,不显示任何信息到标准输出 -s, --no-messages 不显示不存在或无匹配文本的错误信息 输出行前缀控制: -b, --byte-offset 在匹配的行之前,标示出该行第一个字符的位编号,即字符在文本中的字节偏移下标,包括换行符 -H, --with-filename 查询多文件时显示文件名(默认选项) -h, --no-filename 查询多文件时不显示文件名 -n, --line-number 显示匹配行及行号 -T, --initial-tab 使用 Tab 使匹配行对齐 -u, --unix-byte-offsets 以 Unix 样式进行字节偏移。使用该选项,使 grep 产生的结果与在 Unix 机器上相同,此选项必须与 -b 同时使用,否则没有效果,也必须要在 MS-DOS 和 MS-Windows 平台上使用 -Z, --null 文件名与匹配行之间使用空字符。grep 默认会在每个输出前打印文件名,文件名与匹配行之间会有一个冒号隔开,-Z选项告诉grep不要使用冒号了,使用一个NUL字符 上下行控制: -A, --after-context=NUM 后紧跟数字,为 after 之意。除了列出匹配字符串所在行之外,后续的 NUM 行也列出来 -B, --before-context=NUM 后紧跟数字,为 before 之意,显示匹配行以及该行之前指定行数的内容 -, -C, --context=NUM 显示匹配行以及该行上下指定行数的内容 文件与目录选择: -a, --text 将 binary 文件以 text 文件的方式处理,等同于 --binary-files=text 选项 -D, --devices=ACTION 如果输入文件是设备,命名管道(FIFO)或套接字,则使用指定动作处理它。默认情况下,为读取操作(read),这意味着读取设备就像它们是普通文件。如果操作是跳过(skip),设备将被悄悄跳过 -d, --directories=ACTION 当指定要查找的是目录而非文件时,使用指定的操作处理。动作有:read(默认)像普通文件一样读取目录;skip:忽略指定目录;recurse:递归读取指定目录下的所有文件,此操作等同于-r选项。 -I 忽略二进制文件。等同于 --binary-files=without-match -R, -r, --recursive 递归搜索给定目录下的所有文件。等价于 -d recurse 通用程序信息: --help 显示帮助信息并退出 -V, --version 显示版本信息并退出 4.常用示例 (1)统计字段出现次数。 grep -o [pattern] [finename...]|wc -l 命令解释: grep -o 中的选项 -o 是 only-matching 缩写。Print only the matched(non-empty) parts of a matching line, with each such part on a separate output line。以单独的行输出匹配的每一个模式字符串。 wc -l 统计输入的行数。就可以知道这个要统计的字段出现的次数了。 (c)搜索指定范围的数字。比如查询包含540-600的行。 grep '5[4-9][0-9]\|600' [filename...] 之所以竖杠 | 需要加上反斜杠进行转义,是因为竖杠 | 在 Shell 中是特殊字符,表示管道命令。可以使用 -E 选项显示指明为正则表达式,那么就不需要对竖杠 | 进行转义。 (2)递归搜索当前目录下的所有文件。 grep -r "lvlv" . (3)显示所有以d开头的文件中包含test的行。 grep 'test' d* (4)打印在aa,bb,cc文件中匹配test的行,并显式行号。 grep -n 'test' aa bb cc (5)打印aa中包含有至少5个连续小写字符的字符串的所有行 grep '[a-z]\{5\}' aa 注意,这里必须使用双引号或者单引号将查找pattern包围。单引号与双引号的区别主要有: (1)单引号’‘是全引用,被单引号括起的内容不管是常量还是变量都不会发生替换; (2)双引号""是部分引用,被双引号括起的内容常量还是常量,变量则会发生替换,替换成变量的内容。一般常量用单引号’'括起,如果含有变量则用双引号""括起来。但是也有意外,比如说查找特殊字符反斜杠\使用:grep '\' ./*则会报grep: Trailing backslash错误,需要使用grep '\\' ./*才可以。 (6)统计文件file中含有指定字符串aaa的的行数。 grep aaa file | wc -l 注意: grep可用于shell脚本,因为grep通过返回一个状态值来说明搜索的状态,如果模板搜索成功,则返回0,如果搜索不成功,则返回1,如果搜索的文件不存在,则返回2。我们利用这些返回值就可进行一些自动化的文本处理工作。 (6)grep使用多个条件的或查询。 #方法一:使用符号\| grep "pattern1\|pattern2" filename #方法二:使用-E选项,用扩展正则表达式解释匹配模式 grep -E "pattern1|pattern2" filename #方法三:使用-e选项指定多个匹配模式 grep -e "pattern1" -e "pattern2" filename (7)grep 使用多个条件的与查询。 # 使用管道命令 grep "pattern1" filename | grep "pattern2" ●uname 命令: 1.命令简介 uname 命令用于打印当前系统相关信息(内核版本号、硬件架构、主机名称和操作系统类型等)。 2.命令格式 uname [OPTION]... uname 未指定任何选项时,默认选项为 -s,即显示操作系统内核名称。 3.选项说明 -a, --all 显示主机全部信息,以下面的顺序展示 -s, --kernel-name 显示内核名称 -n, -nodename 显示在网络上的主机名称 -r, --kernel-release 显示操作系统内核发行版本号 -v, --kernel-version 显示内核版本号 -m, --machine 显示机器硬件架构 -p, --processor 显示处理器类型或者 unknown -i, --hardware-platform 显示硬件平台或 unknown -o, --operating-system 显示操作系统名称 --help 显示帮助 --version 显示版本信息 4.常用示例 (1)显示主机名称。 uname -n TENCENT64.site (2)显示操作系统名称。 uname -o GNU/Linux (3)显示操作系统内核名称。 uname -s Linux (4)显示操作系统内核版本。 uname -r 3.10.104-1-tlinux2_kvm_guest-0022.tl2 #或 cat /proc/version Linux version 3.10.104-1-tlinux2_kvm_guest-0022.tl2 (root@TENCENT64.site) (gcc version 4.8.2 20140120 (Red Hat 4.8.2-16) (GCC) ) #1 SMP Wed Dec 14 10:21:52 CST 2016 (5)显示主机全部信息。 uname -a Linux TENCENT64.site 3.10.104-1-tlinux2_kvm_guest-0022.tl2 #1 SMP Wed Dec 14 10:21:52 CST 2016 x86_64 x86_64 x86_64 GNU/Linux ●vim 命令: 1.简介 vim 是 Linux 操作系统中最通用的全屏幕文本编辑器,是 vi 的增强版(vi iMproved),与 vi 完全兼容,且扩充了很多功能。 vim 编辑器支持编辑模式和命令模式,编辑模式下可以完成文本的编辑功能,命令模式下可以完成对文件的操作命令,要正确使用 vim 编辑器就必须熟练掌握这两种模式的切换。默认情况下,打开 vim 后自动进入命令模式。从编辑模式切换到命令模式使用 ESC 键,从命令模式切换到编辑模式使用 A、a、O、o、I、i 键。 2.命令格式 vim [OPTIONS] [FILE...] vim [OPTIONS] - vim [OPTIONS] -t TAG vim [OPTIONS] -q [ERRORFILE] [FILE...]表示一系列使用 vim 编辑的文件,使用:next命令可以向前切换所编辑的文件,使用--可以向后切换。这是 vim 常用启动格式; -:表示待编辑的文件从标准输入读取; -t TAG:要编辑的文件和光标的初始位置取决于一个标签,一种 goto 标签。标签在标签文件中查找,与标签关联的文件成为当前文件并执行关联的命令。主要用于 C 程序,在这种情况下 TAG 可以是函数名,其结果是包含该函数的文件成为当前文件,并且光标位于函数的开头。参见::help tag-commands; -q [ERRORFILE]:使用 quickFix 模式启动 vim,文件 ERRORFILE 将被读取并显示第一个错误。如果 ERRORFILE 省略,则默认为 AztecC.Err(Amiga 系统)或 errors.err(其它系统)。关于 quickFix 模式说明,可以使用:help quickfix查看。 3.选项说明 +NUM 打开文件时光标跳转到由 NUM 指定的行首 +/PAT 打开文件时光标跳转到匹配的模式字符串 PAT +, -c CMD 在完成对第一个文件的读取后,执行给出的指令 -b 以二进制模式打开文件,用于编辑二进制文件和可执行文件 -C 以兼容模式运行 vim,使 vim 的表现更像 vi,即使存在 .vimrc 文件 -d 以 diff 模式打开文件,当多个文件编辑时,显示文件差异部分 -e 进入 Ex 模式,即进入冒号开头的末行模式。ex是Unix编辑器 -E 进入增强 Ex 模式,就像执行命令 exim -l 使用 lisp 模式,打开 lisp 和 showmatch -m 取消写文件功能,重设 write 选项。你仍然可以修改缓冲内容,但是不可以写入文件 -M 关闭修改功能 -N 非兼容模式运行 vim,这会使 vim 表现的更好,但是可能会存在与 vi 不兼容的情况,即使存在 .vimrc 文件 -n 不使用 swap file,这可能会导致在 vim 意外崩溃的情况下无法恢复未保存的内容 -o [N] 以上下排列方式同时打开 N 个 vim 窗口,如果未指定 N ,则为每一个文件单独打开一个窗口 -O [N] 以左右下排列方式同时打开 N 个 vim 窗口,如果未指定 N ,则为每一个文件单独打开一个窗口 -R 以只读方式打开文件 -r 列出 swap file -r FILE 以指定的交换文件来恢复崩溃的编辑会话。交换文件名后缀为.swp -s 安静模式,与 -e 选项结合使用 -u VIMRC 使用指定的 vimrc 文件中的命令来初始化 vim,所有其它的初始化操作将被跳过。可以给定“NONE”来跳过所有的初始化 -U GVIMRC 使用指定的 gvimrc 文件中的命令来初始化 GUI,所有其它的 GUI 初始化操作将被跳过。可以给定 “NONE” 来跳过所有的 GUI 初始化 -V [N] 以冗余模式执行 vim,打印 vim 读取了哪些配置文件 vimrc。可选的数字 N 表示冗余级别,数值越大级别越高,取值范围是 0~10,默认是 10 -x 写文件时进行加密,会提示输入加密密钥 -h, --help 显示帮助信息并退出 --version 显示版本信息并退出 4.内置命令 vim 提供了丰富的内置命令,有些内置命令使用键盘组合键即可完成,有些内置命令则需要以冒号 : 开头输入。常用内置命令如下: Ctrl+u:向下滚动半屏 Ctrl+d:向上滚动半屏 Ctrl+f:向下滚动一屏 Ctrl+b:向上滚动一屏 Ctrl+e:向下滚动一行 Ctrl+y:向上滚动一行 Enter:回车向下滚动一行 Esc:从编辑模式切换到命令模式 ZZ:命令模式下保存当前文件所做的修改后退出 vim :[行号]:光标跳转到指定行的行首 :$:光标跳转到最后一行的行首 gg:跳转到首行; G:跳转到尾行 Ctrl+g:显示总行数 x, X:删除一个字符或选中的内容。当删除一个字符时,x 删除光标后的,X 删除光标前的。删除即剪切 d:删除选中的文本,删除即剪切 D:删除从当前光标到光标所在行尾的全部字符。删除即剪切 dd:删除光标所在行的整行内容。删除即剪切 ndd:删除当前行及其后n-1行,n为一个数字。删除即剪切 y:复制选中的文本 y0:复制光标前一个字符到行首的内容 y$:复制光标后一个字符到行尾的内容 yh:复制光标前的1个字符 yl:复制光标后的1个字符 nyh:复制光标前的n个字符,比如4yh复制光标前的4个字符 nyl:复制光标后的n个字符,比如4yl复制光标后的4个字符 yy:复制光标所在的当前行 nyy:复制当前行以及其后n-1行,n为一个数字; p:小写p,粘贴文本操作,用于将缓存区的内容粘贴到当前光标所在位置的下方 P:大写P,粘贴文本操作,用于将缓存区的内容粘贴到当前光标所在位置的上方; /[字符串]:向后搜索,支持正则表达式。用于从当前光标所在位置开始向文件尾部查找指定字符串的内容,查找的字符串会被加亮显示。键入字符 n 跳转到下一个,N 跳转到前一个 ?[字符串]:向前搜索,支持正则表达式。用于从当前光标所在位置开始向文件头部查找指定字符串的内容,查找的字符串会被加亮显示。键入字符 n 跳转到下一个,N 跳转到前一个 :a,bs/F/T:替换文本操作,将a到b行之间第一个F换成T字符串。其中,":s/"表示进行替换操作。不指定a和b,则默认为当前行;如果b为$,表示替换到末行;如果是a,b为%,即:%s/F/T,表示从第一行替换至末行 :a,bs/F/T/g:替换文本操作,替换第a行到b行,每一行所有F为T。a,b的取值规则同上一条; a:在当前字符后添加文本 A:在当前行末添加文本 i:在当前字符前插入文本 I:在当前行首插入文本 no:在当前行后面插入n个空行,n为具体的数值 nO:在当前行前面插入n个空行,n为具体的数值 :wq:执行存盘退出操作 :w:执行存盘操作 :w!:执行强制存盘操作 :q:执行退出操作 :q!:执行强制退出操作 :e [文件名]:打开并编辑指定名称的文件 :n:如果同时打开多个文件,则继续编辑下一个文件 :f:显示当前的文件名、文件总行数、光标所在行号占总行数的比例 :set number:在最左端显示行号 :set nonumber:在最左端不显示行号 jkhl或方向键:光标移动快捷键,分别为上下左右 u:撤销 ctrl+r:反向撤销 v+移动光标:使用v进行选择模式,移动光标可选择文本 w:word,右移一个单词,光标停留在单词首部 e:end,右移一个单词,光标停留单词的尾部 b:back,左移一个单词,光标停留在单词首部 ^ 或 (:移至行头 $ 或 ):移至行尾 gd:高亮显示光标所在的单词 5.vim 需知 5.1 vim 的四大模式 众所周知,vim 里面最具特色的东西就是它可以切换模式,那什么是模式呢?可以简单的理解为在不同的模式下面按相同的键而得到不同的效果。比如 vim 在插入模式下面连按两次 d,那么就会在光标位置插入两个字母 d,如果在正常模式下面连按两次 d,那么光标所在当前行将会被删除。 既然说是 vim 的四大模式,那么 vim 到底有那四大模式呢? 正常模式(normal mode) 可视模式(visual mode) 插入模式(insert mode) 命令行模式(command-line mode) 用户可以通过按 ESC 在各个模式之间进行切换。关于 vim 的模式说明,可以打开 vim 后键入 :help mode 来查看。 正常模式 (command mode) 不管用户处于何种模式,只要按一下 ESC 键,即可进入正常模式。启动 vim 命令默认情况下进入正常模式。 在正常模式下,用户可以输入各种合法的 vim 命令,用于管理自己的文档。此时从键盘上输入的任何字符都被当做编辑命令来解释,若输入的字符是合法的 vim 命令,则 vim 在接受用户命令之后完成相应的动作。但需注意的是,所输入的命令并不在屏幕上显示出来。若输入的字符不是 vim 的合法命令,vim 会响铃报警。 可视模式(visual mode) 可视模式简单来说就是选中一块编辑区域,然后在上面执行一些操作,比如删除,替换,改变大小写等。 在正常模式按下 v(逐个字符选择文本)、 V(逐行选择文本)、Ctrl+v(按照块的方式选择文本),可以进入可视模式。可视模式中的操作有点像拿鼠标进行操作,选择文本的时候有一种鼠标选择的即视感,有时候会很方便。 插入模式 (insert mode) 在正常模式下输入插入命令 i(insert)、附加命令 a (append)、打开命令 o(open)、修改命令 c(change)、取代命令 r(replace)或替换命令 s(substitute)都可以进入插入模式。在该模式下,用户输入的任何字符都被Vi当做文件内容保存起来,并将其显示在屏幕上。在文本输入过程中,若想回到命令模式下,键入 ESC 键即可。 命令行模式 (command-line mode) 命令行模式又称为 ex 模式。ex 是 EXtended 的简称,是 Unix 系统上的纯文本编辑器。ex 命令可启动 vim,执行 ex 命令,并键入 visual 就可以进入 vim 的正常模式。 vim 和 ex 编辑器的功能是相同的,二者主要区别是用户界面。在 vim 中,命令通常是单个键,例如 i、a、o 等;而在 ex 中,命令是以按回车键结束的行。在正常模式下,用户按冒号即可进入命令行模式,此时 vim 会在显示窗口的最后一行显示一个冒号作为命令行模式的提示符,等待用户输入命令。多数文件管理命令都是在此模式下执行的(如把编辑缓冲区的内容写到文件中等)。命令执行完后,vim 自动回到正常模式。 5.2 vim 相关编码选项 文件的编码和显示是一个令人头痛的东西,真希望这个世界上只存在utf-8编码,那就没那么痛苦了。vim编码配置涉及4个选项,分别是encoding 、fileencoding、fileencodings和termencoding,四者对应的简写分别为enc、fenc、fencs和tenc。 (1)encoding encoding是vim内部使用编码。vim运行时,其菜单、标签、以及各个缓冲区统一使用encoding作为字符编码。 (2)fileencoding fileencoding为文件采用的编码方式。使用vim打开文件后,可以使用末行命令:set fenc=utf-8将文件编码方式更改为UTF-8,注意,前提是vim打开文件时已经正确识别出文件编码,即未出现乱码。 (3)fileencodings fileencodings用于vim在打开文件的时候进行解码的猜测列表。文件编码没有百分百正确的判断方法,所以vim只能猜测文件编码。~/.vimrc里面fileencodings的设置一般为 set fileencodings=utf-8,gb18030,latin1 (4)termencoding 终端所使用的文本编码。这个选项的值用于告诉VIM终端使用了哪种文本编码用于文本输入和显示。如果该值为空,那么它被设置为encoding的值。 5.3 vim 读写文件时编码转换过程 (1)读文件 vim打开文件时,需要将磁盘文件内容载入缓存,并将缓存中的字符转为换终端编码,通过网络传输的方式,传输到终端进行显示。两个转换环节,有一个出错都会出现乱码。 fileencoding -> encoding -> termencoding (2)写文件 通过终端编辑文件时,字符编码转换过程是vim读文件的逆过程。 termencoding -> encoding -> fileencoding 注意:使用vim读写文件时为避免出现乱码,至关重要的一点就是终端,比如SecureCRT或XShell的编码设置要与vim的termencoding设置相同,如果不同还是还是会出现乱码,尽管vim已经采用正确的编码格式解析了文件。比如将XShell设置为UTF-8。 在这里插入图片描述 6.vim 常见用法 (1)vim 查看文件编码 :set fileencoding 或者简写 :set fenc 可显示文件编码格式。这个命令有致命的缺点。原因是只有正常显示文件内容时,该命令显示的文件编码格式才是文件本身的编码格式。因为该命令显示的编码格式并不是文件本身的编码格式,而是当前打开该文件所使用的编码格式。因此,这个命令在网上的说明大都是不准确的,特此说明。 (2)修改编码类型 使用vim修改: :set fileencoding=gbk #或者 :set fenc=gbk 使用iconv来修改文件编码: iconv -f encoding -t encoding inputfile #比如将一个GBK编码的文件转换成UTF-8编码 iconv -f GBK -t UTF-8 file1 -o file2UTF-8 iconv的参数说明: -f, --from-code=名称,原始文本编码 -t, --to-code=名称,输出编码 -l, --list 列举所有已知的字符集 -c 从输出中忽略无效的字符 -o, --output=FILE,输出文件 -s, --silent,关闭警告 --verbose,打印进度信息 (3)vim 指定编码类型浏览文件 如果知道了文件的编码类型,可显示指定编码类型来解析文件,而不用vim去猜测文件的编码类型,事实上猜测的往往是错误。命令如下: vim file_name -c "e ++enc=utf-8" 或者在使用 vim 打开文件之后,在末行模式使用如下命令: :e ++enc=utf-8 (4)vim 新增空白行 新增一行空白,在命令行模式下输入 o。如果想添加三行的话,键入 3o ,如果想添加 n 行则键入 n 个 o。如果键入 3o 后立即退出插入模式的话,就可以添加三个空白行。如果输入一些内容再退出,可以添加三行相同的内容。 如果想在每一行执行相同的命令,在 vim 里可以用 :g 实现。一般的语法是: :g/pattern/cmd 它表示在匹配 /pattern/ 这个正则表达式的行上执行 cmd 命令(也称冒号命令)。而 /^/ 这个表达式,用于匹配行首。因为任何一行都有行首,你的要求就很容易实现了: :g/^/norm 3o norm这个命令的意思是,把后面的参数看成是在普通模式下的按键,即命令模式下的按键。 (5)vim 高亮显示选中的单词 将光标移到需要高亮显示的单词上,在命令模式下输入gd,那么就可以将当前的单词在当前文本中全部高亮显示,如下图所示,高亮显示dwBeInvitedUinLen。 这里写图片描述 (6)vim 输入特殊字符 有三种方法,第一种是使用字符编码,第二种是使用二合字母(digraph),三是使用快捷键(Ctrl+字母)。 使用字符编码: vim可以用字符编码插入任意字符,使用此功能可以方便地输入键盘上找不到的字符。使用步骤如下: (1)编辑模式下按下Ctrl+v; (2)如果是ASCII字符,则输入三位十进制ASCII码值,不足三位,前补0。比如输入大写字母A,则输入065;如果是Unicode字符,则输入“u+四位十六进制码值”。比如输入大写字母A,则输入u0041。 更多详情内容可参见vim的帮助文档,末行模式输入:h i_ctrl-v_digit。 使用二合字母(digraph): 二合字母顾名思义,使用两个字母的组合来标识特殊字符。使用步骤如下: (1)编辑模式下按下Ctrl+k; (2)输入特殊字符对应的二合字母。可以使用:dig或:h digraph-table查看对应二合字母。比如回车符(Carriage Return) 的二合字母是CR。 Ctrl+字母: 在vim中,使用:set list显示所有字符时,经常会看到有^I、^M等符号,代表的字符可以使用:h digraph-table查看,特殊字符列表如下: 这里写图片描述 在vim的编辑模式下,可使用“Ctrl+字母”进行输入,例如使用"Ctrl+i"或"Ctrl+I"可以输入字符^I(Tab),使用"Ctrl+m"或"Ctrl+M"可以输入字符^M(回车)。 (7)vim其它常见操作 #显示行号 :set number #取消行号 :set nonu #取消高亮显示查找后的字符串 :nohl #显示换行符 :set list #不显示换行符 :set nolist 7.小结 vim 仍有很多未知的东西等待我们去发现,如果 vim 使用过程中有问题,欢迎留言,一同探讨解决进步。 ●iconv 命令: 1.命令简介 iconv命令是用来转换文件的编码方式,比如它可以将UTF8编码的转换成GB18030的编码。Linux下的iconv开发库包括iconv_open,iconv_close,iconv等C函数(非标准库函数),可以用来在C/C++程序中很方便的转换字符编码。 2.命令格式 iconv -f FROMCODE -t TOCODE FILE ... 3.选项说明 iconv 命令将给定编码的文件,转换为指定编码的内容,结果默认输出到标准输出,可以使用--output或-o输出到指定文件。 -c 静默丢弃不能识别的字符,而不是终止转换 -f, --from-code=CODE 指定待转换文件的编码。 -t, --to-code=CODE 指定目标编码 -l, --list 列出已知的字符编码。 -o, --output=FILE 列出指定输出文件,而非默认输出到标准输出 -s, --silent 关闭警告。 --verbose 显示进度信息 -?, --help 显示帮助信息 --usage 显示简要使用方法 -V, --version 显示版本信息 -f 和 -t 所能指定的合法编码可以在 -l 选项的结果中查看。 4.常用示例 (1)将 GBK 文件转换为 UTF8 文件。 iconv -f gbk -t utf8 inputFile.txt -o outputFile.txt.utf8 (2)转换时报如下错误:“iconv: 未知 126590 处的非法输入序列”。此时使用-c选项。 iconv -c -f gbk -t utf8 inputFile.txt -o outputFile.txt.utf8 ●free 命令: 1.简介 free 命令用于显示系统内存使用情况,包括物理内存(Physical Memory)、虚拟内存(Swap Memory)、共享内存(Shared Memory)以及内核使用的缓冲(Buffers)与缓存(Cached)大小。在 Linux 系统监控的工具中,free 命令经常被用到。 free 命令的所有输出值都是从 /proc/meminfo 中读取的。 2.命令格式 free [-b | -k | -m] [-o] [-s delay ] [-t] [-l] [-V] 3.选项说明 -b:以Byte为单位显示内存使用情况; -k:以KB为单位显示内存使用情况; -m:以MB为单位显示内存使用情况; -g:以GB为单位显示内存使用情况; -o:不显示缓冲区调节列; -s [间隔秒数]:以指定间隔时间持续观察内存使用状况; -t:显示内存总和列; -l:显示详细的低内存和高内存统计; -V:显示版本信息。 4.常用示例 (1)使用 GB 为单位显示内存使用情况。 [root@test ~]#free -g total used free shared buffers cached Mem: 62 61 0 0 2 56 -/+ buffers/cache: 2 59 Swap: 1 0 1 第一行为各列的名称,其释义如下: total:物理内存总大小; used:物理内存已使用大小; free:物理内存空闲大小; shared:系统中分配的共享内存大小,此列已经 deprecated,数值一般为 0。当然在一些系统上也可能不是0,主要取决于free命令是怎么实现的。如果为0,要想查看系统分配的共享内存大小,请查看 /proc/meminfo的 Shmem 一项; buffers:系统分配的buffer大小; cached:系统分配的cache大小。包含了共享内存和tmpfs内存文件系统占用的内存。这两部分内存之和可通过/proc/meminfo的Shmem字段直接获取。 其中 total = used + free,理论空闲内存大小 free2=free1+buffers+cached=58GB,其中 free2 表示 free 列第二行的取值。实际上,cached 中的共享内存大小和 tmpfs 内存文件系统大小也是实际被使用的内存,所以真正可用内存大小 real free=free1+buffers+cached-Shmem。Shmem 大小具体参见 /proc/meminfo 的 Shmem 字段的取值。 第二行表示减去与增加 buffers 和 cache 大小,分别对应物理内存的理论已使用和理论空闲大小。理论空闲内存大小的计算方法如上文所述,理论已使用大小 used2=used1-(buffers+cache)=3。为什么不是显示的 2呢,因为这里存在四舍五入,导致显示有一定误差,使用 MB 为单位来显示,数值就能对的上了。 第三行 swap 表示交换分区(即虚拟内存)的大小。如果 swap 内存有被使用,则说明系统内存不够使用,需要进行扩容。 (2)显示 high memory 使用情况。 [root@test ~]#free -gl total used free shared buffers cached Mem: 62 61 0 0 2 56 Low: 62 61 0 High: 0 0 0 -/+ buffers/cache: 2 59 Swap: 1 0 1 使用-l选项可以查看高低内存使用情况,发现低内存与 Mem 的使用情况相同,高内存全部为零,为什么会这样呢?先看一下什么是 high memory 和 low memory。 32 位的 CPU,最大寻址范围为 2^32 - 1 也就是 4G 的线性地址空间。Linux 简化了分段机制,使得虚拟地址与线性地址总是一致的。Linux 一般把这个 4G 的地址空间划分为两个部分:其中 0~3G 为用户程序地址空间,虚地址 0x00000000 到 0xBFFFFFFF,供各个进程使用;3G~4G为内核的地址空间,虚拟地址 0xC0000000 到 0xFFFFFFFF,供内核使用。 Linux 内核采用了最简单的映射方式来映射物理内存,即把物理地址+PAGE_OFFSET按照线性关系直接映射到内核空间。PAGE_OFFSET 大小为 0xC0000000。但是 Linux 内核并没有把整个 1G 空间用于线性映射,而只映射了最多 896M 物理内存,预留了最高端的 128M 虚拟地址空间给 IO 设备和其他用途。所以,当系统物理内存较大时,超过 896M 的内存区域,内核就无法通过线性映射直接访问了。这部分内存被称作 high memory。相应的可以映射的低端物理内存称为 low memory。 那 Kernel 就永远无法访问到超过 896M 的内存了吗?不是的,Kernel 已经预留了 128M 虚拟地址,我们可以用这个地址来动态地映射到 high memory,从而访问 high memory。所以预留的 128M 除了映射 IO 设备外,还有一个重要的功能是提供了一种动态访问 high memory 的一种手段(kmap 主要就是干这个的,当然还有 vmalloc)。 结论: (1)high memory 针对的是物理内存,不是虚拟内存。 (2)high memory 也是被内核管理的(有对应的page结构),只是没有映射到内核虚拟地址空间。当内核需要分配high memory时,通过kmap等从预留的地址空间中动态分配一个地址,然后映射到high memory,从而访问这个物理页。high memory 映射到内核地址空间一般是暂时性的映射,不是永久映射。 (3)high memory 和 low memory一样,都是参与内核的物理内存分配,都可以被映射到内核地址空间,也都可以被映射到用户地址空间。 (4)物理内存<896M时,没有 high memory,因为所有的内存都被kernel直接映射了。 (5)64位系统下不会有 high memory,因为64位虚拟地址空间非常大(分给kernel的也很大),完全能够直接映射全部物理内存。 因为测试的机器是 64 位机器,所以不存在 high memory,故全部为零。 5.常见问题 5.1 buffers 与 cached 的区别 (1)buffers(缓冲) buffer是用于存储速度不同步的设备或优先级不同的设备之间传输数据的区域。缓冲(buffers)是为磁盘的读写设计的,把分散的写操作集中进行,减少磁盘碎片和硬盘的反复寻道,从而提高系统性能。 buffers 存放即将写到磁盘(块设备)的数据,缓冲满了一次性写入,减少对磁盘的写操作(内存 -> 磁盘)。 (2)cached(缓存) cache 经常被用在磁盘的 I/O 请求上,如果有多个进程都要访问某个文件,于是该文件便被做成 cache 以方便下次被访问,这样可提供系统性能。 缓存是把读取过的数据保存起来,重新读取时若命中(找到需要的数据)就不要去读硬盘了,若没有命中就读硬盘。其中的数据会根据读取频率进行组织,把最频繁读取的内容放在最容易找到的位置,把不再读的内容不断往后排,直至从中删除。 cached 存放从磁盘读出的数据,缓存起来,减少对磁盘的读操作(磁盘 -> 内存)。 buffers 和 cached,两者都是 RAM 中的数据。简单来说,buffers 缓存即将要被写入磁盘的数据,cached 缓存从磁盘中读取的数据。 5.2 buffers 与 cached 的释放 buffers 主要用于缓存文件系统中的元数据信息(dentries、inodes),cached 主要用于缓存文件系统中的pages 信息,必要时 buffers、cached 所占内存可被回收用于其他程序。 设置以下值可以将文件系统缓存的 clean pages、dentries、inodes 移出内存,腾出可用内存: # To free pagecache: echo 1 > /proc/sys/vm/drop_caches # To free dentries and inodes: echo 2 > /proc/sys/vm/drop_caches # To free pagecache, dentries and inodes echo 3 > /proc/sys/vm/drop_caches 以上操作并非具有破坏性,因为他们并不会将 dirty caches 释放掉,为了获得更多的可用内存,用户可以先执行 sync 操作将 dirty caches 写回磁盘,使之变为 clean caches(cache中的内容还是保留在内存中),然后再设置 drop_caches。 这里释放完成后,发现 cached 数值仍然不为 0,原因是 free 命令计算的 cached 包含了共享内存的大小,共享内存需要使用ipcrm [ -M key | -m id ]命令来释放。buffers 的数值也不为 0,因为系统时刻在运行着,释放完后,buffers 又被分配出去。 ●fdisk 命令: 1.命令简介 fdisk 命令用于创建和维护磁盘分区表。 它采用传统的问答式界面,而不是类似于 fdisk 的 cfdisk 的互动式操作界面,因此在使用上较为不便,但功能却丝毫不打折扣。它兼容 DOS 类型的分区表、BSD 或者 SUN 类型的磁盘列表。 2.命令格式 fdisk [-uc] [-b sectorsize] [-C cyls] [-H heads] [-S sects] device fdisk -l [-u] [device...] fdisk -s partition... fdisk -v fdisk -h 3.选项说明 -b {sectorsize} 指定硬盘扇区大小,可用数值为512, 1024, 2048 or 4096 -c 关闭DOS兼容模式 -C {cyls} 指定硬盘的柱面数(number of cylinders) -H {heads} 指定硬盘的磁头数(number of heads),当然不是物理数值,而是作用于分区表。合理取值是255和16 -S {sects} 指定每个磁道的扇区数,当然不是物理数值,而是用于分区表。一个合理的数值是63; -l 列出指定设备的分区表,然后退出。如果没有给定设备,则使用在/proc/partitions(如果存在)中提到的那些设备; -u 在列出分区表时,给出扇区大小而不是柱面大小 -s {partition} 以块(block)为单位,显示指定分区的大小 -v 显示版本信息 -h 显示帮助信息 阅读以上选项说明,需要注意以下几个问题: (1)块(block)与扇区(sector)的区别。 扇区是对硬盘而言,扇区是硬盘的最小存储单位,块是对文件系统而言,块是文件系统最小存取单位。一般而言,一个扇区大小为512B,一个块大小为4KB,一个block是由连续的8个sector组成。 (2)理解上面选项的含义,需了解磁盘的物理组成结构与相关概念,例如sector、cylinder、head等组成部件的具体含义,可参见硬盘的存储原理和内部架构 。 4.常用示例 (1)列出指定设备的分区情况。 fdisk -l /dev/sda Disk /dev/sda: 300.0 GB, 299966445568 bytes 255 heads, 63 sectors/track, 36468 cylinders Units = cylinders of 16065 * 512 = 8225280 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disk identifier: 0x0009808c Device Boot Start End Blocks Id System /dev/sda1 * 1 1306 10485760 83 Linux /dev/sda2 1306 1566 2088960 82 Linux swap / Solaris /dev/sda3 1566 4177 20971520 83 Linux /dev/sda4 4177 36469 259387694 83 Linux 对fdisk -l相关数值的解释如下: 第一行中说明硬盘 /dev/sda 总大小为 300.0 GB; 第二行中 heads 表示硬盘磁头数,也是盘面数,因为磁头数等于盘面数。随后63 sectors/track说明每条磁道分63个扇区。共 36468 个柱面,柱面是分区的最小单位; 第三行说明每个柱面单位是 8225280 byets,柱面单位大小=磁头数*每条磁道的扇区数*扇区大小=255*63*512B=8225280B; 第四行说明扇区的大小是512B; 第五行说明硬盘最小与最佳的存储单位是512 bytes,等于扇区大小,因为扇区是硬盘的最小存储单位; 第六行说明硬盘标识符是 0x0009808c。 第七行表示每个分区相关参数的含义。 Device:分区名称; Boot:是否是活动分区。活动分区只能是主分区,一个硬盘只能有一个活动的主分区;一个硬盘的主分区与扩展分区总和不能超过4个。硬盘分区遵循着“主分区→扩展分区→逻辑分区”的次序原则,而删除分区则与之相反。 主分区:一个硬盘可以划分多个主分区,但没必要划分那么多,一个足矣。 扩展分区:主分区之外的硬盘空间就是扩展分区, 逻辑分区:是对扩展分区再行划分得到的。 Start:分区柱面的开始下标; End:分区柱面的结束下标; Blocks:该分区的块数量。当前文件系统block=2*sector,所以块数量=(End-Start)*柱面的扇区数/2=1305*255*63/2=10482412.5; Id:各种分区的文件系统不同,如有ntfs分区,fat32分区,ext3分区,swap分区等。每一种文件系统都有一个代号,对应这里的Id。常见的文件系统ID有: f:FAT32 Extend,只限于扩展分区。 86:NTFS。 7:HPFS/NTFS b:FAT32。 83:Linux Ext2。 82:Linux 交换区。 System:文件系统名称。 总结: 一个磁盘的大小=一个柱面大小*柱面的总数=磁头数量*每个磁道上的扇区数*一个扇区大小*柱面总数 即: 磁盘大小=8225280*36468=299959511040 bytes=299GB=255*63*512*36468 上例中显示出的硬盘大小与实际计算出来的有少许出入,这个不必太在意,Linux显示的这些数据不会十分精确。 (2)对指定设备进行分区并挂载。 第一步,选择要进行操作的磁盘,进入问答式界面。 fdisk /dev/sdb 第二步,输入m列出可以执行的命令。 Command (m for help): m Command action a toggle a bootable flag b edit bsd disklabel c toggle the dos compatibility flag d delete a partition l list known partition types m print this menu n add a new partition o create a new empty DOS partition table p print the partition table q quit without saving changes s create a new empty Sun disklabel t change a partition's system id u change display/entry units v verify the partition table w write table to disk and exit x extra functionality (experts only) 第三步,输入p列出磁盘目前的分区情况。 Disk /dev/sda: 300.0 GB, 299966445568 bytes 255 heads, 63 sectors/track, 36468 cylinders Units = cylinders of 16065 * 512 = 8225280 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disk identifier: 0x0009808c Device Boot Start End Blocks Id System /dev/sda1 * 1 1306 10485760 83 Linux /dev/sda2 1306 1566 2088960 82 Linux swap / Solaris /dev/sda3 1566 4177 20971520 83 Linux /dev/sda4 4177 36469 259387694 83 Linux 第四步,输入d然后选择分区,删除现有分区。 Command (m for help): d Partition number (1-4): 1 Command (m for help): d Selected partition 2 Command (m for help): d Selected partition 3 Command (m for help): d Selected partition 4 第五步,输入n建立新的磁盘分区,首先建立两个主磁盘分区。 Command (m for help): n Command action e extended p primary partition (1-4) p //建立主分区 Partition number (1-4): 1 //分区号 First cylinder (1-391, default 1): //分区起始位置 Using default value 1 last cylinder or +size or +sizeM or +sizeK (1-391, default 391): 100 //分区结束位置,单位为柱面 Command (m for help): n //再建立一个主分区 Command action e extended p primary partition (1-4) p Partition number (1-4): 2 //分区号为2 First cylinder (101-391, default 101): Using default value 101 Last cylinder or +size or +sizeM or +sizeK (101-391, default 391): +200M //分区结束位置,单位为M 第七步,确认分区建立成功。 Command (m for help): p Disk /dev/sdb: 3221 MB, 3221225472 bytes 255 heads, 63 sectors/track, 391 cylinders Units = cylinders of 16065 * 512 = 8225280 bytes Device Boot Start End Blocks Id System /dev/sdb1 1 100 803218+ 83 Linux /dev/sdb2 101 125 200812+ 83 Linux 第八步,再建立一个逻辑分区。 Command (m for help): n Command action e extended p primary partition (1-4) e //选择扩展分区 Partition number (1-4): 3 First cylinder (126-391, default 126): Using default value 126 Last cylinder or +size or +sizeM or +sizeK (126-391, default 391): Using default value 391 第九步,确认扩展分区建立成功。 Command (m for help): p Disk /dev/sdb: 3221 MB, 3221225472 bytes 255 heads, 63 sectors/track, 391 cylinders Units = cylinders of 16065 * 512 = 8225280 bytes Device Boot Start End Blocks Id System /dev/sdb1 1 100 803218+ 83 Linux /dev/sdb2 101 125 200812+ 83 Linux /dev/sdb3 126 391 2136645 5 Extended 第十步,在扩展分区上建立两个逻辑分区。 Command (m for help): n Command action l logical (5 or over) p primary partition (1-4) l //选择逻辑分区 First cylinder (126-391, default 126): Using default value 126 Last cylinder or +size or +sizeM or +sizeK (126-391, default 391): +400M Command (m for help): n Command action l logical (5 or over) p primary partition (1-4) l First cylinder (176-391, default 176): Using default value 176 Last cylinder or +size or +sizeM or +sizeK (176-391, default 391): Using default value 391 第十一步,确认逻辑分区建立成功。 Command (m for help): p Disk /dev/sdb: 3221 MB, 3221225472 bytes 255 heads, 63 sectors/track, 391 cylinders Units = cylinders of 16065 * 512 = 8225280 bytes Device Boot Start End Blocks Id System /dev/sdb1 1 100 803218+ 83 Linux /dev/sdb2 101 125 200812+ 83 Linux /dev/sdb3 126 391 2136645 5 Extended /dev/sdb5 126 175 401593+ 83 Linux /dev/sdb6 176 391 1734988+ 83 Linux Command (m for help): 从上面的结果我们可以看到,在硬盘 sdb 我们建立了 2 个主分区(sdb1,sdb2),1个扩展分区(sdb3),2 个逻辑分区(sdb5,sdb6)。 注意:主分区和扩展分区的磁盘号位1-4,也就是说最多有 4 个主分区或者扩展分区,逻辑分区开始的磁盘号为 5,因此在这个实验中是没有 sdb4 的。 最后对分区操作进行保存: Command (m for help): w The partition table has been altered! Calling ioctl() to re-read partition table. Syncing disks. 建立好分区之后我们还需要对分区进行格式化才能在系统中使用磁盘。 在 sdb1 上建立 ext2 文件系统。 [root@localhost ~]# mkfs.ext2 /dev/sdb1 mke2fs 1.39 (29-May-2006) Filesystem label= OS type: Linux Block size=4096 (log=2) Fragment size=4096 (log=2) 100576 inodes, 200804 blocks 10040 blocks (5.00%) reserved for the super user First data block=0 Maximum filesystem blocks=209715200 7 block groups 32768 blocks per group, 32768 fragments per group 14368 inodes per group Superblock backups stored on blocks: 32768, 98304, 163840 Writing inode tables: done Writing superblocks and filesystem accounting information: done This filesystem will be automatically checked every 32 mounts or 180 days, whichever comes first. Use tune2fs -c or -i to override. 在 sdb6 上建立 ext3 文件系统。 [root@localhost ~]# mkfs.ext3 /dev/sdb6 mke2fs 1.39 (29-May-2006) Filesystem label= OS type: Linux Block size=4096 (log=2) Fragment size=4096 (log=2) 217280 inodes, 433747 blocks 21687 blocks (5.00%) reserved for the super user First data block=0 Maximum filesystem blocks=444596224 14 block groups 32768 blocks per group, 32768 fragments per group 15520 inodes per group Superblock backups stored on blocks: 32768, 98304, 163840, 229376, 294912 Writing inode tables: done Creating journal (8192 blocks): done Writing superblocks and filesystem accounting information: done This filesystem will be automatically checked every 32 mounts or 180 days, whichever comes first. Use tune2fs -c or -i to override. [root@localhost ~]# 建立两个目录/oracle和/web,将新建好的两个分区挂载到系统: [root@localhost ~]# mkdir /oracle [root@localhost ~]# mkdir /web [root@localhost ~]# mount /dev/sdb1 /oracle [root@localhost ~]# mount /dev/sdb6 /web 查看分区挂载情况: [root@localhost ~]# df -h 文件系统 容量 已用 可用 已用% 挂载点 /dev/mapper/VolGroup00-LogVol00 6.7G 2.8G 3.6G 44% / /dev/sda1 99M 12M 82M 13% /boot tmpfs 125M 0 125M 0% /dev/shm /dev/sdb1 773M 808K 733M 1% /oracle /dev/sdb6 1.7G 35M 1.6G 3% /web 如果需要每次开机自动挂载则需要修改/etc/fstab文件,加入两行配置: [root@localhost ~]# vim /etc/fstab /dev/VolGroup00/LogVol00 / ext3 defaults 1 1 LABEL=/boot /boot ext3 defaults 1 2 tmpfs /dev/shm tmpfs defaults 0 0 devpts /dev/pts devpts gid=5,mode=620 0 0 sysfs /sys sysfs defaults 0 0 proc /proc proc defaults 0 0 /dev/VolGroup00/LogVol01 swap swap defaults 0 0 /dev/sdb1 /oracle ext2 defaults 0 0 /dev/sdb6 /web ext3 defaults 0 0 ●du 命令: 1.简介 du(disk usage)命令用于查看指定的目录或文件所占用的磁盘空间。 2.命令格式 du [OPTIONS] [FILES] du [OPTIONS] --files0-from=F 3.选项说明 -a, --all 递归显示目录与其包含的所有文件及子目录的大小,默认仅显示目录及其子目录的大小。 --apparent-size 显示文件或目录自身大小,而不是它们占用的磁盘空间大小。文件或目录占用磁盘空间的大小与它们自身大小有时候并非完全一致,有可能比较大,原因可能是稀疏文件中存在空洞,内部碎片,间接blocks等。大小等同与使用命令"wc -c"或"ls --blokc-size=1"查看的字节大小。 -B, --block-size=SIZE 定文件大小的统计单位,SIZE 可取如下字符串: KB(1000)、K(1024)、MB(1000*1000)、M(1024*1024)以及G, T, P, E, Z, Y等 -b,-bytes 显示目录或文件大小时,以byte为单位,等同于选项 --apparent-size --block-size=1。 -c, --total 显示占用磁盘空间大小的总和。 -D, --dereference-args 显示指定符号连接的源文件大小。 --files0-from=F 列出在文件F中指出的文件名称,如果F等于连字符-,则从标准输入读取文件名称。 -H 等同于 -D, --dereference-args。 -h, --human-readable 以易读的单位显示大小,例如以 K,M,G 等为单位进行显示。 --si 等同于 -h,但是 K,M,G 等以 1000 而非 2014 为换算单位。 -k 以 K 为单位显示,等同于--block-size=1K。 -l, --count-links 多次计算硬链接文件。 -m 以 M 为单位显示,等同于--block-size=1M。 -L, --dereference 显示符号链接的源文件大小。 -P, --no-dereference 默认选项,不显示符号链接源文件大小。 -0, --null 以 NULL 字符取代输出的换行符。 -S, --separate-dirs 不显示子目录大小(不太明白,为何使用时仍然显示子目录大小)。 -s, --summarize 只显示给定的文件或目录的总大小。 -x, --one-file-system 以一开始处理时的文件系统为准,若遇上其它不同的文件系统目录则略过。 -X, --exclude-from=FILE 跳过符合指定的文件。 --exclude=PATTERN 跳过符合指定模式的文件或目录。 --max-depth=N 指定递归显示的最大目录深度,--max-depth=0 等同于 --summarize。 --time 显示文件或目录最后修改时间。 --time=WORD 显示指定类型的时间,而非默认的最后修改时间。WORD 可取值为 atime、access、use(访问时间),或者ctime、status(状态改变时间)。 --time-style=STYLE 使用指定的时间格式显示时间,STYLE 可取值为 full-iso, long-iso, iso, +FORMAT,其中 FORMAT 解析方式等同于 date 命令。 --help 显示帮助信息。 --version 显示版本信息。 4.常用示例 (1)显示指定文件或目录占用磁盘空间大小。 du -sh [file or directory] (2)显示指定目录及其所有子目录的大小。 du -h [directory] 5.注意事项 (1)文件大小与占用磁盘空间大小的区别。 文件大小(又名 apparent size)是文件自身实际大小,与占用磁盘空间大小(又名 occupied space size)有本质的区别。举个例子,创建一个1字节的文件,使用du显示的为4KB,使用ls显示为1B,示例如下: [dablelv@TENCENT64 ~]$ echo -n 1 > 1B.txt [dablelv@TENCENT64 ~]$ ls -l 1B.txt -rw-rw-r-- 1 dablelv dablelv 1 Apr 4 19:14 1B.txt [dablelv@TENCENT64 ~]$ du -h 1B.txt 4.0K 1B.txt 我们先创建一个文件1B.txt,大小是一个字节,ls显示出的size就是1Byte,而1B.txt这个文件在硬盘上会占用1个block,因为Linux文件系统存储最小单位为block,不足1个block大小的文件也要占用1个block大小。这里的一个block等于4K。 (2)稀疏文件(sparse file) 稀疏文件就是在文件中留有很多空余空间,称为空洞(hole),留备将来插入数据使用,这些空洞被填充为NULL字符,特点是文件系统并不会为空余空间分配磁盘空间。 使用如下代码创建稀疏文件: #include #include #include #include int main(int argc, char *argv[]) { int fd = open("sparse.file", O_RDWR|O_CREAT); lseek(fd, 10240, SEEK_CUR); write(fd, "\0", 1); return 0; } 编译生成后执行,创建稀疏文件sparse.file,偏移10240字节后写入一个空字符,使得文件sparse.file内容全为空字符。使用ls命令查看文件大小为10241B,这是文件的大小。使用du命令查看文件占用磁盘空间大小时,发现稀疏文件空洞部分并不占用磁盘空间,被文件系统压缩存储。 [dablelv@TENCENT64 ~]$ ll sparse.file -rw---x--- 1 dablelv dablelv 10241 Apr 4 20:16 sparse.file [dablelv@TENCENT64 ~]$ du -h sparse.file 4.0K sparse.file 6.小结 历时近 5h,终于完成了此篇 blog,其中对于选项 -S 还存有疑惑,以及文件碎片(fragmentation)、间接块(indirect blocks)等相关概念比较模糊,后续了解后继续补充,也请请知者不吝指教,留言告知,万分感谢!对于文中不足甚至错误之处,也请大家批评指正。 ●nohup 命令 1.命令简介 nohup 的作用可以将程序以忽略挂起信号(SIGHUP)的方式运行。常见的用法是和 & 命令一同使用,将命令放置到后台运行,即使终端挂掉,进程会忽略挂起信号,继续运行。 将程序放到后台运行,一般有两种方式: (1)command & : 后台运行,关掉终端会停止运行。 (2)nohup command & : 后台运行,关掉终端也会继续运行。 注意: (1)如果使用nohup执行程序未显示进行标准输出重定向,则标准输出默认重定向当前工作目录的 nohup.out 文件中。如果当前工作目录的 nohup.out 文件不可写,输出重定向到 $HOME/nohup.out 文件中。如果没有文件能创建或打开用于追加,那么 command 参数指定的命令不可调用。 (2)如果标准错误未显示重定向,那么标准错误默认重定向到与标准输出相同的文件。 2.命令格式 nohup COMMAND [ARGS] nohup OPTION 3.选项说明 --help 显示帮助信息并退出 --version 显示版本信息并退出 4.常用示例 (1)使用 nohup 命令提交作业,那么在缺省情况下该作业的所有输出都被重定向到一个名为nohup.out的文件中,除非另外指定了输出文件。 nohup ./test.sh & (2)标准输出与标准错误输出重定向。 nohup ./test.sh > test.log 2>&1 & 注意: (1)2>&1 标识标准错误输出重定向等同于标准输出重定向,即标准错误输出也重定向到文件test.log; (2)& 命令是命令放在后台执行,需要放在命令的最后面。 ●tr 命令: 1.命令简介 tr(translate)用来转换或者删除一段文字。tr 所有的功能均可由 sed 来完成,可以将 tr 视为 sed 一个极简的实现。 2.命令格式 tr [OPTIONS] SET1 [SET2] 3.选项说明 -c, -C, --complement SET1 [SET2] 将字符集 SET1 以外的其他字符删除或者转换为字符集 SET2 中的最后一个字符(如果你指定了多个字符的话) -d, --delete 删除 SET1 这个字符串 -s, --squeeze-repeats 如果 SET1 中的字符连续出现多次,压缩重复的字符,只保留一个 -t, --truncate-set1 先将 SET1 的长度截为和 SET2 相等 --help 显示帮助信息并退出 --version 显示版本信息并退出 4.常用示例 (1)将 last 输出的信息中所有小写的字符变成大写字符。 last | tr [a-z] [A-Z] (2)将 /etc/passwd 输出的信息中的冒号 : 删除。 cat /etc/passwd | tr -d ':' (3)将 DOS 文件转成 Unix 文件。 cat /etc/passwd | tr -d '\r' (4)删除空行。 cat file | tr -s "\n" > new_file (5)将文件中 “abc” 分别替换为 “xyz” 中对应的字符。 cat file | tr "abc" "xyz" > newFile **注意:**这里凡是在 file 中出现的"a"字母,都替换成"x"字母,"b"字母替换为"y"字母,“c"字母替换为"z"字母,而不是将字符串"abc"替换为字符串"xyz”。 (6)替换指定字符集以外的字符。 echo -n "alv blv" | tr -c "lv " "x" xlv xlv echo -n 表示不输出换行符。 (7)从输入文本中将不在补集中的所有字符删除。 echo -n "alv blv" | tr -dc "lv" lvlv ●join 命令: 1.命令简介 将两个文件按照指定的相同字段进行笛卡尔乘积横向拼接,并输出到标准输出。默认情况下,join 字段分隔符是空格或 Tab。join 时,两个文件需要按照某个字段排好序。 笛卡尔乘积指两个集合 X 和 Y 成员相互组合构成的有序对的集合。比如集合 X={a,b},Y={0,1,2},则 X×Y={(a, 0), (a, 1), (a, 2), (b, 0), (b, 1), (b, 2)} Y×X={(0, a), (0, b), (1, a), (1, b), (2, a), (2, b)} 2.命令格式 join [OPTIONS] FILE1 FILE2 当 FILE1 或 FILE2 是连字符 -(二者不能同时是 -),那么内容从标准输入读取。 3.选项说明 -a FILENUM 除了显示原来的输出内容之外,还显示文件中没有相同栏位的行。FILENUM 取值为 1 或 2,分别对应 FILE1 和 FILE2 -e EMPTY 若 FILE1 与 FILE2 中找不到指定的列,则在输出中填入选项中的字符串 -i, --igore-case 比较列内容时,忽略大小写 -j FIELD 等价于 -1 FIELD -2 FIELD -o FORMAT 按照指定的格式显示结果 -t CHAR 指定输入和输出列的分隔字符 -v FILENUM 作用类似于 -a FILENUM,但是只显示文件中没有相同列的行 -1 FIELD 连接 FILE1 指定的列。FIELD 取 1 表示第一列,2 表示第二列,以此类推 -2 FIELD 连接 FILE2 指定的列。FIELD 取 1 表示第一列,2 表示第二列,以此类推 --check-order 默认选项,检查文件是否已经排序 --nocheck-order 不检查检查文件是否已经排序 --help 显示帮助信息并退出 --version 显示版本信息并退出 4.常用示例 (1)连接两个文件,默认以第一列作为连接字段。 # file1 内容如下 lvlv dablelv 25 zhangsan San 12 # file2 内容如下 lvlv english 15 lvlv math 75 zhangsan math 14 zhouxun english 45 join file1 file2 lvlv dablelv 25 english 15 lvlv dablelv 25 math 75 zhangsan San 12 math 14 (2)还是以上面的两个文件为例,显示指明按照第一列中文名进行连接。 join -j 1 file1 file2 # 或 join -1 1 -2 1 file1 file2 (3)如果想显示没有相同字段的行,使用 -a1 或 -a2 指定显示第一个或者第二个文件的行。 join -a2 file1 file2 lvlv dablelv 25 english 15 lvlv dablelv 25 math 75 zhangsan San 12 math 14 zhouxun english 45 //显示了文件 file2 中未匹配的一行 ●paste 命令: 1.命令简介 paste 命令将多个文件的相应行默认以 Tab 分隔符横向连接起来,输出到标准输出。paste 后可接多个文件,不限于 2 个文件。如果文件写成连字符 -,表示内容来自标准输入。paste 相对于 join 来说,简单许多,不需要有相同的字段也可按行拼接。 2.命令格式 pasete [OPTIONS] [FILES] 3.选项说明 -d,--delimiters=LIST 用指定的域分隔符取代Tab。 -s,--serial 顺序地合并一个文件的所有行到一行 --help 显示帮助信息并退出 --version 显示版本信息并退出 4.常用示例 有两个文件 file1.txt 和 file2.txt,内容如下: # file1 内容 abc def ghi # file2 内容 123 456 789 012 (1)将文件 file1.txt 的所有行合并到一行。 paste -s file1.txt abc def ghi # 指定域分隔符为冒号: paste -s -d : file1.txt abc:def:ghi (2)将多个文件的所有行分别合并为一行。 paste -s file1.txt file2.txt abc def ghi 123 456 789 012 (3)横向连接两个文件,默认以 Tab 分隔。 paste file1.txt file2.txt abc 123 def 456 ghi 789 012 # 通过交换文件名可指定列的位置 paste file2.txt file1.txt 123 abc 456 def 789 ghi 012 (4)paste 黏贴的内容(行)从标准输入读取,此时可以使用 - 来指代。例如查看 /etc 下的文件列表,并用 paste 打印成每行显示五个文件名。 ls /etc/ | paste -d: - - - - - cpi:adjtime:aliases:alternatives:anacrontab anthy-conf:asound.conf:at.deny:audisp:audit bash-command-not-found:bash_completion.d:bashrc:blkid:bonobo-activation ... 5.注意事项 如果文件格式是 DOS,文件换行符是\r\n,那么会出现内容覆盖的情况。比如 file1.txt 和 file2.txt 格式是 DOS,paste 这两个文件会出现如下情况: [root@tencent ~]# paste file1.txt file2.txt :123 :456 :789 :012 从结果可以看出,来自 file1.txt 的行被 file2.txt 的行覆盖,解决办法是,使用 vim 的末行命令:set ff=unix将文本格式改为 Unix。 ●expand 命令: 1.命令简介 用于将文件的制表符(Tab)转换为空格符(Space),默认一个 Tab 对应8个空格符,并将结果输出到标准输出。若不指定任何文件名或所给文件名为 -,则 expand 会从标准输入读取数据。 功能与之相反的命令是 unexpand,是将空格符转成 Tab 符。 2.命令格式 expand [OPTIONS] [FILES] 3.选项说明 -i, --initial 不转换非空白符后的制表符 -t, --tabs=NUMBER 指定一个tab替换为多少个空格,而不是默认的 8 -t, --tabs=LIST 指定制表符位置列表,用逗号分隔 --help 显示帮助信息 --version 输出版本信息 4.常用示例 (1)将文件中每行第一个 Tab 符替换为 6 个空格符,非空白符后的制表符不作转换。 expand -i -t 6 FILE 原文件内容: 这里写图片描述 转换后内容如下: 这里写图片描述 5.常见问题 (1)不是所有的Tab都会转换为默认或指定数量的空格符,expand会以对齐为原则将Tab符替换为适当数量的空格符,替换的原则是使后面非Tab符处在一个物理Tab边界(即Tab size的整数倍)。例如下面的文件: 这里写图片描述 其中CR和LF分别是Windows下的回车和换行符。使用如下命令转换后的结果如下图: expand -t 4 file 这里写图片描述 可以看到第一行的第二个Tab符和第二行的所有Tab符并没有替换为4个空格符,还是按照原来内容的对齐格式,替换为适当数量的空格符。 ●svn 命令: 1.命令简介 SVN 是 Apache Subversion 的缩写 ,是一个开放源代码的版本控制系统。相较于 RCS、CVS,它采用了分支管理系统,它的设计目标就是取代 CVS。互联网上很多版本控制服务已从 CVS 转移到 Subversion。Subversion 在 2000 年由 CollabNet 开发,现在已发展成为 Apache 软件基金会的一个项目。 svn 是Apache Subversion 的客户端,完成与 Apache Subversion 服务端的交互,实现版本控制。 2.命令格式 svn [subcommand] [options] [args] 3.选项说明 可用的子命令: add blame (praise, annotate, ann) cat changelist (cl) checkout (co) cleanup commit (ci) copy (cp) delete (del, remove, rm) diff (di) export help (?, h) import info list (ls) lock log merge mergeinfo mkdir move (mv, rename, ren) patch propdel (pdel, pd) propedit (pedit, pe) propget (pget, pg) proplist (plist, pl) propset (pset, ps) relocate resolve resolved revert status (stat, st) switch (sw) unlock update (up) upgrade 4.常用示例 4.1 svn commit 撤销 (1)找出要回滚的版本号。 svn log --limit 3 FILENAME --limit 3的意思是显示最新的三个版本。假如根据 svn log 日志查出指定文件要回滚的版本号是 2589。 (2)回滚本地到版本号 2589。 svn merge -r 5730:2589 FILENAME (3)为了保险起见,确认回滚的结果。 svn diff FILENAME (4)本地与版本库中没有差异的话,指定文件的当前版本是 2589。提交回滚后的文件。 svn commit -m "Revert revision from r5730 to r2589,because of ..." ●read 命令(builtin): 1.命令简介 read 命令是 Shell 内建命令,用于从标准输入或 -u 选项指定的文件描述符中读取单行,并将读取的单行根据 IFS 变量分割成多个字段,并将分割后的字段分别赋值给指定的变量列表。第一个字段分配给第一个变量,第二个字段分配给第二个变量,以此类推。如果指定的变量名少于字段数量,则多出的字段连同分隔符分配给最后一个变量。如果指定的变量多于字段数量,则多出的变量赋值为空。如果没有指定任何变量,则分割后的所有字段都存储在特定变量 REPLY 中。当然,read 读取的内容不仅可以赋给变量,还可以赋给数组。 IFS(Internal Field Separator)变量是 Shell 内建的环境变量,用于将 read 命令读取的单行内容分隔为多个字段。默认取值为空格、Tab 和换行符。 REPLY 变量也是 Shell 内建的环境变量,当 read 命令未指明接收变量时,用于接收 read 命令读取的单行内容。 2.命令格式 read [OPTIONS] [VARNAMES] 3.选项说明 -a ANAME 将分割后的字段依次存储到指定的数组中,存储的起始位置从数组的下标 0 开始 -d DELIM 后跟一个分隔符,只有第一个字符有用,用以取代换行符作为行的结束标志 -e 在输入的时候可以使用命令补全功能,使用 Tab 键可自动补全当前目录下文件 -i TEXT 如果使用 readline 命令读取行,则在开始编辑之前将文本放入编辑缓冲区 -n NCHARS 后跟一个数字,定义输入文本的长度,而不是读取整行 -N NCHARS 后跟一个数字,定义输入文本的长度,而不是读取整行。但是如果一行不足 nchars 个字符,则忽略行分隔符继续读取下一行 -p PROMPT 从终端读取输入时,在输入前打印提示信息 -r 屏蔽反斜杠 \。如果没有该选项,则 \ 作为一个转义字符,有的话 \ 就是个正常的字符了 -s 静默模式,输入字符不显示到屏幕,例如 login 时输入密码 -t TIMEOUT 后面跟秒数,定义输入字符的等待时间 -u FD 后面跟文件描述符 fd,从文件描述符中读取 4.常用示例 (1)如果没有指定变量,read 会把传入的值传给 REPLY,只要调用 REPLY就可以引用 read 读取的内容。 read; echo "\$REPLY:$REPLY" dablelv $REPLY:dablelv (2)read 从终端读取时指定一个提示语 [root@TENCENT64 ~]# read -p"input u password:";echo "\$REPLY:$REPLY" input u password:123456 $REPLY:123456 (3)-t 选项指定 read 命令等待输入的秒数,当计时满时,read 命令返回一个非零状态码。 #!/bin/bash if read -t 5 -p "输入网站名:" name then echo "你输入的网站名是 $website" else echo "\n抱歉,你输入超时了。" fi exit 0 执行程序不输入,等待 5 秒后: 输入网站名: 抱歉,你输入超时了 (4)除了控制输入时间,还可以使用 -n 选项控制输入的字符数量。当输入的字符数目达到预定数目时,自动退出,并将输入的数据赋值给变量。例如只接收 2 个输入就退出: #!/bin/bash read -n2 -p "请随便输入两个字符: " any echo "\n您输入的两个字符是:$any" exit 0 (5)-s 选项能够使输入的数据不显示在命令终端上(实际上,输入的内容是显示的,只是 read 命令将文本颜色设置成与背景相同的颜色)。输入密码常用这个选项。 #!/bin/bash read -s -p "请输入您的密码:" pass echo "\n您输入的密码是 $pass" exit 0 执行程序输入密码后是不显示的: 请输入您的密码: 您输入的密码是 runoob (6)读取文件。每次调用 read 命令都会读取文件中的一行文本。当文件没有可读的行时,read 命令将以非零状态码退出。 while read var1 var2 do echo $var1 $var2 done < file.txt ●file 命令: 1.命令简介 file 命令用来识别文件类型,对文件的检查分为文件系统、魔数检查和语言检查三个过程,也可用来辨别一些文件的编码格式。它是通过查看文件的头部信息来获取文件类型,而不是像 Windows 通过扩展名来辨识文件类型。 2.命令格式 file [-bchiklLNnprsvz0] [--apple] [--mime-encoding] [--mime-type] [-e testname] [-F separator] [-f namefile] [-m magicfiles] file ... file -C [-m magicfiles] file [--help] 3.选项说明 --apple 输出旧 MacOS 版本使用的文件类型和创建者代码。代码由八个字母组成,第一个字母描述文件类型,第二个字母描述创建者。此选项仅适用于定义了 Apple 风格输出的文件格式 -b, --brief 简约模式,不显示文件名称 -C, --compile 生成 magic.mgc 文件。配合选项 -m 使用 -c, --checking-printout 输出魔法文件的解析结果 -e, --exclude TESTNAME 排除对指定类型文件的检查,TESTNAME 可取值有 apptype、ascii、encoding、tokens、cdf、compress、elf、soft、tar -F, --separator SEP 使用指定分隔符替换输出文件名后的默认的冒号分隔符 : -f, --files-from NAMEFILE 从文件 NAMEFILE 中读取待检测的文件,每行一个 -i, --mime 输出 mime 类型的字符串而不是可读字符串,比如输出"text/plain; charset=us-ascii"而不是"ASCII text" --mime-type, --mime-encoding 像 -i,但是只打印指定元素 -k, --keep-going 不在首次匹配时停止,继续检查 -l, --list 打印每个魔数模式的强度信息 -L, --dereference 查看软链接对应文件的文件类型 -m, --magic-file MAGICFILES 指定 magic file。magic file 指的是那些具有特殊内容的文件,比如 C 文件,它会有 #include 字样;tar 文件的前几个字节会有特殊的规则。而检验 magic file 规则就是根据这些特殊的格式去判断一个文件的类型。而这些规则保存在 $HOME/.magic.mgc -N, --no-pad 不要填充文件名以便它们在输出中对齐 -n, --no-buffer 强制刷新标准输出 stdout。这个选项只在检查多个文件时有效。在通过管道获取文件类型时也可以使用该选项 -p, --preserve-date 保留待检测文件的access time,即使file命令不更改待检测文件的access time -r, --raw 不将不可打印字符转换为\ooo的八进制形式,正常情况下,file会做转换 -s, --special-files 正常情况下,file命令只支持普通文件的检测,就像stat(2)一样。使用该选项可以让file命令支持特殊文件,比如原始磁盘分区等 -v, --version 显示版本信息 -z, --uncompress 尝试去解读压缩文件的内容 -0, --print0 在文件名后输出空字符 \0 --help 显示帮助信息 4.常用示例 (1)查看文件类型。 [root@TENCENT64 ~]# file Changelog Changelog: ASCII text (2)不输出文件名称,只显示文件格式以及编码。 [root@TENCENT64 ~]# file -b Changelog ASCII text (3)输出 mime 类型的字符串。 [root@TENCENT64 ~]# file -i Changelog Changelog: text/plain; charset=us-ascii (4)查看软链接对应文件的文件类型。 [root@TENCENT64 ~]# ll Changelog* -rw-r--r-- 1 root root 1598 Nov 6 22:39 Changelog lrwxrwxrwx 1 root root 9 Nov 6 23:07 Changelog.ln -> Changelog #查看软链接本身类型 [root@TENCENT64 ~]# file Changelog.ln Changelog.ln: symbolic link to `Changelog' #查看软链接对应文件的文件类型 [root@TENCENT64 ~]# file -L Changelog.ln Changelog.ln: ASCII text (5)查看程序是 32 位还是 64 位。 file ./a.out ./a.out: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.32, BuildID[sha1]=7dd2556f5818bc85c64ab82131cf0b748567a976, not stripped 通过 ELF 64-bit LSB executable 可以看出程序是 64 位的。 ●stat 命令: 1.命令简介 stat 命令用于显示文件或文件系统的详细信息。在显示文件信息时,比 ls 命令更加详细。 2.命令格式 stat [OPTION]... FILE.. 3.命令选项 -L, --dereference:跟随符号链接解析原文件而非符号链接; -f, --file-system:显示文件所在文件系统信息而非文件信息; -c,--format=FORMAT:以指定格式输出,而非默认格式; 显示文件信息可用格式控制符如下: %a:以八进制显示访问权限 %A:以可读形式显示访问权限 %b:显示占有块数 %B:显示每一块占有的字节数 %C:SELinux security context string %d:十进制显示文件所在设备号 %D:十六进制显示文件所在设备号 %f:十六进制显示文件类型 %F:文件类型。Linux下文件类型主要分为普通文件、目录、字符设备文件、块设备文件、符号链接文件、套接字等 %g:文件所有者组ID %G:文件所有者组名称 %h:文件硬链接数 %i:inode号 %m:文件所在磁盘分区挂载点,比如/data %n:文件名称 %N:单引号括起来的文件名称,如果是软链接,则同时显示指向的文件名称 %o:optimal I/O transfer size hint %s:实际文件大小,单位字节 %t:major device type in hex, for character/block device special files %T:minor device type in hex, for character/block device special files %u:所有者用户ID %U:所有者用户名称 %w:文件创建时间,输出-表示无法得知 %W:文件创建时间,输出Unix时间戳,0表示无法得知 %x:可读形式输出最后访问时间atime %X:Unix时间戳输出最后访问时间atime %y:可读形式输出最后修改时间mtime %Y:Unix时间戳输出后修改时间mtime %z:可读形式输出最后状态改变时间ctime %Z:Unix时间戳输出最后状态改变时间ctime 显示文件系统信息可用格式控制符有: %a:非超级用户可使用的自由block数 %b:文件系统总block数 %c:文件系统总文件节点数 %d:可用文件节点数 %f:可用文件block数 %i:十六进制文件系统ID %l:最大文件名称长度 %n:文件名称 %s:一个块的大小,单位字节(for faster transfers) %S:一个块的基本大小,单位字节(用于统计block的数量) %t:十六进制输出文件系统类型 %T:可读形式输出文件系统类型 --printf=FORMAT:以指定格式输出,而非默认格式。与--format作用类似,但可以解释反斜杠转义字符,比如换行符\n; -t, --terse:简洁模式输出,只显示摘要信息; --help:显示帮助信息; --version:显示版本信息。 4.常用示例 (1)显示文件信息。 [root@TENCENT64 ~]# stat Changelog File: ‘Changelog’ Size: 1598 Blocks: 8 IO Block: 4096 regular file Device: fd01h/64769d Inode: 1579435 Links: 1 Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root) Access: 2018-11-06 22:39:54.110931887 +0800 Modify: 2018-11-06 22:39:54.110931887 +0800 Change: 2018-11-06 23:07:14.428548887 +0800 Birth: - 信息解释: File: ‘Changelog’:文件名称为Changelog Size: 1598:文件大小1598字节 Blocks: 8:文件占用的块数 IO Block: 4096: regular file:文件类型(普通文件) Device: fd01h/64769d:文件所在设备号,分别以十六进制和十进制显示 Inode: 1579435:文件节点号 Links: 1:硬链接数 Access: (0644/-rw-r--r--):访问权限 Uid:所有者ID与名称 Gid:所有者用户组ID与名称 Access:最后访问时间 Modify:最后修改时间 Change:最后状态改变时间 Birth -:无法获知文件创建时间。注意:Linux下的文件未存储文件创建时间 (2)显示文件所在文件系统信息。 [root@TENCENT64 /data/vas_pgg_proj/apps/penguin_game]# stat -f Makefile File: "Makefile" ID: 6f75a4f02634e23e Namelen: 255 Type: ext2/ext3 Block size: 4096 Fundamental block size: 4096 Blocks: Total: 43830967 Free: 30155578 Available: 27923259 Inodes: Total: 11162880 Free: 11077199 信息解释: File: "Makefile":文件名称为"Makefile"; ID: 6f75a4f02634e23e:文件系统ID Namelen: 255:最大文件名称长度 Type: ext2/ext3:文件系统类型名称 Block size: 4096:块大小为4096字节 Fundamental block size: 4096:基本块大小为4096字节 Blocks: Total: 43830967 Free: 30155578 Available: 27923259: Inodes: Total: 11162880 Free: 11077199 ●export 命令: 1.命令简介 export 命令为 Shell 内建命令,用于设置或显示环境变量,环境变量包含变量与函数。 在 Shell 中执行程序时,Shell 会提供一组环境变量。export 可新增、删除或修改环境变量,供后续被执行的程序使用。export 的作用效果仅限于当前登录。 2.命令格式 export [-fn] [NAME[=WORD]]... export -p 3.选项说明 -f 表示 NAME 为函数名称 -n 删除指定的变量。变量实际上并未删除,只是不会输出到后续指令的执行环境中 -p 列出所有的 Shell 环境变量 4.常用示例 (1)定义环境变量并赋值。 export MYNEWV=8 (2)修改指明 Shell 命令搜索路径的环境变量 PATH。 export PATH=$PATH:/usr/local/mysql/bin 查看是否已经设置好,可以使用命令export -p命令来查看,也可以使用 echo 命令打印变量内容。 export -p | grep PATH #或 echo $PATH (3)export 用于 Shell 脚本。 用户登录到 Linux 系统后,系统将启动一个用户 Shell。在这个 Shell 中,可以使用 Shell 命令或声明变量,也可以创建并运行 Shell 脚本程序。系统将创建一个子 Shell 进程。此时,系统中将有两个 Shell 进程,一个是登录时系统启动的 Shell 进程,另一个是系统为运行脚本创建的 Shell 进程。当一个脚本运行完毕,它的脚本 Shell 进程将终止,可以返回到执行该脚本之前的 Shell。从这种意义上来 说,用户可以有许多 Shell 进程,每个 Shell 进程都是由其父 Shell 进程派生的。 如果在一个 Shell 脚本中定义了一个变量,该脚本运行时,这个定义的变量只是该脚本内的一个局部变量,子 Shell 无法引用它。要使某个变量可以在子 Shell 中被引用,可以使用 export 命令对已定义的变量进行导出,称为导出变量。系统在创建每一个新的 Shell 时会拷贝导出变量,子 Shell 可以访问或修改导出变量,但是这种修改父 Shell 看不到。 例如脚本 test1.sh 中调用脚本 test2.sh,test2.sh 中使用 test1.sh 定义的变量shareVar。 test1.sh 定义如下: #!/bin/sh shareVar=666 export shareVar ./test2.sh test2.sh 定义如下: #!/bin/sh echo "in $0" echo $shareVar 执行 test1.sh 输出结果如下: ./test1.sh in ./test2.sh 666 5.Linux 设置环境变量的三种方法 (1)使用 export 命令。 export PATH=$PATH:/usr/local/mysql/bin 注意:直接使用 export 设置的变量都是临时变量,也就是说退出当前的 Shell 为该变量定义的值便不会生效了。我们可以使用如下两种方式使变更永久有效。 (2)修改 /etc/bashrc 或 /etc/profile,加入如下行,对所有用户永久生效。 export PATH=$PATH:/usr/local/mysql/bin 注意:修改完这个文件必须要使用如下命令执行配置文件的内容,在不用重启系统的情况下使修改的内容生效。 source /etc/profile # 或 . /etc/profile (3)修改 ~/.bashrc 或者 ~/.bash_profile 文件,加入如下行,只对当前用户永久生效。 export PATH=$PATH:/usr/local/mysql/bin 修改这个文件之后同样也需要使用 source 或者是 . 命令使配置文件生效。 ●date 命令: 1.命令简介 date 命令用于按照指定格式显示当前时间或者指定的时间,也可以设置系统时间。很多 Shell 脚本里面需要打印不同格式的时间或日期,以及要根据时间和日期执行操作,此时可以使用 date 命令来完成。在类Unix 系统中,日期被存储为一个整数,其大小为协调世界时(UTC)1970 年 1 月 1 日 0 时 0 分 0 秒起流逝的秒数,即 Unix 时间戳。 2.命令格式 date [OPTION]... [+FORMAT] date [-u|--utc|--universal] [MMDDhhmm[[CC]YY][.ss]] 其中,FORMAT为格式控制字符串,可取如下值: %% 字符% %a 星期的简称(Sun~Sat) %A 星期的全称(Sunday~Saturday) %b 月的简称(Jan~Dec) %B 月的全称(January~December) %c 日期和时间(Thu 06 Dec 2018 09:43:53 AM CST)。只输入date指令也会显示同样的结果。 %C 世纪。和%Y比较像,但不显示最后两个数字,如20 %d 一个月的第几天(01~31) %D 日期,等同于%m/%d/%y,如12/06/18 %e 一个月的第几天(1~31),单数字以空格填充,等同于%_d %F 日期,等同于%Y-%m-%d,如2018-12-06 %g 年的最后两个数字(yy),比如2018则输出18,等同于%y %G 年份(yyyy) %h 月的简称(Jan~Dec),等同于%b %H 小时,24小时制(00~23) %I 小时,12小时制(01~12) %j 一年的第几天(001~366) %k 小时,24小时制(0~23)。单数字填充空格,等同于%_H %l 小时,12小时制(1~12)。单数字填充空格,等同于%_I %m 月份(01~12) %M 分钟(00~59) %n 换行符newline %N 纳秒nanoseconds(000000000..999999999) %p 显示出AM或PM %P 显示出am或pm %r 显示时间,12小时制(hh:mm:ss %p) %R 显示小时与分钟,24小时制,等同于%H:%M %s 从1970年1月1日00:00:00到目前经历的秒数 %S 显示秒(00~59) %t Tab符 %T 显示时间,24小时制(hh:mm:ss),等同于%H:%M:%S %u 一周的第几天(1..7)。1表示星期一 %U 一年的第几周,周日为每周的第一天(00..53) %V 一年的第几周,周一为每周的第一天(01..53) %w 一个星期的第几天(0~6),0代表星期天 %W 一年的第几周,周一为每周的第一天(00..53) %x 日期(mm/dd/yyyy),如12/06/2018 %X 时间,等同于%H:%M:%S %y 年的最后两个数字(2018则是18) %Y 年(yyyy) %z 以+hhmm格式显示时区(如+0800) %:z 以+hh:mm格式显示时区(如+08:00) %::z 以+hh:mm:ss格式显示时区(如+08:00:00) %Z 缩写显示时区名称,如CST(China Standard Time) %h,%b 月的简称(Jan~Dec) 填充字符说明:默认地,date命令以0填充数字域,以下填充字符的控制符可以跟在%后使用: - (hyphen,连字符):不进行填充 _ (underscore,下划线):以空格填充 0(zero)以0填充 ^ 尽可能地使用大写输出 # 尽可能地按照相反的大小写进行输出 3.命令选项 -d, --date=STRING:显示由STRING指定的时间,而不是当前时间戳; -f, --file=DATEFILE:显示DATEFILE文件中的每行时间; -I[TIMESPEC], --iso-8601[=TIMESPEC]:以ISO 8601规范格式按照指定精度[TIMESPEC]显示时间。TIMESPEC默认取值为"date",亦可取值'hours', 'minutes', 'seconds', 或 'ns'; -r, --reference=FILE:显示文件的最后修改时间 -R, --rfc-2822:以RFC-2822规定格式显示时间,例如:Wed, 05 Dec 2018 22:10:34 +0800 --rfc-3339=TIMESPEC:以RFC 3339规定格式显示时间,可以由TIMESPEC指明精度,TIMESPEC可取值'date', 'seconds', or 'ns'。例如:2018-12-05 22:09:59.230994842+08:00 -s, --set=STRING:设置系统时间为STRING指定的时间 -u, --utc, --universal:显示或设定为协调世界时(UTC,Coordinated Universal Time)时间格式 --help:显示date命令的帮助信息 --version:显示date命令的版本信息 4.常用示例 (1)获取Unix时间戳。 date +%s 1544067345 (2)将Unix时间戳转换为可读时间。 date -d @1483525407 Wed Jan 4 18:23:27 CST 2017 date -d @1483525407 +"%F %T" 2017-01-04 18:23:27 注意:-d后需跟合法格式的日期,所以时间戳需要添加@符以示区别。 (3)格式化输出当前时间。 date +"%Y-%m-%d %H:%M:%S" 2018-12-06 10:57:33 #或 date +"%F %T" (4)时间加减操作。 date +"%Y-%m-%d %H:%M:%S" //显示当前时间 date -d "+1 day" +"%Y-%m-%d %H:%M:%S" //显示前一天的时间 date -d "-1 day" +"%Y-%m-%d %H:%M:%S" //显示后一天的时间 date -d "-1 month" +"%Y-%m-%d %H:%M:%S" //显示上一月的时间 date -d "+1 month" +"%Y-%m-%d %H:%M:%S" //显示下一月的时间 date -d "-1 year" +"%Y-%m-%d %H:%M:%S" //显示前一年的时间 date -d "+1 year" +"%Y-%m-%d %H:%M:%S" //显示下一年的时间 (5)普通格式转换。 date -d "2009-12-12" +"%Y/%m/%d %H:%M:%S" 2009/12/12 00:00:00 (6)设置系统时间。 date -s "2016-11-11 00:00:00" Fri Nov 11 00:00:00 CST 2016 date Fri Nov 11 00:00:05 CST 2016 ●ipcs 命令: 1.命令简介 ipcs 命令用于查看 Linux 进程间通信设施的状态,包括消息列表、共享内存和信号量的信息。可以帮助开发人员定位进程间通信中出现的问题。 注意,本文描述的是 util-linux 版 ipcs,和其它版本(如 POSIX 版)的实现可能会有出入。 2.命令格式 ipcs [resource-option] [output-format] ipcs [resource-option] -i id 3.命令选项 -i,--id ID 详细显示指定资源 ID 的 IPC 信息。使用时需要指定资源类型,资源包括消息队列(-q)、共享内存(-m)和信号量(-s) -h,--help 显示帮助信息 -V,--version 显示版本信息 IPC 资源类型选项: -q,--queues 显示活动的消息队列信息 -m,--shmems 显示活动的共享内存信息 -s, --semaphores 显示活动的信号量信息 -a,--all 显示系统内所有的IPC信息。命令的默认选项 输出格式选项:当指定多个时,以最后一个为准。 -c,--creator 查看 IPC 的创建者和所有者 -l,--limits 查看 IPC 资源的限制信息 -p,--pid 查看 IPC 资源的创建者和最后操作者的进程 ID -t,--time 查看最新调用 IPC 资源的详细时间。包括 msgsnd() 和 msgrcv() 对 message queues 的操作,shmat() 和 shmdt() 对shared memory 的操作,以及 semop() 对 semaphores 的操作 -u,--summary 查看 IPC 资源状态汇总信息 显示大小单位控制选项:只对选项 -l, --limits 生效 -b,--bytes 以字节为单位显示大小 --human 以可读的格式显示大小 4.常用示例 (1)显示所有IPC信息。 [root@TENCENT64 /]# ipcs ------ Message Queues -------- key msqid owner perms used-bytes messages ------ Shared Memory Segments -------- key shmid owner perms bytes nattch status 0x6674431e 0 root 600 50485760 9 ------ Semaphore Arrays -------- key semid owner perms nsems 0x0000870a 0 root 666 1 (2)显示共享内存指定ID的信息。 [root@TENCENT64 /]# ipcs -m -i 32769 Shared memory Segment shmid=32769 uid=0 gid=0 cuid=0 cgid=0 mode=0666 access_perms=0666 bytes=12000 lpid=2784 cpid=1077 nattch=3 att_time=Thu Dec 27 10:39:32 2018 det_time=Thu Dec 27 10:39:32 2018 change_time=Fri Jul 20 13:17:41 2018 (3)查看 IPC 的创建这和最最后操作者的进程 ID。 ------ Message Queues PIDs -------- msqid owner lspid lrpid ------ Shared Memory Creator/Last-op PIDs -------- shmid owner cpid lpid 0 root 702 23364 32769 root 702 5296 其中 lspid 代表最近一次向消息队列中发送消息的“进程号”,lrpid 对应最近一次从消息队列中读取消息的“进程号”。但请注意:此处的进程号是弱进程号,既它有可能代表的是线程号,如果进程中是起的线程对消息队列发送、接收消息,则此处 pid 对应的均是线程号。可以采用ps -AL | grep pid来查找该线程对应的进程 id。 ●ipcrm 命令: 1.命令简介 ipcrm 命令用于删除指定 ID 的 IPC(Inter-Process Communication,进程间通信)对象,包括消息队列(message queue)、共享内存(shared memory)和信号量(semaphore),同时将与 IPC 对象关联的数据一并删除,只有超级用户或 IPC 对象创建者能够删除。 2.命令格式 ipcrm [OPTIONS] ipcrm {shm | msg | sem} ID... 3.选项说明 -a, --all [shm | msg | sem] 删除所有 IPC 资源。当给定选项参数 shm、msg 或 sem,则只删除指定类型的 IPC 资源。注意:慎用该选项,否则可能会导致某些程序出于不确定状态 -M, --shmem-key SHMKEY 当没有进程与共享内存段绑定时,通过 SHMKEY 删除共享内存段 -m, --shmem-id SHMID 当没有进程与共享内存段绑定时,通过 SHMID 删除共享内存段 -Q, --queue-key MSGKEY 通过 MSGKEY 删除消息队列 -q, --queue-id MSGID 通过 MSGID 删除消息队列 -S, --semaphore-key SEMKEY 通过 SEMKEY 删除信号量 -s, --semaphore-id SEMID 通过 SEMID 删除信号量 -h, --help 显示帮助信息并退出 -V, --version 显示版本信息并退出 -v, --verbose 以冗余模式执行 ipcrm,输出 rpcrm 正在做什么 4.常用示例 (1)删除共享内存。 ipcrm -M SHMKEY # 或 ipcrm -m SHMID # 或 ipcrm shm SHMID (2)删除消息队列。 ipcrm -Q MSGKEY # 或 ipcrm -q MSGID # 或 rpcrm msg MSGID (3)删除信号量。 ipcrm -S SEMKEY # 或 ipcrm -s SEMID # 或 ipcrm sem SEMID (4)删除所有 IPC 资源。请谨慎使用。 ipcrm -v -a removing shared memory segment id `0' removing shared memory segment id `655361' removing shared memory segment id `688130' removing shared memory segment id `720899' removing shared memory segment id `131076' removing shared memory segment id `163845' removing shared memory segment id `753670' removing semaphore id `851968' removing semaphore id `884737' removing semaphore id `917506' removing semaphore id `950275' removing semaphore id `983044' removing semaphore id `1015813' (5)查看 ipcrm 版本。 ipcrm -V ipcrm from util-linux 2.23.2 ●exit 命令(builtin): 1.简介 exit 命令是 Shell 内建命令,用于退出当前 Shell 进程。 2.命令格式 exit N (1)状态码 N 的范围是 0-255,一般情况下,0 表示正常退出,非零表示异常退出。如果是 0-255 之外的数值,则会被强制转换为 uint8_t 类型的数值,比如 -1 会被转换为 255,256 会发生类型宽度截断,被转换为 0; (2)状态码 N 可以不指定,默认是上一条命令的退出状态码。 3.常用示例 (1)退出终端。 exit (2)用于Shell脚本,退出当前Shell进程。 #正常结果 exit 0 #异常退出 exit 1 (3)使用 trap 内建命令,用于挂载 Shell 进程结束前需要执行的命令。格式为:trap “commands” EXIT。如脚本exit.sh: !/bin/bash echo "start" trap "echo 'end'" EXIT echo "before exit" exit 0 执行exit.sh输出: start before exit end ●trap 命令(builtin): 1.命令简介 trap 命令是 Shell 内建命令,用于指定在接收到信号后将要采取的动作。常见的用途是在脚本程序被中断时完成清理工作。 2.命令格式 trap [-lp] [ARG] [SIGSPECS] 3.选项说明 -l 列出信号名称与对应的数值 -p 列出信号与其绑定的命令列表 ARG 与指定信号绑定的命令。如果 ARG 为空字符串,表示忽略信号;如果 ARG 不指定(缺省)或为 -,表示执行信号的默认动作 SIGSPECS 信号列表,可以是信号名称,也可以是信号对应的数值。可用信号可以使用 trap -l 查看 4.常用示例 (1)忽略 HUP、INT、QUIT、TSTP 信号。 trap "" HUP INT QUIT TSTP (2)捕获 HUP、INT、QUIT、TSTP 信号,并执行默认动作。 trap HUP INT QUIT TSTP #或 trap - HUP INT QUIT TSTP (3)挂载 Shell 进程结束前需要执行的命令。格式为:trap “commands” EXIT。如脚本 exit.sh: #!/bin/bash echo "start" trap "echo 'end'" EXIT echo "before exit" exit 0 执行 exit.sh 输出: start before exit end 5.信号简介 信号是一种进程间通信机制,它给应用程序提供一种异步的软件中断,使应用程序有机会接受其他程序发送的命令(即信号)。应用程序收到信号后,有三种处理方式:忽略、默认或捕捉。进程收到一个信号后,会检查对该信号的处理机制。如果是 SIG_IGN,就忽略该信号;如果是 SIG_DFT,则会采用系统默认的处理动作,通常是终止进程或忽略该信号;如果给该信号指定了一个处理函数,则会中断当前进程正在执行的任务,转而去执行该信号的处理函数,返回后再继续执行被中断的任务。 在有些情况下,我们不希望自己的 Shell 脚本在运行时被中断,比如说我们写的 Shell 脚本设为某一用户登录系统后默认执行的 Shell 脚本,使这一用户进入系统后只能做某一项工作,如数据库备份, 我们不希望用户使用 Ctrl+C 发送 SIGINT 信号来中断当前 Shell 脚本的执行,进入到 Shell 交互模式,做我们不希望做的事情。这便用到了信号处理。 以下是一些你可能会遇到的,要在程序中使用的常见的信号: 信号名称 信号数值 默认动作 描述 SIGHUP 1 终止进程 终端连接结束时发出。终端连接断开,会向当前终端连接会话关联的所有前台和后台进程组发送SIGHUP信号,用于终止进程。 SIGINT 2 终止进程 程序终止(Interrupt)信号,通常是由Ctrl+C发出。 SIGQUIT 3 终止进程 和SIGINT类似,通常是Ctrl+/发出。进程在收到SIGQUIT信号退出时会产生core文件, 在这个意义上类似于一个程序错误信号。 SIGFPE 8 终止进程,建立CORE文件 在发生致命的算术运算错误(Floating-Point Exception)时发出,不仅包括浮点运算错误, 还包括溢出及除数为0等其它所有的算术错误。 SIGKILL 9 终止进程 用来立即结束程序的运行。本信号不能被阻塞, 处理和忽略。 SIGSEGV 11 终止进程,建立CORE文件 段错误(Segmentation Fault)信号。进程试图访问非法内存地址,如往没有写权限的内存地址写数据时会触发段错误。 SIGALRM 14 终止进程 时钟定时信号, 计时器到时会发出该信号。alarm()函数使用该信号。 SIGTERM 15 终止进程 程序结束(Terminate)信号, 与SIGKILL不同的是该信号可以被阻塞和处理。通常用来要求程序自己正常退出。Shell命令kill缺省产生这个信号。 SIGCHLD 17 忽略信号 子进程结束时, 父进程会收到这个信号 详细的信号列表,可以使用命令trap -l或kill -l查看,也可以查看头文件。例如,执行trap -l,查看系统支持的所有信号如下: 1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL 5) SIGTRAP 6) SIGABRT 7) SIGBUS 8) SIGFPE 9) SIGKILL 10) SIGUSR1 11) SIGSEGV 12) SIGUSR2 13) SIGPIPE 14) SIGALRM 15) SIGTERM 16) SIGSTKFLT 17) SIGCHLD 18) SIGCONT 19) SIGSTOP 20) SIGTSTP 21) SIGTTIN 22) SIGTTOU 23) SIGURG 24) SIGXCPU 25) SIGXFSZ 26) SIGVTALRM 27) SIGPROF 28) SIGWINCH 29) SIGIO 30) SIGPWR 31) SIGSYS 34) SIGRTMIN 35) SIGRTMIN+1 36) SIGRTMIN+2 37) SIGRTMIN+3 38) SIGRTMIN+4 39) SIGRTMIN+5 40) SIGRTMIN+6 41) SIGRTMIN+7 42) SIGRTMIN+8 43) SIGRTMIN+9 44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12 47) SIGRTMIN+13 48) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14 51) SIGRTMAX-13 52) SIGRTMAX-12 53) SIGRTMAX-11 54) SIGRTMAX-10 55) SIGRTMAX-9 56) SIGRTMAX-8 57) SIGRTMAX-7 58) SIGRTMAX-6 59) SIGRTMAX-5 60) SIGRTMAX-4 61) SIGRTMAX-3 62) SIGRTMAX-2 63) SIGRTMAX-1 64) SIGRTMAX ●netstat 命令: 1.命令简介 netstat 命令用来打印 Linux 系统的网络状态信息,包括网络连接(network connections)、路由表(routing tables)、网络接口设备统计信息(interface statistics)、伪连接(masquerade connections)和多播成员信息(multicast memberships)等,得知 Linux 系统网络的整体情况。 如我们可以通过 netstat 获知系统当前被监听的端口号列表。 netstat 是通过读取 /proc/net/ 路径下的 tcp、udp、unix 等文件来获取连接信息的。 2.命令格式 netstat [OPTIONS] 3.选项说明 -a, --all 显示所有网络连接 -A,--protocol=FAMILY 列出指定地址族的连接信息。FAMILY 为逗号分隔的地址族关键字列表,比如inet,inet6,unix,ipx,ax25,netrom,econet 和 ddp 等 -c,--continuous 每隔 1s 刷新网络状态 -C 从路由缓存获取路由信息 -e, --extend 显示网络其他相关信息 -F 显示 FIB 中的路由信息(默认选项) -g, --g 显示 IPv4 和 IPv6 的多播组成员关系信息 -h, --help 显示帮助信息 -i, -I=IFACE, --interfaces=IFACE 显示所有网络接口或指定的网络接口 -l, --listening 显示监听中的套接字(默认选项) -M, --masquerade 显示伪装的网络连接 -n, --numeric 以数字形式而不是以符号显示主机、端口或用户名。 --numeric-hosts 以数字形式显示主机地址 --numeric-ports 以数字形式显示端口号 --numeric-users 以数字形式显示用户名 -N, --netlink, --symbolic 显示网络硬件外围设备的符号连接名称 -o, --timers 显示计时器 -p, --programs 显示正在使用 Socket 的进程 ID 和进程名 -r, --route 显示内核路由表。命令 route -e 会产生同样的结果 -s, --statistice 显示每种协议的统计信息 -t, --tcp 显示TCP传输协议的连接状况 -u, --udp 显示 UDP 传输协议的连接状况 -v, --verbose 显示指令执行过程。特别是打印一些关于未配置地址族的有用信息 -V, --version 显示版本信息 -w, --raw 显示 RAW 传输协议的连接状况 -x, --unix 此参数的效果和指定 "-A unix" 参数相同 --ip, --inet 此参数的效果和指定 "-A inet" 参数相同 4.常用示例 (1)列出所有端口信息(包括监听和未监听的)。 列出所有端口。 netstat -an Active Internet connections (servers and established) Proto Recv-Q Send-Q Local Address Foreign Address State tcp 0 0 localhost:30037 *:* LISTEN udp 0 0 *:bootpc *:* Active UNIX domain sockets (servers and established) Proto RefCnt Flags Type State I-Node Path unix 2 [ ACC ] STREAM LISTENING 6135 /tmp/.X11-unix/X0 unix 2 [ ACC ] STREAM LISTENING 5140 /var/run/acpid.socket ... 列出所有 tcp 端口。 netstat -ant 列出所有 UDP 端口。 netstat -anu (2)列出所有处于监听状态的连接。 显示处于监听状态的所有连接。 netstat -ln Active Internet connections (only servers) Proto Recv-Q Send-Q Local Address Foreign Address State tcp 0 0 localhost:ipp *:* LISTEN tcp6 0 0 localhost:ipp [::]:* LISTEN udp 0 0 *:49119 *:* 只显示处于监听状态的 tcp 连接。 netstat -lnt 只显示处于监听状态的 udp 连接。 netstat -lnu 只显示处于监听状态的 unix 连接。 netstat -lnx (3)显示每个协议的统计信息。 显示所有端口的统计信息。 netstat -s Ip: 11150 total packets received 1 with invalid addresses 0 forwarded 0 incoming packets discarded 11149 incoming packets delivered 11635 requests sent out Icmp: 0 ICMP messages received 0 input ICMP message failed. Tcp: 582 active connections openings 2 failed connection attempts 25 connection resets received Udp: 1183 packets received 4 packets to unknown port received. ..... 显示 TCP 端口的统计信息。 netstat -st 显示 UDP 端口统计信息。 netstat -su (4)显示进程 ID 和名称。 netstat -p Active Internet connections (w/o servers) Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name tcp 0 0 10.234.178.144:43538 100.113.169.225:31415 ESTABLISHED - tcp 0 0 10.234.178.144:33295 10.121.151.35:sd ESTABLISHED 5354/VipMQAgent tcp 0 0 10.234.178.144:21095 100.92.40.70:bacula-dir ESTABLISHED 25164/pgg_login_cme (5)以数字形式显示主机、端口和用户名。这样可以加速输出,因为不用进行比对查询。 netstat -n Active Internet connections (w/o servers) Proto Recv-Q Send-Q Local Address Foreign Address State tcp 0 0 10.234.178.144:43538 100.113.169.225:31415 ESTABLISHED tcp 0 0 10.234.178.144:33295 10.121.151.35:9876 ESTABLISHED 如果只是不想让这三个名称中的一个被显示,使用以下命令 netsat -a --numeric-ports netsat -a --numeric-hosts netsat -a --numeric-users (6)每隔一秒持续输出 netstat 信息。 netstat -c (7)显示系统不支持的地址族 (Address Families)。 netstat --verbose 在输出的末尾,会有如下的信息 netstat: no support for `AF IPX' on this system. netstat: no support for `AF AX25' on this system. netstat: no support for `AF X25' on this system. netstat: no support for `AF NETROM' on this system. (8)显示核心路由信息。 netstat -r Kernel IP routing table Destination Gateway Genmask Flags MSS Window irtt Iface 0.0.0.0 0.0.0.0 0.0.0.0 U 0 0 0 tunnat 9.0.0.0 10.175.82.193 255.0.0.0 UG 0 0 0 eth1 10.0.0.0 10.175.82.193 255.0.0.0 UG 0 0 0 eth1 注意:使用 netstat -rn 显示数字格式,不查询主机名称。 (9)找出程序运行的端口。并不是所有的进程都能找到,没有权限的会不显示,使用 root 权限查看所有的信息。 netstat -anp Active Internet connections (servers and established) Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name tcp 0 0 10.175.82.204:61795 0.0.0.0:* LISTEN 22006/./spp_pgg_dia tcp 0 0 10.175.82.204:55011 0.0.0.0:* LISTEN 3228/./spp_pgg_vod_ tcp 0 0 10.175.82.204:10883 0.0.0.0:* LISTEN 125115/./spp_pgg_co (10)显示网络接口列表。 netstat -i Kernel Interface table Iface MTU RX-OK RX-ERR RX-DRP RX-OVR TX-OK TX-ERR TX-DRP TX-OVR Flg eth1 1500 32898847246 0 0 51410 34664370715 0 0 0 BMRU lo 65536 57852071211 0 0 0 57852071211 0 0 0 LRU tunnat 1480 0 0 0 0 103182603 0 0 0 OPRU 显示详细信息,可以使用 ifconfig 或者 netstat -ie。 netstat -ie Kernel Interface table eth1: flags=4163 mtu 1500 inet 10.175.82.204 netmask 255.255.255.192 broadcast 10.175.82.255 ether ec:f4:bb:e3:5b:b1 txqueuelen 10000 (Ethernet) RX packets 32900073183 bytes 21958447410400 (19.9 TiB) RX errors 0 dropped 0 overruns 51410 frame 0 TX packets 34665611337 bytes 7109591105017 (6.4 TiB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 device memory 0x91d00000-91e00000 ... (11)IP 和 TCP 分析。 查看本机连接的服务端口中连接数 TOP 的服务端 IP。其中 10.234.178.144:22 为本地 IP 端口。 netstat -ant | grep "10.234.178.144:22" |awk '{print $5}'|awk -F: '{print $1}'|sort|uniq -c|sort -nr|head -10 24 100.112.141.208 2 10.63.93.159 2 10.191.131.38 2 10.101.242.11 2 100.92.40.70 2 100.113.141.219 2 100.112.159.163 1 9.68.178.53 1 10.191.134.83 1 10.139.233.47 第二列为服务端IP,左边是本地发起的连接数。 (b)查看 TCP 各种状态列表。 netstat -ant | awk '{print $6}' | sort | uniq CLOSE_WAIT established) ESTABLISHED Foreign LISTEN TIME_WAIT (12)显示多播组信息。 netstat -g IPv6/IPv4 Group Memberships Interface RefCnt Group --------------- ------ --------------------- lo 1 all-systems.mcast.net eth1 1 all-systems.mcast.net tunnat 1 all-systems.mcast.net lo 1 ff02::1 lo 1 ff01::1 eth0 1 ff02::1 eth0 1 ff01::1 eth1 1 ff02::1 netstat 的大部分功能都介绍了,如果想知道 netstat 更高级的功能,请参考 netstat 帮助手册。 5.输出结果整体说明 执行 netstat 命令输出: Active Internet connections (w/o servers) Proto Recv-Q Send-Q Local Address Foreign Address State tcp 0 0 9.77.9.126:47239 100.115.0.57:9922 ESTABLISHED tcp 0 52 9.77.9.126:36000 10.19.88.119:58814 ESTABLISHED tcp 0 0 9.77.9.126:37586 10.170.31.139:nsesrvr ESTABLISHED udp 0 0 TENCENT64:acp-proto TENCENT64:openwebnet ESTABLISHED udp 0 0 TENCENT64:4216 TENCENT64:openwebnet ESTABLISHED Active UNIX domain sockets (w/o servers) Proto RefCnt Flags Type State I-Node Path unix 2 [ ] DGRAM 307286163 /tmp/agent_cmd.sock unix 2 [ ] DGRAM 9484 /var/run/nscd/socket unix 2 [ ] DGRAM 275 /run/systemd/notify ... 从整体上看 netstat 的输出结果可以分为两个部分。一个是 Active Internet connections,二是 Active UNIX domain sockets。 (1)Active Internet connections。 Active Internet connections 表示活跃的网络连接,包括 UDP 和 TCP连接信息。 其中"Recv-Q"和"Send-Q"指接收队列和发送队列,这些数字一般都应该是0,如果不是则表示数据发送和接收队列存在堆积,这种情况较为少见。 Local Address 和 Foreign Address 表示本地和远端的 IP、端口; State 表示连接的状态,主要有: LISTEN:监听状态; SYN_SEND:客户端在发送连接请求后进入SYN_SEND状态,等待服务端的连接请求和确认,即等待服务端发送SYN+ACK包; SYN_RECV:服务端在收到客户端的连接请求后,发送SYN+ACK包后,进入SYN_RECV状态; ESTABLISHED:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK后,客户端和服务器进入已建立连接状态; FIN-WAIT-1:客户端发送连接中断请求后进入FIN-WAIT-1状态,等待服务端的确认; FIN-WAIT-2:客户端接收到服务端的终端确认后进入FIN-WAIT-2状态,等待服务端的中断请求; CLOSE-WAIT:服务端在确认客户端的中断请求后,进入CLOSE-WAIT状态,等待从本地用户发来的连接中断请求; LAST-ACK:服务端向客户端发送连接中断请求后进入LAST-ACK状态,等待来自客户端的中断请求确认; TIME-WAIT:客户端发送中断请求确认后进入TIME-WAIT状态,等待足够的时间(2MSL)以确保服务端接收到来自客户端的中断请求确认; CLOSED:四次挥手结束后,客户端和服务端进入连接断开状态。 (2)Active UNIX domain sockets。 Active UNIX domain sockets,称为活跃 Unix 域套接字。 Proto 显示连接使用的协议; RefCnt 表示使用数量,即通过此套接字连接的进程数; Flags 显示的标志为 SO_ACCEPTON(显示为 ACC)、SO_WAITDATA(W)或 SO_NOSPACE(N)。如果相应的进程等待一个连接请求,那么 SO_ACCECPTON 用于未连接的套接字。其它标志通常并不重要。 Types 显示套接口的类型,一般为 DGRAM(数据报)和 STREAM(数据流); State 显示套接字当前的状态,此字段包含以下关键字之一: FREE:套接字未分配。 LISTENING:套接字正在监听一个连接请求。除非设置 --listening (-l) 或者 --all (-a) 选项,否则不显示。 CONNECTING:套接字正要建立连接 CONNECTED:套接字已连接 DISCONNECTING:套接字已断开 (empty):套接字未连 I-Node 表示套接字的 Inode 节点号; Path 表示套接字所在路径。 ●telnet 命令: 1.简介 telnet 是基于 Telnet 协议的远程登录程序,用于登录远程主机,对远程主机进行管理。 telnet 因采用明文传送报文,安全性不好,很多 Linux 服务器都不开放 telnet 服务,而改用更安全的 ssh 方式了。但仍然有很多别的系统可能采用了 telnet 方式来提供远程登录,因此弄清楚 telnet 的使用方式仍是很有必要的。 telnet 命令还可做别的用途,比如确定远程服务器的某个端口是否能访问。 此外,Telnet 协议是 TCP/IP 协议族中的一员,是 Internet 远程登录服务的标准协议,属于应用层协议,基于 TCP 协议实现远程登录。 2.命令格式 telnet [-8EFKLacdfrx] [-X authtype] [-b hostalias] [-e escapechar] [-k realm] [-l user] [-n tracefile] [host [port]] 3.选项说明 -8 允许使用 8 位字符资料,包括输入与输出 -a 尝试自动登入远端系统 -b HOSTALIAS 使用别名指定远端主机名称 -c 不读取用户专属目录里的.telnetrc文件 -d 启动排错模式 -e ESCAPECHAR 设置转义字符 -E 滤除转义字符 -f 此选项的效果和指定 -F 相同 -F 使用 Kerberos V5 认证时,加上此参数可把本地主机的认证数据上传到远端主机 -k 使用 Kerberos 认证时,加上此参数让远端主机采用指定的域名,而非该主机的域名去获取票据 -K 不自动登入远端主机 -l USER 指定要登入远端主机的用户名称 -L 允许输出 8 位字符资料 -n TRACEFILE 指定文件记录相关信息 -r 使用类似 rlogin 指令的用户界面 -x 假设主机有支持数据加密的功能,就使用它 -X ATYPE 关闭指定的认证类型 4.常用示例 (1)登录主机。不显示提供端口,默认为 23。 telnet 192.168.0.5 (2)确认远端服务器某个端口是否可用。比如查看远端服务器 ssh 服务的 22 号端口是否开放。 telnet 10.234.178.144 22 Trying 10.234.178.144... Connected to 10.234.178.144. Escape character is '^]'. SSH-2.0-OpenSSH_6.0 以上表示远端服务器 ssh 服务的 22 号端口已经开放。注意,这并不表示使用 ssh 命令一定可以与远端服务器建立 SSH 链接,需要远端服务器的授权。 (3)进入命令行交互模式。 如果在没有 host 参数的情况下调用 telnet,它将进入命令模式,提示符为 telnet>。 telnet telnet> 交互模式下常用子命令有: auth [...]:查看和管理telnet登录身份验证方式。argument可取值:disable、enable和status close:关闭当前 Telnet 连接 display:使用 display 命令可以查看 Telnet 客户端的当前设置 logout:类似于cloase命令,用于关闭Telnet连接或者挂起。注:Telnet服务端可能不支持 open [-l user] [[-] port]:建立到指定主机的 Telnet 连接 send :使用send命令可以向Telnet服务器发送特定字符串。支持包括但不限于以下命令字符串: abort:终止服务命令 ao:Abort Output,放弃输出命令 ayt:Are you there命令 brk:Break命令 eof:发送End Of File字符 escape:发送当前的转义字符,初始为分组符^]。 ip:中断进程命令 synch:执行Telnet同步操作。 quit:退出 Telnet 客户端。 status:显示当前Telnet连接状态 ●objdump 命令: 1.功能简介 objdump 命令是 GNU Binutils 二进制工具集的一员,用于查看目标文件或可执行文件的组成信息,以可读的形式打印二进制文件的内容。 2.命令格式 objdump [OPTIONS] OBJFILES 3.选项说明 -a, --archive-headers 显示档案头信息,展示档案每一个成员的文件格式。效果等同于命令 ar -tv -b, --target=BFDNAME 指定目标码格式。这不是必须的,objdump 能自动识别许多格式,比如 objdump -b oasys -m vax -h fu.o 显示 fu.o 的头部摘要信息,明确指出该文件是 Vax 系统下用 Oasys 编译器生成的目标文件。objdump -i 将给出这里可以指定的目标码格式列表 -C, --demangle[=STYLE] 目标文件中的符号解码成用户级名称。比如移除符号修饰时在变量与函数名前添加的下划线等。 -d, --disassemble 反汇编目标文件,将机器指令反汇编成汇编代码 -D, --disassemble-all 与 -d 类似,但反汇编所有段(section) -z, --disassemble-zeroes 一般反汇编输出将省略零块,该选项使得这些零块也被反汇编 -EB, -EL,--endian={big | little} 指定目标文件的字节序,在目标文件没描述字节序时很有用,例如 S-records。这个选项只影响反汇编 -f, --file-headers 显示每一个目标文件的头信息 -F, --file-offsets 反汇编时,打印每一个符号的偏移地址 --file-start-context 显示源码/汇编代码(假设为 -S)时,将上下文扩展到文件的开头 -g, --debugging 显示调试信息。企图解析保存在文件中的调试信息并以 C 语言的语法显示出来。仅仅支持某些类型的调试信息。有些其他的格式被readelf -w支持 -e, --debugging-tags 类似 -g 选项,但是生成的信息是和ctags工具相兼容的格式 -h, --section-headers, --headers 显示目标文件各个 section 的头部摘要信息 -i, --info 显示对于 -b 或者 -m 选项可用的架构和目标格式列表 -j, --section=NAME 仅显示指定名称的 section 的信息 -l, --line-numbers 用文件名和行号标注相应的目标代码,仅仅和 -d、-D 或者 -r 一起使用 -S,--source 反汇编时尽可能使用源代码表示。隐含了-d参数 -m, --architecture=MACHINE 指定反汇编目标文件时使用的架构,当待反汇编文件本身没描述架构信息的时候(比如S-records),这个选项很有用。可以用-i选项列出这里能够指定的架构 -M, --disassembler-options=OPTIONS 给反汇编程序传递参数,可以指定多个,使用逗号分隔 -p, --private-headers 打印目标文件格式的特定信息。打印的信息取决于目标文件格式,对于某些目标文件格式,不打印任何附加信息。 -P, --private=OPTIONS 打印目标文件格式的特定信息。OPTIONS 是一个逗号分隔的列表。例如对于XCOFF,可用的选项有 header, aout, sections, syms, relocs, lineno, loader, except, typchk, traceback and toc -r, --reloc 显示文件的重定位入口。如果和-d或者-D一起使用,重定位部分以反汇编后的格式显示出来 -R, --dynamic-reloc 显示文件的动态重定位入口,仅仅对于动态目标文件意义,比如某些共享库 -s, --full-contents 显示section的完整内容。默认所有的非空section都会被显示 -W[lLiaprmfFsoRt],--dwarf=[rawline,=decodedline,=info,=abbrev,=pubnames,=aranges,=macro,=frames,=frames-interp,=str,=loc,=Ranges,=pubtypes,=trace_info,=trace_abbrev,=trace_aranges,=gdb_index] 显示文件中调试段的内容,如果存在的话 -G, --stabs 显示请求的任何 section 的全部内容。显示段 .stab、.stab.index 和 .stab.excl 的内容 -t, --syms 显示文件的符号表入口。类似于nm -s提供的信息 -T, --dynamic-syms 显示文件的动态符号表入口,仅仅对动态目标文件意义,比如某些共享库。它显示的信息类似于 nm -D,--dynamic 显示的信息 -x, --all-headers 显示所可用的头信息,包括符号表、重定位入口。-x 等价于 -a -f -h -p -r -t 同时指定 -w, --wide 为具有超过80列的输出设备格式化某些行。也不要在显示符号名称时截断符号名称 --start-address=ADDRESS 从指定地址开始显示数据,该选项影响 -d、-r 和 -s 选项的输出 --stop-address=ADDRESS 显示数据直到指定地址为止,该项影响-d、-r和-s选项的输出 --prefix-addresses 反汇编的时候,显示每一行的完整地址。这是一种比较老的反汇编格式 --no-show-raw-insn 反汇编时,不显示汇编指令的机器码。当使用--prefix-addresses时,这是缺省选项 --adjust-vma=OFFSET 当解析信息时,首先给所有的段添加偏移值offset。当段地址与符号表不符时,这个选项很有用。比如将段放置到特殊地址,因为某个格式无法表示段地址,比如 a.out --special-syms 显示特殊符号与用户不关心的符号 --prefix=PREFIX 当使用 -S 时,指定前缀添加到绝对路径中 --prefix-strip=LEVEL 指定剥离绝对路径中多少个前缀目录名。此选项只有在使用了选项 --prefix=PREFIX 才有效 --insn-width=WIDTH 指定反汇编后的指令输出的行宽,单位字节 -V, --version 版本信息 -H, --help 帮助信息 4.常用示例 首先给出后面大部分测试所基于的源代码以及编译指令。 涉及两个 C++ 源文件。 objdump.cpp: #include void print() { std::cout<<"objdump"< using namespace std; void print(); int main() { print(); } 使用-g选项加入调试信息,分别编译生成目标文件objdump.o与main.o。 g++ -c -g objdump.cpp -o objdump.o g++ -c -g main.cpp -o main.o 然后通过ar命令将两个目标文件打包成静态库libobjdump.a。 ar crv libobjdump.a main.o objdump.o (1)查看档案包含的目标文件列表。 [root@TENCENT64 ~]# objdump -a libobjdump.a In archive libobjdump.a: main.o: file format elf64-x86-64 rw-r--r-- 0/0 18696 Mar 8 20:25 2019 main.o objdump.o: file format elf64-x86-64 rw-r--r-- 0/0 21352 Mar 8 20:25 2019 objdump.o 使用命令ar -tv也可以列出档案中包含的目标文件。 [root@TENCENT64 ~]# ar -tv libobjdump.a rw-r--r-- 0/0 18696 Mar 8 20:25 2019 main.o rw-r--r-- 0/0 21352 Mar 8 20:25 2019 objdump.o (2)显示目标文件objdump.o的代码段(.text)内容。 [root@TENCENT64 ~]# objdump --section=.text -s objdump.o objdump.o: file format elf64-x86-64 Contents of section .text: 0000 554889e5 be000000 00bf0000 0000e800 UH.............. 0010 000000be 00000000 4889c7e8 00000000 ........H....... 0020 5dc35548 89e54883 ec10897d fc8975f8 ].UH..H....}..u. 0030 837dfc01 7527817d f8ffff00 00751ebf .}..u'.}.....u.. 0040 00000000 e8000000 00ba0000 0000be00 ................ 0050 000000bf 00000000 e8000000 00c9c355 ...............U 0060 4889e5be ffff0000 bf010000 00e8b0ff H............... 0070 ffff5dc3 ..]. 注意,不能单独使用-j或者–section选项,一定要加上-s选项。 (3)反汇编objdump.o中的text段内容,并尽可能用源代码形式表示。 [root@TENCENT64 ~]# objdump --section=.text -S objdump.o objdump.o: file format elf64-x86-64 Disassembly of section .text: 0000000000000000 <_Z5printv>: #include void print() { 0: 55 push %rbp 1: 48 89 e5 mov %rsp,%rbp std::cout<<"objdump"< 13: be 00 00 00 00 mov $0x0,%esi 18: 48 89 c7 mov %rax,%rdi 1b: e8 00 00 00 00 callq 20 <_Z5printv+0x20> } 20: 5d pop %rbp 21: c3 retq 0000000000000022 <_Z41__static_initialization_and_destruction_0ii>: 22: 55 push %rbp 23: 48 89 e5 mov %rsp,%rbp 26: 48 83 ec 10 sub $0x10,%rsp 2a: 89 7d fc mov %edi,-0x4(%rbp) 2d: 89 75 f8 mov %esi,-0x8(%rbp) 30: 83 7d fc 01 cmpl $0x1,-0x4(%rbp) 34: 75 27 jne 5d <_Z41__static_initialization_and_destruction_0ii+0x3b> 36: 81 7d f8 ff ff 00 00 cmpl $0xffff,-0x8(%rbp) 3d: 75 1e jne 5d <_Z41__static_initialization_and_destruction_0ii+0x3b> extern wostream wclog; /// Linked to standard error (buffered) #endif //@} // For construction of filebuffers for cout, cin, cerr, clog et. al. static ios_base::Init __ioinit; 3f: bf 00 00 00 00 mov $0x0,%edi 44: e8 00 00 00 00 callq 49 <_Z41__static_initialization_and_destruction_0ii+0x27> 49: ba 00 00 00 00 mov $0x0,%edx 4e: be 00 00 00 00 mov $0x0,%esi 53: bf 00 00 00 00 mov $0x0,%edi 58: e8 00 00 00 00 callq 5d <_Z41__static_initialization_and_destruction_0ii+0x3b> 5d: c9 leaveq 5e: c3 retq 000000000000005f <_GLOBAL__sub_I__Z5printv>: 5f: 55 push %rbp 60: 48 89 e5 mov %rsp,%rbp 63: be ff ff 00 00 mov $0xffff,%esi 68: bf 01 00 00 00 mov $0x1,%edi 6d: e8 b0 ff ff ff callq 22 <_Z41__static_initialization_and_destruction_0ii> 72: 5d pop %rbp 73: c3 retq (3)显示目标文件的符号表入口。 [root@TENCENT64 ~]# objdump -t objdump.o objdump.o: file format elf64-x86-64 SYMBOL TABLE: 0000000000000000 l df *ABS* 0000000000000000 objdump.cpp 0000000000000000 l d .text 0000000000000000 .text 0000000000000000 l d .data 0000000000000000 .data 0000000000000000 l d .bss 0000000000000000 .bss 0000000000000000 l O .bss 0000000000000001 _ZStL8__ioinit 0000000000000000 l d .rodata 0000000000000000 .rodata 0000000000000022 l F .text 000000000000003d _Z41__static_initialization_and_destruction_0ii 000000000000005f l F .text 0000000000000015 _GLOBAL__sub_I__Z5printv 0000000000000000 l d .init_array 0000000000000000 .init_array 0000000000000000 l d .debug_info 0000000000000000 .debug_info 0000000000000000 l d .debug_abbrev 0000000000000000 .debug_abbrev 0000000000000000 l d .debug_aranges 0000000000000000 .debug_aranges 0000000000000000 l d .debug_line 0000000000000000 .debug_line 0000000000000000 l d .debug_str 0000000000000000 .debug_str 0000000000000000 l d .note.GNU-stack 0000000000000000 .note.GNU-stack 0000000000000000 l d .eh_frame 0000000000000000 .eh_frame 0000000000000000 l d .comment 0000000000000000 .comment 0000000000000000 g F .text 0000000000000022 _Z5printv 0000000000000000 *UND* 0000000000000000 _ZSt4cout 0000000000000000 *UND* 0000000000000000 _ZStlsISt11char_traitsIcEERSt13basic_ostreamIcT_ES5_PKc 0000000000000000 *UND* 0000000000000000 _ZSt4endlIcSt11char_traitsIcEERSt13basic_ostreamIT_T0_ES6_ 0000000000000000 *UND* 0000000000000000 _ZNSolsEPFRSoS_E 0000000000000000 *UND* 0000000000000000 _ZNSt8ios_base4InitC1Ev 0000000000000000 *UND* 0000000000000000 .hidden __dso_handle 0000000000000000 *UND* 0000000000000000 _ZNSt8ios_base4InitD1Ev 0000000000000000 *UND* 0000000000000000 __cxa_atexit 这里,输出的信息类似nm -s命令的输出,相比较之下,nm命令的输出如下: [root@TENCENT64 ~]# nm -s objdump.o U __cxa_atexit U __dso_handle 000000000000005f t _GLOBAL__sub_I__Z5printv 0000000000000022 t _Z41__static_initialization_and_destruction_0ii 0000000000000000 T _Z5printv U _ZNSolsEPFRSoS_E U _ZNSt8ios_base4InitC1Ev U _ZNSt8ios_base4InitD1Ev U _ZSt4cout U _ZSt4endlIcSt11char_traitsIcEERSt13basic_ostreamIT_T0_ES6_ 0000000000000000 b _ZStL8__ioinit U _ZStlsISt11char_traitsIcEERSt13basic_ostreamIcT_ES5_PKc (4)显示目标文件各个段的头部摘要信息。 [root@TENCENT64 ~]# objdump -h objdump.o objdump.o: file format elf64-x86-64 Sections: Idx Name Size VMA LMA File off Algn 0 .text 00000074 0000000000000000 0000000000000000 00000040 2**2 CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE 1 .data 00000000 0000000000000000 0000000000000000 000000b4 2**2 CONTENTS, ALLOC, LOAD, DATA 2 .bss 00000001 0000000000000000 0000000000000000 000000b4 2**2 ALLOC 3 .rodata 00000008 0000000000000000 0000000000000000 000000b4 2**0 CONTENTS, ALLOC, LOAD, READONLY, DATA 4 .init_array 00000008 0000000000000000 0000000000000000 000000c0 2**3 CONTENTS, ALLOC, LOAD, RELOC, DATA 5 .debug_info 000014f9 0000000000000000 0000000000000000 000000c8 2**0 CONTENTS, RELOC, READONLY, DEBUGGING 6 .debug_abbrev 0000039f 0000000000000000 0000000000000000 000015c1 2**0 CONTENTS, READONLY, DEBUGGING 7 .debug_aranges 00000030 0000000000000000 0000000000000000 00001960 2**0 CONTENTS, RELOC, READONLY, DEBUGGING 8 .debug_line 00000244 0000000000000000 0000000000000000 00001990 2**0 CONTENTS, RELOC, READONLY, DEBUGGING 9 .debug_str 00000e4c 0000000000000000 0000000000000000 00001bd4 2**0 CONTENTS, READONLY, DEBUGGING 10 .comment 0000002d 0000000000000000 0000000000000000 00002a20 2**0 CONTENTS, READONLY 11 .note.GNU-stack 00000000 0000000000000000 0000000000000000 00002a4d 2**0 CONTENTS, READONLY 12 .eh_frame 00000078 0000000000000000 0000000000000000 00002a50 2**3 CONTENTS, ALLOC, LOAD, RELOC, READONLY, DATA ●readelf 命令: 1.功能简介 readelf 用于读取 ELF(Executable and Linkable Format)格式文件的详细信息,包括目标文件、可执行文件、共享目标文件与核心转储文件。 1.1 ELF 文件分类 (1)可重定位文件(Relocatable File),这类文件包含了代码和数据,用于链接生成可以执行文件或共享目标文件,目标文件和静态链接库均属于可重定位文件,例如*.o或lib*.a文件; (2)可执行文件(Executable File),用于生成进程映像,载入内存执行。Linux 环境下的 ELF 可执行文件一般没有扩展名,例如用户命令 ls; (3)共享目标文件(Shared Object File),这种文件包含了代码和数据,用于和可重定位文件或其他共享目标文件一起生成可执行文件。例如 Linux 的动态共享对象(Dynamic Shared Object),C 语言运行时库 glibc-2.5.so; (4)核心转储文件(Core Dump File),当进程意外终止时,系统可以将该进程的地址空间的内容及终止时的一些其他信息转储到核心转储文件。例如 Linux 下的 core dump。 1.2 ELF 文件组成 ELF 文件头描述了 ELF 文件的总体信息,包括系统相关、类型相关、加载相关和链接相关的信息。 (1)系统相关,比如ELF 文件标识的魔数,以及硬件和平台等相关信息,增加了 ELF 文件的移植性,使交叉编译成为可能; (2)类型相关,比如 ELF 文件类型,分别有目标文件、可执行文件、动态链接库与核心转储文件; (3)加载相关,比如程序头,描述了 ELF 文件被加载时的段信息; (4)链接相关,比如节头,描述了 ELF 文件的节信息。 2.命令格式 readelf