diff --git a/FORMAT.md b/FORMAT.md index 9a73164b..39b4df64 100644 --- a/FORMAT.md +++ b/FORMAT.md @@ -75,3 +75,6 @@ * 在写笔记的过程中应该控制好,“知识类”笔记的粒度。不能把一些没用的什么优势劣势啥玩意的也写上。又不是应付考试。你现在要做的是记住原理跟方法,当然就会知道这种思想的优势和劣势。 * 粗粒度的笔记开始。尽量只记录关键点和关键点的解析。 +补充一个安装Ubuntu系统的方法 + +https://blog.csdn.net/baidu_36602427/article/details/86548203/ \ No newline at end of file diff --git a/Linux/Linux系统编程/概述.md b/Linux/Linux系统编程/概述.md new file mode 100644 index 00000000..b11640ac --- /dev/null +++ b/Linux/Linux系统编程/概述.md @@ -0,0 +1,5 @@ +# 概述 + +如何在系统下,使用Linux提供的接口完成系统编程。 + +包括文件的读写。 \ No newline at end of file diff --git a/Linux/Linxu并发编程/概述.md b/Linux/Linxu并发编程/概述.md new file mode 100644 index 00000000..c3d6c782 --- /dev/null +++ b/Linux/Linxu并发编程/概述.md @@ -0,0 +1,3 @@ +# 概述 + +如何在Linux系统下,使用Linux提供的接口实现并发编程。 diff --git a/Linux/Linxu网络编程/概述.md b/Linux/Linxu网络编程/概述.md new file mode 100644 index 00000000..494d58dc --- /dev/null +++ b/Linux/Linxu网络编程/概述.md @@ -0,0 +1,3 @@ +# 概述 + +如何在Linux系统下,使用Linux提供的网络接口,实现网络编程 \ No newline at end of file diff --git a/Linux/command/ab.md b/Linux/command/ab.md new file mode 100644 index 00000000..38f32619 --- /dev/null +++ b/Linux/command/ab.md @@ -0,0 +1,122 @@ +ab +=== + +Apache服务器的性能测试工具 + +## 补充说明 + +**ab命令** 是一个测试你 Apache http 服务器的工具,你可以通过这个工具,指定一个单位时间内向 apache 发出的请求数量来看看你的 Apache 和机器配合的性能如何。 + +### 语法 + +```shell +ab [ -A auth-username:password ] [ -c concurrency ] [ -C cookie-name=value +] [ -d ] [ -e csv-file ] [ -g gnuplot-file ] [ -h ] [ -H custom-header ] [ +-i ] [ -k ] [ -n requests ] [ -p POST-file ] [ -P proxy-auth-user‐ +name:password ] [ -q ] [ -s ] [ -S ] [ -t timelimit ] [ -T content-type ] +[ -v verbosity] [ -V ] [ -w ] [ -x -attributes ] [ -X proxy[:port] +] [ -y -attributes ] [ -z
-attributes ] [http://]host‐ +name[:port]/path +``` + +### 选项 + +```shell +-A auth-username:password + # 支持基本的验证证书,用户名和密码之间使用"冒号" : + # 分隔开,ab将以明文方式传送过去.不管服务器是不是需要 + # ,也就是说你的服务器需要支持401认证. + +-c concurrency + # 同时向服务器端发送的请求数目,默认状态下是一次 只执行一个http请求. + +-C cookie-name=value + # Add a Cookie: line to the request. The argument is typically in the + # form of a name=value pair. This field is repeatable. + +-d # Do not display the "percentage served within XX [ms] table". + # (legacy support). + +-e csv-file + # Write a Comma separated value (CSV) file which contains for each + # percentage (from 1% to 100%) the time (in milli seconds) it took to + # serve that percentage of the requests. This is usually more useful + # than the 'gnuplot' file; as the results are already 'binned'. + +-g gnuplot-file + # Write all measured values out as a 'gnuplot' or TSV (Tab separate + # values) file. This file can easily be imported into packages like + # Gnuplot, IDL, Mathematica, Igor or even Excell. The labels are on + # the first line of the file. +-h # 显示使用说明 +-H custom-header + # 向请求包追加附加的标题字串.此参数应该是有效的标题 行(header + # line)形式,通常使用冒号":"来分隔有效配对 (valid pair)例如 'Accept- + # Encoding: zip/zop;8 bit'; + +-i # 使用一个 http 头(HEAD) 来替换 GET方法.不可以掺入POST 方法 + +-k # 允许http KeepAlive ;也就是说执行多个请求在一个 http + # 会话当中,默认是不允许的也就是no KeepAlive啦;) + +-n requests + # 执行一次测试会话的时候所发出的请求数目,默认是执行一个单一的请求 + # 当然了这样的测试结果也就没什么意义了 + +-p POST-file + # 测试程序也就是ab,将向Apache server发送带有HTTP POST 的请求. + +-P proxy-auth-username:password + # 当需要通过代理测试一台 HTTP 服务器的时候而你的代理 + # 又需要用户名密码验证,这时你可以使用这个选项,同样 + # 用户名与密码之间使用冒号":"分隔开,ab将之以明文的方式 + # 发送出去,当然,前提是你的代理是处于407认证状态的 + +-q # When processing more than 150 requests, ab outputs a progress count + # on stderr every 10% or 100 requests or so. The -q flag will sup‐ + # press these messages. + +-s # When compiled in (ab -h will show you) use the SSL protected https + # rather than the http protocol. This feature is experimental and + # very rudimentary. You probably do not want to use it. + +-S # Do not display the median and standard deviation values, nor dis‐ + # play the warning/error messages when the average and median are + # more than one or two times the standard deviation apart. And de‐ + # fault to the min/avg/max values. (legacy support). + +-t timelimit + # 设置测试的时间的长短,使用这个选项ab将自动设置 + # 测试请求会话数目为50000,然后以你设置的时间为 + # 固定周期.默认状态下是没有时限的,也就是直到完成 + # 你所设置的请求数目为止. + +-T content-type + # 内容类型标头,使用在POST数据的时候. + +-v verbosity + # 设置冗余级别,4级打印出每个请求标头的详细信息, + # 3级打印出回应代码(例如,404,200),2级打印出警告 信息和指示消息 + +-V # 显示版本号并且退出 +-w # 打印输出结果到HTML表中. 默认的表是两列n行白底黑框 + +-x -attributes + # 使用字串来描述表的属性,该属性字串应该插入到
+ +-X proxy[:port] + # Use a proxy server for the requests. + +-y -attributes + # 用于生成html表格每行的属性名 () + +-z
-attributes + # 用于生成html表格每列的属性名 () +``` + +### 参数 + +主机:被测试主机。 + + + diff --git a/Linux/command/accept.md b/Linux/command/accept.md new file mode 100644 index 00000000..09e9b24d --- /dev/null +++ b/Linux/command/accept.md @@ -0,0 +1,28 @@ +accept +=== + +指示打印系统接受发往指定目标打印机的打印任务 + +## 补充说明 + +**accept命令** 属于CUPS套件,用于指示打印系统接受发往指定目标打印机的打印任务。 + +### 语法 + +``` +accept(选项)(参数) +``` + +### 选项 + +``` +-E:当连接到服务器时强制加密; +-U:指定连接服务器时使用的用户名; +-h:指定连接服务器名和端口号。 +``` + +### 参数 + +目标:指定目标打印机。 + + diff --git a/Linux/command/ack.md b/Linux/command/ack.md new file mode 100644 index 00000000..25fd30e7 --- /dev/null +++ b/Linux/command/ack.md @@ -0,0 +1,104 @@ +ack +=== + +比grep好用的文本搜索工具 + +## 安装 + +```shell +# ubuntu下要安装ack-grep,因为在debian系中,ack这个名字被其他的软件占用了。 +sudo apt-get install ack-grep +# alpine Linux-apk软件包管理器 安装 ack +apk install ack +``` + +## 参数 + +这些参数在linux上的适用频率是相当高的,尤其是你用vim做为IDE的话 + +```shell +-c(统计)/ -i(忽略大小)/ -h(不显示名称)/ +-l(只显文件名)/ -n(加行号)/ -v(显示不匹配) +``` + +## 特点 + +ack官网列出了这工具的5大卖点: + +1. 速度非常快,因为它只搜索有意义的东西。 +2. 更友好的搜索,忽略那些不是你源码的东西。 +3. 为源代码搜索而设计,用更少的击键完成任务。 +4. 非常轻便,移植性好。 +5. 免费且开源 + +## 实例 + +在记忆的时候大体上可以分为这几个部分: + +> Searching 代码搜索 +> Search output 搜索结果处理 +> File presentation 文件展示 +> File finding 文件查找 +> File inclusion/exclusion 文件过滤 + +grep常用操作 + +```shell +grep -r 'hello_world' # 简单用法 +grep '^hello_world' . # 简单正则 +ls -l | grep .py # 管道用法 +``` + +### Searching + +简单的文本搜索,默认是递归的。 + +``` +ack-grep hello +ack-grep -i hello +ack-grep -v hello +ack-grep -w hello +ack-grep -Q 'hello*' +``` + +### Search File + +对搜索结果进行处理,比如只显示一个文件的一个匹配项,或者xxx + +```shell +ack-grep --line=1 # 输出所有文件第二行 +ack-grep -l 'hello' # 包含的文件名 +ack-grep -L 'print' # 非包含文件名 +``` + +### File presentation + +输出的结果是以什么方式展示呢,这个部分有几个参数可以练习下 + +```shell +ack-grep hello --pager='less -R' # 以less形式展示 +ack-grep hello --noheading # 不在头上显示文件 +ack-grep hello --nocolor # 不对匹配字符着色 +``` + +### File finding +没错,它可以查找文件,以省去你要不断的结合find和grep的麻烦,虽然在linux的思想是一个工具做好一件事。 + +```shell +ack-grep -f hello.py # 查找全匹配文件 +ack-grep -g hello.py$ # 查找正则匹配文件 +ack-grep -g hello --sort-files # 查找然后排序 +``` + +### File Inclusion/Exclusion + +文件过滤,个人觉得这是一个很不错的功能。如果你曾经在搜索项目源码是不小心命中日志中的某个关键字的话,你会觉得这个有用。 + +```shell +ack-grep --python hello # 查找所有python文件 +ack-grep -G hello.py$ hello # 查找匹配正则的文件 +``` + +## 参考资料 + +- [ack官网](https://beyondgrep.com/) diff --git a/Linux/command/alias.md b/Linux/command/alias.md new file mode 100644 index 00000000..8a3f6214 --- /dev/null +++ b/Linux/command/alias.md @@ -0,0 +1,134 @@ +alias +=== + +定义或显示别名。 + +## 概要 + +```shell +alias [-p] [name[=value] ...] +``` + +## 主要用途 + +- 简化较长的命令。 +- 定义一个或多个别名。 +- 修改一个或多个已定义别名的值。 +- 显示一个或多个已定义别名。 +- 显示全部已定义的别名。 + +## 选项 + +```shell +-p:显示全部已定义的别名。 +``` + +## 参数 + +name(可选):指定要(定义、修改、显示)的别名。 + +value(可选):别名的值。 + +### 返回值 + +alias返回true除非您要显示的别名未定义。 + +## 例子 + +```shell +# 显示全部已定义的别名 +alias +alias -p + +# 显示已定义的别名(假设当前环境存在以下别名) +alias ls +alias ls grep + +# 定义或修改别名的值 +alias ls='ls --color=auto' +alias ls='ls --color=never' grep='grep --color=never' +``` + +## 知识点 + +直接在shell里设定的命令别名,在终端关闭或者系统重新启动后都会失效,如何才能永久有效呢? + +使用编辑器打开`~/.bashrc`,在文件中加入别名设置,如:alias rm='rm -i',保存后执行`source ~/.bashrc`,这样就可以永久保存命令的别名了。 + +因为修改的是当前用户目录下的`~/.bashrc`文件,所以这样的方式只对当前用户有用。如果要对所有用户都有效,修改`/etc/bashrc`文件就可以了。 + +> 请注意,以下内容可能与您实际使用的系统有出入: +> +> 在CentOS7下,这个文件是`/etc/bash.bashrc`。此外在CentOS7下,细看`~/.bashrc`文件,会发现有这样一段代码: +> +> ```shell +> if [ -f ~/.bash_aliases ]; then +> . ~/.bash_aliases +> fi +> ``` +> +> 这个代码的意思就是如果存在那么就加载`.bash_aliases`文件,所以也可以在用户根目录下新建该文件用于单独存放命令别名设置。 + + +## 错误用法 + +- 要显示的别名未定义。 + +- 当您定义(修改)别名的值的时候,由于值的字符串有空格但您没有用**单引号扩起**,那么会导致严重的问题: + +```shell +# 为方便演示,删除全部别名 +unalias -a +# 没有用单引号扩起 +alias rm=rm -rf +# 执行命令后报错 bash: alias: -rf: not found +# 这时使用alias查看rm的别名时返回 alias rm='rm' +``` + +```shell +# 更具有迷惑性的例子 +# 为方便演示,删除全部别名 +unalias -a +# 仍然没有用单引号括起 +alias ls=ls --color=never +# 执行命令后看起来没有报错 + +# 使用alias查看全部别名会发现运行结果如下: +# alias --color=never +# alias ls='ls' +# alias处理时将它们看成了两组 +``` + +## Q&A + +Q:如果我要显示一到多个别名,但不知道其中是否有未定义的该怎么办? + +A:正常执行就是了,alias不会因为有一个未定义的别名就结束对剩余参数的执行。 + +Q:如果我这么定义`alias cd='ls' ls='cd'`,会有什么后果? + +A:运行cd依然会切换目录,运行ls依然会列出文件夹的内容;不要这样定义。 + + +### 注意 + +1. **执行脚本时请注意:** + +> 使用`source`命令执行的bash脚本如果执行了`alias`或`unalias`命令,那么有可能会对终端环境的别名设置产生影响;终端环境的别名设置也可能改变运行结果; +> +> 通过`sh`方式调用的bash脚本或直接运行当前用户有执行权限的脚本不受终端环境的别名影响。 + +2. 删除别名,请查看`unalias`命令。 + +2. 建议您不要对`mv cp rm`等命令的别名设置危险的`-f`选项,比如`alias rm='rm -f'`。 + +3. 需要注意别名是否和其他命令有冲突的情况。 + +4. 该命令是bash内建命令,相关的帮助信息请查看`help`命令。 + +### 其他参考链接 + +[Linux命令详解:\[8\]alias创建自己的命令](https://jingyan.baidu.com/article/ac6a9a5e6738422b653eac01.html) + + + diff --git a/Linux/command/apachectl.md b/Linux/command/apachectl.md new file mode 100644 index 00000000..14d220ca --- /dev/null +++ b/Linux/command/apachectl.md @@ -0,0 +1,27 @@ +apachectl +=== + +Apache服务器前端控制工具 + +## 补充说明 + +**apachectl命令** 是Apache的Web服务器前端控制工具,用以启动、关闭和重新启动Web服务器进程。 + +### 语法 + +``` +apachectl(参数) +``` + +### 参数 + +* configtest:检查设置文件中的语法是否正确; +* fullstatus:显示服务器完整的状态信息; +* graceful:重新启动Apache服务器,但不会中断原有的连接; +* help:显示帮助信息; +* restart:重新启动Apache服务器; +* start:启动Apache服务器; +* status:显示服务器摘要的状态信息; +* stop:停止Apache服务器。 + + diff --git a/Linux/command/apk.md b/Linux/command/apk.md new file mode 100644 index 00000000..15348050 --- /dev/null +++ b/Linux/command/apk.md @@ -0,0 +1,131 @@ +apk +=== + +Alpine Linux 下的包管理工具 + +## 使用实例 + +```shell +apk install xxx +apk search xxx # 支持正则 +apk info xxx # 查看包的详细信息 +apk show # list local package +# 卸载并删除 包 +apk del openssh openntp vim +``` + +### 升级 + +upgrade命令升级系统已安装的所以软件包(一般包括内核),当然也可指定仅升级部分软件包(通过-u或–upgrade选择指定)。 + +```shell +apk update # 更新最新本地镜像源 +apk upgrade # 升级软件 +apk add --upgrade busybox # 指定升级部分软件包 +``` + +### 搜索 + +```shell +apk search # 查找所以可用软件包 +apk search -v # 查找所以可用软件包及其描述内容 +apk search -v 'acf*' # 通过软件包名称查找软件包 +apk search -v -d 'docker' # 通过描述文件查找特定的软件包 +``` + +### 查看包信息 + +info命令用于显示软件包的信息。 + +```shell +apk info # 列出所有已安装的软件包 +apk info -a zlib # 显示完整的软件包信息 +apk info --who-owns /sbin/lbu # 显示指定文件属于的包 +``` + +## 笔记 + +还是蛮喜欢 alpine 的,简单纯粹 + +```shell +apk add iproute2 # ss vs netstat +ss -ptl +apk add drill # drill vs nslookup&dig + +crond # 开启 cron 服务 +crontab -l -e + +apk add xxx +apk search -v xxx +apk info -a xxx +apk info +echo -e "http://mirrors.aliyun.com/alpine/v3.6/main\nhttp://mirrors.aliyun.com/alpine/v3.6/community" > /etc/apk/repositories +apk update + +# storage +ibu # alpine local backup + +# network +echo "shortname" > /etc/hostname +hostname -F /etc/hostname +/etc/hosts +/etc/resolv.conf # conig DNS +modprobe ipv6 # enable ipv6 +echo "ipv6" >> /etc/modules +iface # config interface +apk add iptables ip6tables iptables-doc +/etc/init.d/networking restart # activate change +apke add iputils # IPv6 traceroute +traceroute6 ipv6.google.com +awall # alpine wall +# setup a openvpn server + +# post-install +/etc/apk/repositories +apk add cherokee --update-cache --repository http://dl-3.alpinelinux.org/alpine/edge/testing/ --allow-untrusted +apk search -v --description 'NTP' # show description and search from description +apk info -a zlib +apk info -vv|sort +apk info -r -R # require / depency +apk version -v -l '<' # show available updates +apk upgrade -U -a +apk add -u xxx # update xxx + +/etc/runlevels # runlevel +apk add openrc # use openrc for init system +rc-update add xxx # set to start on +rc-service xxx start # equal -> /etc/init.d/xxx start +rc-status + +adduser xxx +passwd xxx + +apk add ansible # server +ssh-keygen +/etc/ansible/hosts +apk add python # node +ssh-copy-id + +apk add man man-pages mdocml-apropos less less-doc +export PAGER=less +/etc/rc.conf # /etc/rc.conf -> funny character +apk add bash bash-doc bash-completion # bash +apk add util-linux pciutils usbutils coreutils binutils findutils grep # grep / awk +apk add build-base gcc abuild binutils binutils-doc gcc-doc # compile +apk add cmake cmake-doc extra-cmake-modules extra-cmake-modules-doc +apk add ccache ccache-doc + +apk add docker # docker +rc-update add docker boot +rc-service docker start +apk add py-pip +pip install docker-compose +ln -s /usr/bin/docker-compose /usr/bin/doc + +# application +apk add openssh # ssh +rc-update add sshd +/etc/init.d/sshd start +/etc/sshd_config +apk add dropbear # another openssh implementation +``` \ No newline at end of file diff --git a/Linux/command/apropos.md b/Linux/command/apropos.md new file mode 100644 index 00000000..9ba1c716 --- /dev/null +++ b/Linux/command/apropos.md @@ -0,0 +1,73 @@ +apropos +=== + +在 whatis 数据库中查找字符串 + +## 补充说明 + +**apropos命令** 在一些特定的包含系统命令的简短描述的数据库文件里查找关键字,然后把结果送到标准输出。  + +如果你不知道完成某个特定任务所需要命令的名称,可以使用一个关键字通过Linux apropos实用程序来搜索它。该实用程序可以搜索关键字并且显示所有包含匹配项的man页面的简短描述。另外,使用man实用程序和-k(关键字)选项,可以得到和用Linux apropos实用程序相同的结果(实际上是相同的命令)。 + +### 语法 + +```shell +apropos [-dalhvV] -e|-[w|-r] [-s section] [-m system[,...]] [-M path] [-L locale] -C [file] keyword ... +``` + +### 选项 + +```shell +-d, --debug:输出调试信息。 +-v, --verbose:输出详细的警告信息。 +-r, -- regex:将每个keyword作为正则表达式解释。这是默认行为。每个keyword将匹配手册页和描述。 +-w, --wildcard:将每个keyword作为shell样式的通配符解释。 +-e, --exact:每个keyword将精确匹配手册页名字和描述。 +-a, --and:只显示匹配所有keyword的手册页和描述。默认显示匹配任何keyword的项。 +-l, --long:不根据终端宽度缩减输出。 +-s section, --section section:只查找指定的手册section。 +-m system[,...], --systems=system[,...]:用于查找其它操作系统的手册页。 +-M path, --manpath=path:指定从其它以冒号分隔的手册页层次查找。默认使用$MANPATH环境变量。这个选项覆盖$MANPATH的内容。 +-L locale, --locale=locale:apropos调用C函数setlocale来得到当前本地化信息,包括$LC_MESSAGE和$LANG。使用该选项提供一个locale字符串来临时更改本地化信息。 +-C file, --config-file=file:使用这个用户配置文件而不是默认的~/.manpath。 +-h, --help:打印帮助信息并退出。 +-V, --version:打印版本信息并退出。 +``` + +### 返回值 + +返回0表示成功,1表示用法、语法或配置文件错误,2表示操作错误,16表示没有找到匹配的内容。 + +### 实例 + +```shell +[root@localhost ~]# man -k who +at.allow [at] (5) - determine who can submit jobs via at or batch +at.deny [at] (5) - determine who can submit jobs via at or batch +jwhois (1) - client for the whois service +jwhois (rpm) - Internet whois/nicname client. +Net::LDAP::Extension::whoami (3pm) - LDAP Who am I? Operation +w (1) - Show who is logged on and what they are doing +who (1p) - display who is on the system +who (1) - show who is logged on +whoami (1) - print effective userid + +[root@localhost ~]# apropos who +at.allow [at] (5) - determine who can submit jobs via at or batch +at.deny [at] (5) - determine who can submit jobs via at or batch +jwhois (1) - client for the whois service +jwhois (rpm) - Internet whois/nicname client. +Net::LDAP::Extension::WhoAmI (3pm) - LDAP Who am I? Operation +w (1) - Show who is logged on and what they are doing +who (1p) - display who is on the system +who (1) - show who is logged on +whoami (1) - print effective userid +``` + +查找手册页名字和描述中包含emacs和vi的手册页: + +```shell +apropos -a emacs vi +``` + + diff --git a/Linux/command/apt-get.md b/Linux/command/apt-get.md new file mode 100644 index 00000000..c9189162 --- /dev/null +++ b/Linux/command/apt-get.md @@ -0,0 +1,102 @@ +apt-get +=== + +Debian Linux发行版中的APT软件包管理工具 + +## 补充说明 + +**apt-get命令** 是Debian Linux发行版中的APT软件包管理工具。所有基于Debian的发行都使用这个包管理系统。deb包可以把一个应用的文件包在一起,大体就如同Windows上的安装文件。 + +### 语法 + +```shell +apt-get [OPTION] PACKAGE +``` + +### 选项 + +```shell +apt-get install # 安装新包 +apt-get remove # 卸载已安装的包(保留配置文件) +apt-get purge # 卸载已安装的包(删除配置文件) +apt-get update # 更新软件包列表 +apt-get upgrade # 更新所有已安装的包 +apt-get autoremove # 卸载已不需要的包依赖 +apt-get dist-upgrade # 自动处理依赖包升级 +apt-get autoclean # 将已经删除了的软件包的.deb安装文件从硬盘中删除掉 +apt-get clean # 删除软件包的安装包 + +-c:指定配置文件。 +``` + +### 参数 + +* 管理指令:对APT软件包的管理操作; +* 软件包:指定要操纵的软件包。 + +### 实例 + +使用apt-get命令的第一步就是引入必需的软件库,Debian的软件库也就是所有Debian软件包的集合,它们存在互联网上的一些公共站点上。把它们的地址加入,apt-get就能搜索到我们想要的软件。/etc/apt/sources.list是存放这些地址列表的配置文件,其格式如下: + +```shell +deb web或[ftp地址] [发行版名字] main/contrib/non-[free] +``` + +我们常用的Ubuntu就是一个基于Debian的发行,我们使用apt-get命令获取这个列表,以下是我整理的常用命令: + +在修改`/etc/apt/sources.list`或者`/etc/apt/preferences`之后运行该命令。此外您需要定期运行这一命令以确保您的软件包列表是最新的: + +```shell +apt-get update +``` + +安装一个新软件包: + +```shell +apt-get install packagename +``` + +卸载一个已安装的软件包(保留配置文件): + +```shell +apt-get remove packagename +``` + +卸载一个已安装的软件包(删除配置文件): + +```shell +apt-get –purge remove packagename +``` + +会把已装或已卸的软件都备份在硬盘上,所以如果需要空间的话,可以让这个命令来删除你已经删掉的软件: + +```shell +apt-get autoclean apt +``` + +这个命令会把安装的软件的备份也删除,不过这样不会影响软件的使用的: + +```shell +apt-get clean +``` + +更新所有已安装的软件包: + +```shell +apt-get upgrade +``` + +将系统升级到新版本: + +```shell +apt-get dist-upgrade +``` + +定期运行这个命令来清除那些已经卸载的软件包的.deb文件。通过这种方式,您可以释放大量的磁盘空间。如果您的需求十分迫切,可以使用`apt-get clean`以释放更多空间。这个命令会将已安装软件包裹的.deb文件一并删除。大多数情况下您不会再用到这些.debs文件,因此如果您为磁盘空间不足 而感到焦头烂额,这个办法也许值得一试: + +```shell +apt-get autoclean +``` + + + diff --git a/Linux/command/apt-key.md b/Linux/command/apt-key.md new file mode 100644 index 00000000..d35b8578 --- /dev/null +++ b/Linux/command/apt-key.md @@ -0,0 +1,29 @@ +apt-key +=== + +管理Debian Linux系统中的软件包密钥 + +## 补充说明 + +**apt-key命令** 用于管理Debian Linux系统中的软件包密钥。每个发布的deb包,都是通过密钥认证的,apt-key用来管理密钥。 + +### 语法 + +```shell +apt-key(参数) +``` + +### 参数 + +操作指令:APT密钥操作指令。 + +### 实例 + +```shell +apt-key list # 列出已保存在系统中key。 +apt-key add keyname # 把下载的key添加到本地trusted数据库中。 +apt-key del keyname # 从本地trusted数据库删除key。 +apt-key update # 更新本地trusted数据库,删除过期没用的key。 +``` + + diff --git a/Linux/command/apt-sortpkgs.md b/Linux/command/apt-sortpkgs.md new file mode 100644 index 00000000..060f8ef1 --- /dev/null +++ b/Linux/command/apt-sortpkgs.md @@ -0,0 +1,27 @@ +apt-sortpkgs +=== + +Debian Linux下对软件包索引文件进行排序的工具 + +## 补充说明 + +**apt-sortpkgs命令** 是Debian Linux下对软件包索引文件进行排序的简单工具。 + +### 语法 + +```shell +apt-sortpkgs(选项)(参数) +``` + +### 选项 + +```shell +-s:使用源索引字段排序; +-h:显示帮助信息。 +``` + +### 参数 + +文件:指定要排序的包含debian包信息的索引文件。 + + diff --git a/Linux/command/aptitude.md b/Linux/command/aptitude.md new file mode 100644 index 00000000..6b447d6b --- /dev/null +++ b/Linux/command/aptitude.md @@ -0,0 +1,50 @@ +aptitude +=== + +Debian Linux系统中软件包管理工具 + +## 补充说明 + +**aptitude命令** 与apt-get命令一样,都是Debian Linux及其衍生系统中功能极其强大的包管理工具。与apt-get不同的是,aptitude在处理依赖问题上更佳一些。举例来说,aptitude在删除一个包时,会同时删除本身所依赖的包。这样,系统中不会残留无用的包,整个系统更为干净。它通过文本操作菜单和命令两种方式管理软件包。 + +### 语法 + +```shell +aptitude(选项)(参数) +``` + +### 选项 + +```shell +-h:显示帮助信息; +-d:仅下载软件包,不执行安装操作; +-P:每一步操作都要求确认; +-y:所有问题都回答“yes”; +-v:显示附加信息; +-u:启动时下载新的软件包列表。 +``` + +### 参数 + +操作命令:用户管理软件包的操作命令。 + +### 实例 + +以下是我总结的一些常用aptitude命令,仅供参考: + +```shell +aptitude update # 更新可用的包列表 +aptitude upgrade # 升级可用的包 +aptitude dist-upgrade # 将系统升级到新的发行版 +aptitude install pkgname # 安装包 +aptitude remove pkgname # 删除包 +aptitude purge pkgname # 删除包及其配置文件 +aptitude search string # 搜索包 +aptitude show pkgname # 显示包的详细信息 +aptitude clean # 删除下载的包文件 +aptitude autoclean # 仅删除过期的包文件 +``` + +当然,你也可以在文本界面模式中使用 aptitude。 + + diff --git a/Linux/command/ar.md b/Linux/command/ar.md new file mode 100644 index 00000000..6e5fb55f --- /dev/null +++ b/Linux/command/ar.md @@ -0,0 +1,160 @@ +ar +=== + +建立或修改备存文件,或是从备存文件中抽取文件 + +## 补充说明 + +**ar命令** 是一个建立或修改备存文件,或是从备存文件中抽取文件的工具,ar可让您集合许多文件,成为单一的备存文件。在备存文件中,所有成员文件皆保有原来的属性与权限 + +### 语法 + +```shell +ar [-]{dmpqrtx}[abcfilNoPsSuvV] [membername] [count] archive files... +Usage: ar [emulation options] [-]{dmpqrstx}[abcDfilMNoPsSTuvV] [--plugin ] [member-name] [count] archive-file file... + ar -M [ - load the specified plugin +``` + +ar:支持的目标: elf64-x86-64 elf32-i386 elf32-x86-64 a.out-i386-linux pei-i386 pei-x86-64 elf64-l1om elf64-k1om elf64-little elf64-big elf32-little elf32-big plugin srec symbolsrec verilog tekhex binary ihex + +### 实例 + +打包文件 + +```shell +[root@localhost ~]# ls # 显示当前目录文件 +a.c b.c d.c install.log qte +anaconda-ks.cfg c.c Desktop + +[root@localhost ~]# ar rv one.bak a.c b.c # 打包 a.c b.c文件 +ar: 正在创建 one.bak +a - a.c +a - b.c +``` + +打包多个文件 + +```shell +[root@localhost ~]# ar rv two.bak *.c // 打包以.c结尾的文件 +ar: 正在创建 two.bak +a - a.c +a - b.c +a - c.c +a - d.c +``` + +显示打包文件的内容 + +```shell +[root@localhost ~]# ar t two.bak +a.c +b.c +c.c +d.c +``` + +删除打包文件的成员文件 + +```shell +[root@localhost ~]# ar d two.bak a.c b.c c.c +[root@localhost ~]# ar t two.bak +d.c +``` + + + diff --git a/Linux/command/arch.md b/Linux/command/arch.md new file mode 100644 index 00000000..3b797fb3 --- /dev/null +++ b/Linux/command/arch.md @@ -0,0 +1,36 @@ +arch +=== + +显示当前主机的硬件架构类型 + +## 概要 + +```shell +arch [OPTION]... +``` + +## 主要用途 + +- 打印机器架构信息;`arch` 命令输出结果有:i386、i486、i586、alpha、sparc、arm、m68k、mips、ppc、i686等。 + +## 选项 + +```shell +--help 显示帮助信息并退出。 +--version 显示版本信息并退出。 +``` + +## 例子 + +```shell +[root@localhost ~]# arch +x86_64 +``` + +### 注意 + +1. 该命令等价于 `uname -m`。 + +2. 该命令是`GNU coreutils`包中的命令,相关的帮助信息请查看`man -s 1 arch`,`info coreutils 'arch invocation'`。 + + diff --git a/Linux/command/arj.md b/Linux/command/arj.md new file mode 100644 index 00000000..05181e16 --- /dev/null +++ b/Linux/command/arj.md @@ -0,0 +1,21 @@ +arj +=== + +用于创建和管理.arj压缩包 + +## 补充说明 + +**arj命令** 是 `.arj` 格式的压缩文件的管理器,用于创建和管理 `.arj` 压缩包。 + +### 语法 + +```shell +arj(参数) +``` + +### 参数 + +* 操作指令:对 `.arj` 压缩包执行的操作指令; +* 压缩包名称:指定要操作的arj压缩包名称。 + + diff --git a/Linux/command/arp.md b/Linux/command/arp.md new file mode 100644 index 00000000..993f236f --- /dev/null +++ b/Linux/command/arp.md @@ -0,0 +1,72 @@ +arp +=== + +arp 命令用于显示和修改 IP 到 MAC 转换表 + +## 补充说明 + +**arp 命令** 是 Address Resolution Protocol,地址解析协议,是通过解析网络层地址来找寻数据链路层地址的一个网络协议包中极其重要的网络传输协议。而该命令可以显示和修改 arp 协议解析表中的缓冲数据。 + +这个核心协议模块实现RFC826中定义的 Address Resolution Protocol [译注:即TCP/IP的第三层到第一层的地址转换协议],用于在直接相连的网络中换第二层硬件地址和 Ipv4 协议地址之间的转换。 用户除非想对其进行配置,否则一般不会直接操作这个模块。 + +实际上,它提供对核心中其它协议的服务。 + +用户进程可以使用 packet(7) 的 sockets,收到 ARP 包(译注:一译分组)。 还有一种机制是使用 netlink(7) sockets,在用户空间管理 ARP 缓存的机制。我们也可以通过 ioctl (2) 控制任意 PF_INET socket上的 ARP 表 + +ARP 模块维护一个硬件地址到协议地址映射的缓存。这个缓存有大小限制,所以不常用的和旧的记录(Entry)将被垃圾收集器清除(garbage-collected),垃圾收集器永远不能删除标为永久的记录。我们可以使用ioctls直接操纵缓冲, 并且其性状可以用下面定义的 sysctl 调节。 + +如果在限定的时间(见下面的sysctl)内,一条现存映射没有肯定反馈时, 则认为相邻层的缓存记录失效。 为了再次向目标发送数据,ARP将首先试着询问本地arp进程 app_solicit 次,获取更新了的 MAC(介质访问控制)地址。 如果失败,并且旧的MAC地址是已知的,则发送 ucast_solicit 次的 unicast probe。如果仍然失败,则将向网络广播一个新的ARP请求,此时要 有待发送数据的队列 + +如果 Linux 接到一个地址请求,而且该地址指向 Linux 转发的地址,并且接收接口打开了代理 arp 时,Linux 将自动添加一条非永久的代理 arp 记录;如果存在拒绝到目标的路由,则不添加代理 arp 记录。 + +### 语法 + +```shell +arp(选项)(参数) +``` + +### 选项 + +```shell +-a # 主机 :显示 arp 缓冲区的所有条目; +-H # 地址类型 :指定 arp 指令使用的地址类型; +-d # 主机 :从 arp 缓冲区中删除指定主机的 arp 条目; +-D # 使用指定接口的硬件地址; +-e # 以 Linux 的显示风格显示 arp 缓冲区中的条目; +-i # 接口 :指定要操作 arp 缓冲区的网络接口; +-s # 主机 MAC 地址 :设置指定的主机的 IP 地址与 MAC 地址的静态映射; +-n # 以数字方式显示 arp 缓冲区中的条目; +-v # 显示详细的 arp 缓冲区条目,包括缓冲区条目的统计信息; +-f # 文件 :设置主机的 IP 地址与 MAC 地址的静态映射。 +``` + +### 参数 + +主机:查询 arp 缓冲区中指定主机的 arp 条目。 + +### 实例 + +显示arp 缓冲区内容 + +```shell +[root@localhost ~]# arp -v +Address HWtype HWaddress Flags Mask Iface +192.168.0.134 ether 00:21:5E:C7:4D:88 C eth1 +115.238.144.129 ether 38:22:D6:2F:B2:F1 C eth0 +Entries: 2 Skipped: 0 Found: 2 +``` + +添加静态 arp 映射 + +```shell +arp -s IP MAC-ADDRESS +arp -s 192.168.1.1 00:b1:b2:b3:b4:b5 +``` + +删除 arp 缓存条目 + +```shell +arp -d 192.168.1.1 +``` + + diff --git a/Linux/command/arpd.md b/Linux/command/arpd.md new file mode 100644 index 00000000..c6ed7d3c --- /dev/null +++ b/Linux/command/arpd.md @@ -0,0 +1,45 @@ +arpd +=== + +收集免费ARP信息 + +## 补充说明 + +**arpd命令** 是用来收集免费arp信息的一个守护进程,它将收集到的信息保存在磁盘上或者在需要时,提供给内核用户用于避免多余广播。 + +### 语法 + +```shell +arpd(选项)(参数) +``` + +### 选项 + +```shell +-l:将arp数据库输出到标准输出设备显示并退出; +-f:指定读取和加载arpd数据库的文本文件,文件的格式与“-l”输出信息类似; +-b:指定arpd数据库文件,默认的位置为“/var/lib/arpd.db”; +-a:指定目标被认为死掉前查询的次数; +-k:禁止通过内核发送广播查询; +-n:设定缓冲失效时间。 +``` + +### 参数 + +网络接口:指定网络接口。 + +### 实例 + +启动arpd进程: + +```shell +arpd -b /var/tmp/arpd.db +``` + +运行一段时间后,查看结果: + +```shell +arpd -l -b /var/tmp/arpd.db +``` + + diff --git a/Linux/command/arping.md b/Linux/command/arping.md new file mode 100644 index 00000000..7e825c79 --- /dev/null +++ b/Linux/command/arping.md @@ -0,0 +1,49 @@ +arping +=== + +通过发送ARP协议报文测试网络 + +## 补充说明 + +**arping命令** 是用于发送arp请求到一个相邻主机的工具,arping使用arp数据包,通过ping命令检查设备上的硬件地址。能够测试一个ip地址是否是在网络上已经被使用,并能够获取更多设备信息。功能类似于ping。 + +### 语法 + +```shell +arping(选项)(参数) +``` + +### 选项 + +```shell +-b:用于发送以太网广播帧(FFFFFFFFFFFF)。arping一开始使用广播地址,在收到响应后就使用unicast地址。 +-q:quiet output不显示任何信息; +-f:表示在收到第一个响应报文后就退出; +-w timeout:设定一个超时时间,单位是秒。如果到了指定时间,arping还没到完全收到响应则退出; +-c count:表示发送指定数量的ARP请求数据包后就停止。如果指定了deadline选项,则arping会等待相同数量的arp响应包,直到超时为止; +-s source:设定arping发送的arp数据包中的SPA字段的值。如果为空,则按下面处理,如果是DAD模式(冲突地址探测),则设置为0.0.0.0,如果是Unsolicited ARP模式(Gratutious ARP)则设置为目标地址,否则从路由表得出; +-I interface:设置ping使用的网络接口。 +``` + +### 参数 + +目的主机:指定发送ARP报文的目的主机。 + +### 实例 + +```shell +[root@localhost ~]# arping www.baidu.com +ARPING 220.181.111.147 from 173.231.43.132 eth0 +Unicast reply from 220.181.111.147 00:D0:03:[bc:48:00] 1.666ms +Unicast reply from 220.181.111.147 [00:D0:03:BC:48:00] 1.677ms +Unicast reply from 220.181.111.147 [00:D0:03:BC:48:00] 1.691ms +Unicast reply from 220.181.111.147 [00:D0:03:BC:48:00] 1.728ms +Unicast reply from 220.181.111.147 [00:D0:03:BC:48:00] 1.626ms +Unicast reply from 220.181.111.147 [00:D0:03:BC:48:00] 1.292ms +Unicast reply from 220.181.111.147 [00:D0:03:BC:48:00] 1.429ms +Unicast reply from 220.181.111.147 [00:D0:03:BC:48:00] 2.042ms +Sent 8 probes (1 broadcast(s)) +Received 8 response(s) +``` + + diff --git a/Linux/command/arptables.md b/Linux/command/arptables.md new file mode 100644 index 00000000..1b80c836 --- /dev/null +++ b/Linux/command/arptables.md @@ -0,0 +1,34 @@ +arptables +=== + +管理ARP包过滤规则表 + +## 补充说明 + +**arptables命令** 用来设置、维护和检查Linux内核中的arp包过滤规则表。 + +### 语法 + +```shell +arptables(选项) +``` + +### 选项 + +```shell +-A:向规则链中追加规则; +-D:从指定的链中删除规则; +-l:向规则链中插入一条新的规则; +-R:替换指定规则; +-P:设置规则链的默认策略; +-F:刷新指定规则链,将其中的所有规则链删除,但是不改变规则链的默认策略; +-Z:将规则链计数器清零; +-L:显示规则链中的规则列表; +-X:删除指定的空用户自定义规则链; +-h:显示指令帮助信息; +-j:指定满足规则的添加时的目标; +-s:指定要匹配ARP包的源ip地址; +-d:指定要匹配ARP包的目的IP地址。 +``` + + diff --git a/Linux/command/arpwatch.md b/Linux/command/arpwatch.md new file mode 100644 index 00000000..2c04b5a4 --- /dev/null +++ b/Linux/command/arpwatch.md @@ -0,0 +1,25 @@ +arpwatch +=== + +监听网络上ARP的记录 + +## 补充说明 + +**arpwatch命令** 用来监听网络上arp的记录。 + +### 语法 + +```shell +arpwatch(选项) +``` + +### 选项 + +```shell +-d:启动排错模式; +-f<记录文件>:设置存储ARP记录的文件,预设为/var/arpwatch/arp.dat; +-i<接口>:指定监听ARP的接口,预设的接口为eth0; +-r<记录文件>:从指定的文件中读取ARP记录,而不是从网络上监听。 +``` + + diff --git a/Linux/command/as.md b/Linux/command/as.md new file mode 100644 index 00000000..622f791b --- /dev/null +++ b/Linux/command/as.md @@ -0,0 +1,40 @@ +as +=== + +汇编语言编译器 + +## 补充说明 + +**as命令** GNU组织推出的一款汇编语言编译器,它支持多种不同类型的处理器。 + +### 语法 + +```shell +as(选项)(参数) +``` + +### 选项 + +```shell +-ac:忽略失败条件; +-ad:忽略调试指令; +-ah:包括高级源; +-al:包括装配; +-am:包括宏扩展; +-an:忽略形式处理; +-as:包括符号; +=file:设置列出文件的名字; +--alternate:以交互宏模式开始; +-f:跳过空白和注释预处理; +-g:产生调试信息; +-J:对于有符号溢出不显示警告信息; +-L:在符号表中保留本地符号; +-o:指定要生成的目标文件; +--statistics:打印汇编所用的最大空间和总时间。 +``` + +### 参数 + +汇编文件:指定要汇编的源文件。 + + diff --git a/Linux/command/at.md b/Linux/command/at.md new file mode 100644 index 00000000..5b3ca031 --- /dev/null +++ b/Linux/command/at.md @@ -0,0 +1,84 @@ +at +=== + +在指定时间执行一个任务 + +## 补充说明 + +**at命令** 用于在指定时间执行命令。at允许使用一套相当复杂的指定时间的方法。它能够接受在当天的hh:mm(小时:分钟)式的时间指定。假如该时间已过去,那么就放在第二天执行。当然也能够使用midnight(深夜),noon(中午),teatime(饮茶时间,一般是下午4点)等比较模糊的 词语来指定时间。用户还能够采用12小时计时制,即在时间后面加上AM(上午)或PM(下午)来说明是上午还是下午。 也能够指定命令执行的具体日期,指定格式为month day(月 日)或mm/dd/yy(月/日/年)或dd.mm.yy(日.月.年)。指定的日期必须跟在指定时间的后面。 + +上面介绍的都是绝对计时法,其实还能够使用相对计时法,这对于安排不久就要执行的命令是很有好处的。指定格式为:`now + count time-units`,now就是当前时间,time-units是时间单位,这里能够是minutes(分钟)、hours(小时)、days(天)、weeks(星期)。count是时间的数量,究竟是几天,还是几小时,等等。 更有一种计时方法就是直接使用today(今天)、tomorrow(明天)来指定完成命令的时间。 + +### 语法 + +```shell +at [-V] [-q 队列] [-f 文件] [-mldbv] 时间 at -c 作业 [作业...] +``` + +### 选项 + +```shell +-f:指定包含具体指令的任务文件; +-q:指定新任务的队列名称; +-l:显示待执行任务的列表; +-d:删除指定的待执行任务; +-m:任务执行完成后向用户发送E-mail。 +``` + +### 参数 + +日期时间:指定任务执行的日期时间。 + +### 实例 + +三天后的下午 5 点锺执行`/bin/ls`: + +```shell +[root@localhost ~]# at 5pm+3 days +at> /bin/ls +at> +job 7 at 2013-01-08 17:00 +``` + +明天17点钟,输出时间到指定文件内: + +```shell +[root@localhost ~]# at 17:20 tomorrow +at> date >/root/2013.log +at> +job 8 at 2013-01-06 17:20 +``` + +计划任务设定后,在没有执行之前我们可以用atq命令来查看系统没有执行工作任务: + +```shell +[root@localhost ~]# atq +8 2013-01-06 17:20 a root +7 2013-01-08 17:00 a root +``` + +删除已经设置的任务: + +```shell +[root@localhost ~]# atq +8 2013-01-06 17:20 a root +7 2013-01-08 17:00 a root + +[root@localhost ~]# atrm 7 +[root@localhost ~]# atq +8 2013-01-06 17:20 a root +``` + +显示已经设置的任务内容: + +```shell +[root@localhost ~]# at -c 8 +#!/bin/sh +# atrun uid=0 gid=0 +# mail root 0 +umask 22此处省略n个字符 +date >/root/2013.log +``` + + + diff --git a/Linux/command/atop.md b/Linux/command/atop.md new file mode 100644 index 00000000..22f3ebf1 --- /dev/null +++ b/Linux/command/atop.md @@ -0,0 +1,99 @@ +atop +=== + +监控Linux系统资源与进程的工具 + +## 补充说明 + +[非内部程序,需要安装]它以一定的频率记录系统的运行状态,所采集的数据包含系统资源(CPU、内存、磁盘和网络)使用情况和进程运行情况,并能以日志文件的方式保存在磁盘中,服务器出现问题后,我们可获取相应的atop日志文件进行分析。atop是一款开源软件,我们可以从这里获得其源码和rpm安装包。 + +## 语法 + +```shell +atop(选项)(参数) +``` + +## 说明 + +**ATOP列**:该列显示了主机名、信息采样日期和时间点 + +**PRC列**:该列显示进程整体运行情况 + +- sys、usr字段分别指示进程在内核态和用户态的运行时间 +- #proc字段指示进程总数 +- #zombie字段指示僵死进程的数量 +- #exit字段指示atop采样周期期间退出的进程数量 + + +**CPU列**:该列显示CPU整体(即多核CPU作为一个整体CPU资源)的使用情况,我们知道CPU可被用于执行进程、处理中断,也可处于空闲状态(空闲状态分两种,一种是活动进程等待磁盘IO导致CPU空闲,另一种是完全空闲) + +- sys、usr字段指示CPU被用于处理进程时,进程在内核态、用户态所占CPU的时间比例 +- irq字段指示CPU被用于处理中断的时间比例 +- idle字段指示CPU处在完全空闲状态的时间比例 +- wait字段指示CPU处在“进程等待磁盘IO导致CPU空闲”状态的时间比例 + +CPU列各个字段指示值相加结果为N00%,其中N为cpu核数。 + +cpu列:该列显示某一核cpu的使用情况,各字段含义可参照CPU列,各字段值相加结果为100% + +**CPL列**:该列显示CPU负载情况 + +- avg1、avg5和avg15字段:过去1分钟、5分钟和15分钟内运行队列中的平均进程数量 +- csw字段指示上下文交换次数 +- intr字段指示中断发生次数 + +**MEM列**:该列指示内存的使用情况 + +- tot字段指示物理内存总量 +- free字段指示空闲内存的大小 +- cache字段指示用于页缓存的内存大小 +- buff字段指示用于文件缓存的内存大小 +- slab字段指示系统内核占用的内存大小 + +**SWP列**:该列指示交换空间的使用情况 + +- tot字段指示交换区总量 +- free字段指示空闲交换空间大小 + +**PAG列**:该列指示虚拟内存分页情况 + +swin、swout字段:换入和换出内存页数 + +**DSK列**:该列指示磁盘使用情况,每一个磁盘设备对应一列,如果有sdb设备,那么增多一列DSK信息 + +- sda字段:磁盘设备标识 +- busy字段:磁盘忙时比例 +- read、write字段:读、写请求数量 + +**NET列**:多列NET展示了网络状况,包括传输层(TCP和UDP)、IP层以及各活动的网口信息 + +- XXXi 字段指示各层或活动网口收包数目 +- XXXo 字段指示各层或活动网口发包数目 + + +## atop日志 + +每个时间点采样页面组合起来就形成了一个atop日志文件,我们可以使用"atop -r XXX"命令对日志文件进行查看。那以什么形式保存atop日志文件呢? + +对于atop日志文件的保存方式,我们可以这样: + +- 每天保存一个atop日志文件,该日志文件记录当天信息 +- 日志文件以"atop_YYYYMMDD"的方式命名 +- 设定日志失效期限,自动删除一段时间前的日志文件 + +其实atop开发者已经提供了以上日志保存方式,相应的atop.daily脚本可以在源码目录下找到。在atop.daily脚本中,我们可以通过修改INTERVAL变量改变atop信息采样周期(默认为10分钟);通过修改以下命令中的数值改变日志保存天数(默认为28天): + +```shell +(sleep 3; find $LOGPATH -name 'atop_*' -mtime +28 -exec rm {} \; )& +``` + +最后,我们修改cron文件,每天凌晨执行atop.daily脚本: + +```shell +0 0 * * * root /etc/cron.daily/atop.daily +``` + +## 相关资料 + +- [官方手册](http://www.atoptool.nl/download/man_atop-1.pdf) + diff --git a/Linux/command/atq.md b/Linux/command/atq.md new file mode 100644 index 00000000..ae1ad20d --- /dev/null +++ b/Linux/command/atq.md @@ -0,0 +1,36 @@ +atq +=== + +列出当前用户的at任务列表 + +## 补充说明 + +**atq命令** 显示系统中待执行的任务列表,也就是列出当前用户的at任务列表。 + +### 语法 + +```shell +atq [-V] [-q 队列] [-v] +``` + +### 选项 + +```shell +-V:显示版本号; +-q:查询指定队列的任务。 +``` + +### 实例 + +```shell +at now + 10 minutes +at> echo 1111 +at> +job 3 at Fri Apr 26 12:56:00 2013 + +atq +3 Fri Apr 26 12:56:00 2013 a root +``` + + + diff --git a/Linux/command/atrm.md b/Linux/command/atrm.md new file mode 100644 index 00000000..73759f40 --- /dev/null +++ b/Linux/command/atrm.md @@ -0,0 +1,38 @@ +atrm +=== + +删除待执行任务队列中的指定任务 + +## 补充说明 + +**atrm命令** 用于删除待执行任务队列中的指定任务。 + +### 语法 + +```shell +atrm(选项)(参数) +``` + +### 选项 + +```shell +-V:显示版本号。 +``` + +### 参数 + +任务号:指定待执行队列中要删除的任务。 + +### 实例 + +删除已经排队的任务 + +```shell +atq # 显示当前已经设置的任务 +2 Mon May 17 08:00:00 2010 a root +1 Sat May 15 17:00:00 2010 a root + +atrm 2 # 删除任务2 +``` + + diff --git a/Linux/command/awk.md b/Linux/command/awk.md new file mode 100644 index 00000000..5c0efe24 --- /dev/null +++ b/Linux/command/awk.md @@ -0,0 +1,982 @@ +awk +=== + +文本和数据进行处理的编程语言 + +## 补充说明 + +**awk** 是一种编程语言,用于在linux/unix下对文本和数据进行处理。数据可以来自标准输入(stdin)、一个或多个文件,或其它命令的输出。它支持用户自定义函数和动态正则表达式等先进功能,是linux/unix下的一个强大编程工具。它在命令行中使用,但更多是作为脚本来使用。awk有很多内建的功能,比如数组、函数等,这是它和C语言的相同之处,灵活性是awk最大的优势。 + +## awk命令格式和选项 + +**语法形式** + +```shell +awk [options] 'script' var=value file(s) +awk [options] -f scriptfile var=value file(s) +``` + +**常用命令选项** + +* **-F fs** fs指定输入分隔符,fs可以是字符串或正则表达式,如-F:,默认的分隔符是连续的空格或制表符 +* **-v var=value** 赋值一个用户定义变量,将外部变量传递给awk +* **-f scripfile** 从脚本文件中读取awk命令 +* **-m[fr] val** 对val值设置内在限制,-mf选项限制分配给val的最大块数目;-mr选项限制记录的最大数目。这两个功能是Bell实验室版awk的扩展功能,在标准awk中不适用。 + +## awk模式和操作 + +awk脚本是由模式和操作组成的。 + +### 模式 + +模式可以是以下任意一个: + +* /正则表达式/:使用通配符的扩展集。 +* 关系表达式:使用运算符进行操作,可以是字符串或数字的比较测试。 +* 模式匹配表达式:用运算符`~`(匹配)和`!~`(不匹配)。 +* BEGIN语句块、pattern语句块、END语句块:参见awk的工作原理 + +### 操作 + +操作由一个或多个命令、函数、表达式组成,之间由换行符或分号隔开,并位于大括号内,主要部分是: + +* 变量或数组赋值 +* 输出命令 +* 内置函数 +* 控制流语句 + +## awk脚本基本结构 + +```shell +awk 'BEGIN{ print "start" } pattern{ commands } END{ print "end" }' file +``` + +一个awk脚本通常由:BEGIN语句块、能够使用模式匹配的通用语句块、END语句块3部分组成,这三个部分是可选的。任意一个部分都可以不出现在脚本中,脚本通常是被 **单引号** 或 **双引号** 中,例如: + +```shell +awk 'BEGIN{ i=0 } { i++ } END{ print i }' filename +awk "BEGIN{ i=0 } { i++ } END{ print i }" filename +``` + +### awk的工作原理 + +```shell +awk 'BEGIN{ commands } pattern{ commands } END{ commands }' +``` + +* 第一步:执行`BEGIN{ commands }`语句块中的语句; +* 第二步:从文件或标准输入(stdin)读取一行,然后执行`pattern{ commands }`语句块,它逐行扫描文件,从第一行到最后一行重复这个过程,直到文件全部被读取完毕。 +* 第三步:当读至输入流末尾时,执行`END{ commands }`语句块。 + + **BEGIN语句块** 在awk开始从输入流中读取行 **之前** 被执行,这是一个可选的语句块,比如变量初始化、打印输出表格的表头等语句通常可以写在BEGIN语句块中。 + + **END语句块** 在awk从输入流中读取完所有的行 **之后** 即被执行,比如打印所有行的分析结果这类信息汇总都是在END语句块中完成,它也是一个可选语句块。 + + **pattern语句块** 中的通用命令是最重要的部分,它也是可选的。如果没有提供pattern语句块,则默认执行`{ print }`,即打印每一个读取到的行,awk读取的每一行都会执行该语句块。 + + **示例** + +```shell +echo -e "A line 1\nA line 2" | awk 'BEGIN{ print "Start" } { print } END{ print "End" }' +Start +A line 1 +A line 2 +End +``` + +当使用不带参数的`print`时,它就打印当前行,当`print`的参数是以逗号进行分隔时,打印时则以空格作为定界符。在awk的print语句块中双引号是被当作拼接符使用,例如: + +```shell +echo | awk '{ var1="v1"; var2="v2"; var3="v3"; print var1,var2,var3; }' +v1 v2 v3 +``` + +双引号拼接使用: + +```shell +echo | awk '{ var1="v1"; var2="v2"; var3="v3"; print var1"="var2"="var3; }' +v1=v2=v3 +``` + +{ }类似一个循环体,会对文件中的每一行进行迭代,通常变量初始化语句(如:i=0)以及打印文件头部的语句放入BEGIN语句块中,将打印的结果等语句放在END语句块中。 + +## awk内置变量(预定义变量) + +说明:[A][N][P][G]表示第一个支持变量的工具,[A]=awk、[N]=nawk、[P]=POSIXawk、[G]=gawk + +```shell + **$n** 当前记录的第n个字段,比如n为1表示第一个字段,n为2表示第二个字段。 + **$0** 这个变量包含执行过程中当前行的文本内容。 +[N] **ARGC** 命令行参数的数目。 +[G] **ARGIND** 命令行中当前文件的位置(从0开始算)。 +[N] **ARGV** 包含命令行参数的数组。 +[G] **CONVFMT** 数字转换格式(默认值为%.6g)。 +[P] **ENVIRON** 环境变量关联数组。 +[N] **ERRNO** 最后一个系统错误的描述。 +[G] **FIELDWIDTHS** 字段宽度列表(用空格键分隔)。 +[A] **FILENAME** 当前输入文件的名。 +[P] **FNR** 同NR,但相对于当前文件。 +[A] **FS** 字段分隔符(默认是任何空格)。 +[G] **IGNORECASE** 如果为真,则进行忽略大小写的匹配。 +[A] **NF** 表示字段数,在执行过程中对应于当前的字段数。 +[A] **NR** 表示记录数,在执行过程中对应于当前的行号。 +[A] **OFMT** 数字的输出格式(默认值是%.6g)。 +[A] **OFS** 输出字段分隔符(默认值是一个空格)。 +[A] **ORS** 输出记录分隔符(默认值是一个换行符)。 +[A] **RS** 记录分隔符(默认是一个换行符)。 +[N] **RSTART** 由match函数所匹配的字符串的第一个位置。 +[N] **RLENGTH** 由match函数所匹配的字符串的长度。 +[N] **SUBSEP** 数组下标分隔符(默认值是34)。 +``` + +转义序列 + +``` +\\ \自身 +\$ 转义$ +\t 制表符 +\b 退格符 +\r 回车符 +\n 换行符 +\c 取消换行 +``` + +**示例** + +```shell +echo -e "line1 f2 f3\nline2 f4 f5\nline3 f6 f7" | awk '{print "Line No:"NR", No of fields:"NF, "$0="$0, "$1="$1, "$2="$2, "$3="$3}' +Line No:1, No of fields:3 $0=line1 f2 f3 $1=line1 $2=f2 $3=f3 +Line No:2, No of fields:3 $0=line2 f4 f5 $1=line2 $2=f4 $3=f5 +Line No:3, No of fields:3 $0=line3 f6 f7 $1=line3 $2=f6 $3=f7 +``` + +使用`print $NF`可以打印出一行中的最后一个字段,使用`$(NF-1)`则是打印倒数第二个字段,其他以此类推: + +```shell +echo -e "line1 f2 f3\n line2 f4 f5" | awk '{print $NF}' +f3 +f5 +``` + +```shell +echo -e "line1 f2 f3\n line2 f4 f5" | awk '{print $(NF-1)}' +f2 +f4 + +``` + +打印每一行的第二和第三个字段: + +```shell +awk '{ print $2,$3 }' filename +``` + +统计文件中的行数: + +```shell +awk 'END{ print NR }' filename +``` + +以上命令只使用了END语句块,在读入每一行的时,awk会将NR更新为对应的行号,当到达最后一行NR的值就是最后一行的行号,所以END语句块中的NR就是文件的行数。 + +一个每一行中第一个字段值累加的例子: + +```shell +seq 5 | awk 'BEGIN{ sum=0; print "总和:" } { print $1"+"; sum+=$1 } END{ print "等于"; print sum }' +总和: +1+ +2+ +3+ +4+ +5+ +等于 +15 +``` + +## 将外部变量值传递给awk + +借助 **`-v`选项** ,可以将外部值(并非来自stdin)传递给awk: + +```shell +VAR=10000 +echo | awk -v VARIABLE=$VAR '{ print VARIABLE }' +``` + +另一种传递外部变量方法: + +```shell +var1="aaa" +var2="bbb" +echo | awk '{ print v1,v2 }' v1=$var1 v2=$var2 +``` + +当输入来自于文件时使用: + +```shell +awk '{ print v1,v2 }' v1=$var1 v2=$var2 filename +``` + +以上方法中,变量之间用空格分隔作为awk的命令行参数跟随在BEGIN、{}和END语句块之后。 + +## 查找进程pid + +```shell +netstat -antup | grep 7770 | awk '{ print $NF NR}' | awk '{ print $1}' +``` + +## awk运算与判断 + +作为一种程序设计语言所应具有的特点之一,awk支持多种运算,这些运算与C语言提供的基本相同。awk还提供了一系列内置的运算函数(如log、sqr、cos、sin等)和一些用于对字符串进行操作(运算)的函数(如length、substr等等)。这些函数的引用大大的提高了awk的运算功能。作为对条件转移指令的一部分,关系判断是每种程序设计语言都具备的功能,awk也不例外,awk中允许进行多种测试,作为样式匹配,还提供了模式匹配表达式~(匹配)和!~(不匹配)。作为对测试的一种扩充,awk也支持用逻辑运算符。 + +### 算术运算符 + +| 运算符 | 描述 | +| ----- | ---- | +| + - | 加,减 | +| * / & | 乘,除与求余 | +| + - ! | 一元加,减和逻辑非 | +| ^ *** | 求幂 | +| ++ -- | 增加或减少,作为前缀或后缀 | + +例: + +```shell +awk 'BEGIN{a="b";print a++,++a;}' +0 2 +``` + +注意:所有用作算术运算符进行操作,操作数自动转为数值,所有非数值都变为0 + +### 赋值运算符 + +| 运算符 | 描述 | +| ----- | ---- | +| = += -= *= /= %= ^= **= | 赋值语句 | + +例: + +```shell +a+=5; 等价于:a=a+5; 其它同类 +``` + +### 逻辑运算符 + +| 运算符 | 描述 | +| ----- | ---- | +| `\|\|` | 逻辑或 | +| && | 逻辑与 | + +例: + +```shell +awk 'BEGIN{a=1;b=2;print (a>5 && b<=2),(a>5 || b<=2);}' +0 1 +``` + +### 正则运算符 + +| 运算符 | 描述 | +| ----- | ---- | +| ~ !~ | 匹配正则表达式和不匹配正则表达式 | + +``` +^ 行首 +$ 行尾 +. 除了换行符以外的任意单个字符 +* 前导字符的零个或多个 +.* 所有字符 +[] 字符组内的任一字符 +[^]对字符组内的每个字符取反(不匹配字符组内的每个字符) +^[^] 非字符组内的字符开头的行 +[a-z] 小写字母 +[A-Z] 大写字母 +[a-Z] 小写和大写字母 +[0-9] 数字 +\< 单词头单词一般以空格或特殊字符做分隔,连续的字符串被当做单词 +\> 单词尾 +``` + +> 正则需要用 /正则/ 包围住 + +例: + +```shell +awk 'BEGIN{a="100testa";if(a ~ /^100*/){print "ok";}}' +ok +``` + +### 关系运算符 + +| 运算符 | 描述 | +| ----- | ---- | +| < <= > >= != == | 关系运算符 | + +例: + +```shell +awk 'BEGIN{a=11;if(a >= 9){print "ok";}}' +ok +``` + +注意:> < 可以作为字符串比较,也可以用作数值比较,关键看操作数如果是字符串就会转换为字符串比较。两个都为数字才转为数值比较。字符串比较:按照ASCII码顺序比较。 + +### 其它运算符 + +| 运算符 | 描述 | +| ----- | ---- | +| $ | 字段引用 | +| 空格 | 字符串连接符 | +| ?: | C条件表达式 | +| in | 数组中是否存在某键值 | + +例: + +```shell +awk 'BEGIN{a="b";print a=="b"?"ok":"err";}' +ok +``` + +```shell +awk 'BEGIN{a="b";arr[0]="b";arr[1]="c";print (a in arr);}' +0 +``` + +``` +awk 'BEGIN{a="b";arr[0]="b";arr["b"]="c";print (a in arr);}' +1 +``` + +### 运算级优先级表 + +!级别越高越优先 +级别越高越优先 + +## awk高级输入输出 + +### 读取下一条记录 + +awk中`next`语句使用:在循环逐行匹配,如果遇到next,就会跳过当前行,直接忽略下面语句。而进行下一行匹配。next语句一般用于多行合并: + +```shell +cat text.txt +a +b +c +d +e + +awk 'NR%2==1{next}{print NR,$0;}' text.txt +2 b +4 d +``` + +当记录行号除以2余1,就跳过当前行。下面的`print NR,$0`也不会执行。下一行开始,程序有开始判断`NR%2`值。这个时候记录行号是`:2` ,就会执行下面语句块:`'print NR,$0'` + +分析发现需要将包含有“web”行进行跳过,然后需要将内容与下面行合并为一行: + +```shell +cat text.txt +web01[192.168.2.100] +httpd ok +tomcat ok +sendmail ok +web02[192.168.2.101] +httpd ok +postfix ok +web03[192.168.2.102] +mysqld ok +httpd ok +0 +awk '/^web/{T=$0;next;}{print T":"t,$0;}' text.txt +web01[192.168.2.100]: httpd ok +web01[192.168.2.100]: tomcat ok +web01[192.168.2.100]: sendmail ok +web02[192.168.2.101]: httpd ok +web02[192.168.2.101]: postfix ok +web03[192.168.2.102]: mysqld ok +web03[192.168.2.102]: httpd ok +``` + +### 简单地读取一条记录 + +`awk getline`用法:输出重定向需用到`getline函数`。getline从标准输入、管道或者当前正在处理的文件之外的其他输入文件获得输入。它负责从输入获得下一行的内容,并给NF,NR和FNR等内建变量赋值。如果得到一条记录,getline函数返回1,如果到达文件的末尾就返回0,如果出现错误,例如打开文件失败,就返回-1。 + +getline语法:getline var,变量var包含了特定行的内容。 + +awk getline从整体上来说,用法说明: + +* **当其左右无重定向符`|`或`<`时:** getline作用于当前文件,读入当前文件的第一行给其后跟的变量`var`或`$0`(无变量),应该注意到,由于awk在处理getline之前已经读入了一行,所以getline得到的返回结果是隔行的。 +* **当其左右有重定向符`|`或`<`时:** getline则作用于定向输入文件,由于该文件是刚打开,并没有被awk读入一行,只是getline读入,那么getline返回的是该文件的第一行,而不是隔行。 + +**示例:** + +执行linux的`date`命令,并通过管道输出给`getline`,然后再把输出赋值给自定义变量out,并打印它: + +```shell +awk 'BEGIN{ "date" | getline out; print out }' test +``` + +执行shell的date命令,并通过管道输出给getline,然后getline从管道中读取并将输入赋值给out,split函数把变量out转化成数组mon,然后打印数组mon的第二个元素: + +```shell +awk 'BEGIN{ "date" | getline out; split(out,mon); print mon[2] }' test +``` + +命令ls的输出传递给geline作为输入,循环使getline从ls的输出中读取一行,并把它打印到屏幕。这里没有输入文件,因为BEGIN块在打开输入文件前执行,所以可以忽略输入文件。 + +```shell +awk 'BEGIN{ while( "ls" | getline) print }' +``` + +### 关闭文件 + +awk中允许在程序中关闭一个输入或输出文件,方法是使用awk的close语句。 + +```shell +close("filename") +``` + +filename可以是getline打开的文件,也可以是stdin,包含文件名的变量或者getline使用的确切命令。或一个输出文件,可以是stdout,包含文件名的变量或使用管道的确切命令。 + +### 输出到一个文件 + +awk中允许用如下方式将结果输出到一个文件: + +```shell +echo | awk '{printf("hello word!n") > "datafile"}' +# 或 +echo | awk '{printf("hello word!n") >> "datafile"}' +``` + +## 设置字段定界符 + +默认的字段定界符是空格,可以使用`-F "定界符"` 明确指定一个定界符: + +```shell +awk -F: '{ print $NF }' /etc/passwd +# 或 +awk 'BEGIN{ FS=":" } { print $NF }' /etc/passwd +``` + +在`BEGIN语句块`中则可以用`OFS=“定界符”`设置输出字段的定界符。 + +## 流程控制语句 + +在linux awk的while、do-while和for语句中允许使用break,continue语句来控制流程走向,也允许使用exit这样的语句来退出。break中断当前正在执行的循环并跳到循环外执行下一条语句。if 是流程选择用法。awk中,流程控制语句,语法结构,与c语言类型。有了这些语句,其实很多shell程序都可以交给awk,而且性能是非常快的。下面是各个语句用法。 + +### 条件判断语句 + +```shell +if(表达式) + 语句1 +else + 语句2 +``` + +格式中语句1可以是多个语句,为了方便判断和阅读,最好将多个语句用{}括起来。awk分枝结构允许嵌套,其格式为: + +```shell +if(表达式) + {语句1} +else if(表达式) + {语句2} +else + {语句3} +``` + +示例: + +```shell +awk 'BEGIN{ +test=100; +if(test>90){ + print "very good"; + } + else if(test>60){ + print "good"; + } + else{ + print "no pass"; + } +}' + +very good +``` + +每条命令语句后面可以用`;` **分号** 结尾。 + +### 循环语句 + +### # while语句 + +```shell +while(表达式) + {语句} +``` + +示例: + +```shell +awk 'BEGIN{ +test=100; +total=0; +while(i<=test){ + total+=i; + i++; +} +print total; +}' +5050 +``` + +### # for循环 + +for循环有两种格式: + +格式1: + +```shell +for(变量 in 数组) + {语句} +``` + +示例: + +```shell +awk 'BEGIN{ +for(k in ENVIRON){ + print k"="ENVIRON[k]; +} + +}' +TERM=linux +G_BROKEN_FILENAMES=1 +SHLVL=1 +pwd=/root/text +... +logname=root +HOME=/root +SSH_CLIENT=192.168.1.21 53087 22 +``` + +注:ENVIRON是awk常量,是子典型数组。 + +格式2: + +```shell +for(变量;条件;表达式) + {语句} +``` + +示例: + +```shell +awk 'BEGIN{ +total=0; +for(i=0;i<=100;i++){ + total+=i; +} +print total; +}' +5050 +``` + +### # do循环 + +```shell +do +{语句} while(条件) +``` + +例子: + +```shell +awk 'BEGIN{ +total=0; +i=0; +do {total+=i;i++;} while(i<=100) + print total; +}' +5050 +``` + +### 其他语句 + +* **break** 当 break 语句用于 while 或 for 语句时,导致退出程序循环。 +* **continue** 当 continue 语句用于 while 或 for 语句时,使程序循环移动到下一个迭代。 +* **next** 能能够导致读入下一个输入行,并返回到脚本的顶部。这可以避免对当前输入行执行其他的操作过程。 +* **exit** 语句使主输入循环退出并将控制转移到END,如果END存在的话。如果没有定义END规则,或在END中应用exit语句,则终止脚本的执行。 + +## 数组应用 + +数组是awk的灵魂,处理文本中最不能少的就是它的数组处理。因为数组索引(下标)可以是数字和字符串在awk中数组叫做关联数组(associative arrays)。awk 中的数组不必提前声明,也不必声明大小。数组元素用0或空字符串来初始化,这根据上下文而定。 + +### 数组的定义 + +数字做数组索引(下标): + +```shell +Array[1]="sun" +Array[2]="kai" +``` + +字符串做数组索引(下标): + +```shell +Array["first"]="www" +Array"[last"]="name" +Array["birth"]="1987" +``` + +使用中`print Array[1]`会打印出sun;使用`print Array[2]`会打印出kai;使用`print["birth"]`会得到1987。 + + **读取数组的值** + +```shell +{ for(item in array) {print array[item]}; } #输出的顺序是随机的 +{ for(i=1;i<=len;i++) {print array[i]}; } #Len是数组的长度 +``` + +### 数组相关函数 + +**得到数组长度:** + +```shell +awk 'BEGIN{info="it is a test";lens=split(info,tA," ");print length(tA),lens;}' +4 4 +``` + +length返回字符串以及数组长度,split进行分割字符串为数组,也会返回分割得到数组长度。 + +```shell +awk 'BEGIN{info="it is a test";split(info,tA," ");print asort(tA);}' +4 +``` + +asort对数组进行排序,返回数组长度。 + +**输出数组内容(无序,有序输出):** + +```shell +awk 'BEGIN{info="it is a test";split(info,tA," ");for(k in tA){print k,tA[k];}}' +4 test +1 it +2 is +3 a +``` + +`for…in`输出,因为数组是关联数组,默认是无序的。所以通过`for…in`得到是无序的数组。如果需要得到有序数组,需要通过下标获得。 + +```shell +awk 'BEGIN{info="it is a test";tlen=split(info,tA," ");for(k=1;k<=tlen;k++){print k,tA[k];}}' +1 it +2 is +3 a +4 test +``` + +注意:数组下标是从1开始,与C数组不一样。 + +**判断键值存在以及删除键值:** + +```shell +# 错误的判断方法: +awk 'BEGIN{tB["a"]="a1";tB["b"]="b1";if(tB["c"]!="1"){print "no found";};for(k in tB){print k,tB[k];}}' +no found +a a1 +b b1 +c +``` + +以上出现奇怪问题,`tB[“c”]`没有定义,但是循环时候,发现已经存在该键值,它的值为空,这里需要注意,awk数组是关联数组,只要通过数组引用它的key,就会自动创建改序列。 + +```shell +# 正确判断方法: +awk 'BEGIN{tB["a"]="a1";tB["b"]="b1";if( "c" in tB){print "ok";};for(k in tB){print k,tB[k];}}' +a a1 +b b1 +``` + +`if(key in array)`通过这种方法判断数组中是否包含`key`键值。 + +```shell +#删除键值: +awk 'BEGIN{tB["a"]="a1";tB["b"]="b1";delete tB["a"];for(k in tB){print k,tB[k];}}' +b b1 +``` + +`delete array[key]`可以删除,对应数组`key`的,序列值。 + +### 二维、多维数组使用 + +awk的多维数组在本质上是一维数组,更确切一点,awk在存储上并不支持多维数组。awk提供了逻辑上模拟二维数组的访问方式。例如,`array[2,4]=1`这样的访问是允许的。awk使用一个特殊的字符串`SUBSEP(�34)`作为分割字段,在上面的例子中,关联数组array存储的键值实际上是2�344。 + +类似一维数组的成员测试,多维数组可以使用`if ( (i,j) in array)`这样的语法,但是下标必须放置在圆括号中。类似一维数组的循环访问,多维数组使用`for ( item in array )`这样的语法遍历数组。与一维数组不同的是,多维数组必须使用`split()`函数来访问单独的下标分量。 + +```shell +awk 'BEGIN{ +for(i=1;i<=9;i++){ + for(j=1;j<=9;j++){ + tarr[i,j]=i*j; print i,"*",j,"=",tarr[i,j]; + } +} +}' +1 * 1 = 1 +1 * 2 = 2 +1 * 3 = 3 +1 * 4 = 4 +1 * 5 = 5 +1 * 6 = 6 +... +9 * 6 = 54 +9 * 7 = 63 +9 * 8 = 72 +9 * 9 = 81 +``` + +可以通过`array[k,k2]`引用获得数组内容。 + +另一种方法: + +```shell +awk 'BEGIN{ +for(i=1;i<=9;i++){ + for(j=1;j<=9;j++){ + tarr[i,j]=i*j; + } +} +for(m in tarr){ + split(m,tarr2,SUBSEP); print tarr2[1],"*",tarr2[2],"=",tarr[m]; +} +}' +``` + +## 内置函数 + +awk内置函数,主要分以下3种类似:算数函数、字符串函数、其它一般函数、时间函数。 + +### 算术函数 + +| 格式 | 描述 | +| ---- | ---- | +| atan2( y, x ) | 返回 y/x 的反正切。 | +| cos( x ) | 返回 x 的余弦;x 是弧度。 | +| sin( x ) | 返回 x 的正弦;x 是弧度。 | +| exp( x ) | 返回 x 幂函数。 | +| log( x ) | 返回 x 的自然对数。 | +| sqrt( x ) | 返回 x 平方根。 | +| int( x ) | 返回 x 的截断至整数的值。 | +| rand( ) | 返回任意数字 n,其中 0 <= n < 1。 | +| srand( [expr] ) | 将 rand 函数的种子值设置为 Expr 参数的值,或如果省略 Expr 参数则使用某天的时间。返回先前的种子值。 | + + +举例说明: + +```shell +awk 'BEGIN{OFMT="%.3f";fs=sin(1);fe=exp(10);fl=log(10);fi=int(3.1415);print fs,fe,fl,fi;}' +0.841 22026.466 2.303 3 + +``` + +OFMT 设置输出数据格式是保留3位小数。 + +获得随机数: + +```shell +awk 'BEGIN{srand();fr=int(100*rand());print fr;}' +78 +awk 'BEGIN{srand();fr=int(100*rand());print fr;}' +31 +awk 'BEGIN{srand();fr=int(100*rand());print fr;}' +41 +``` + +### 字符串函数 + +| 格式 | 描述 | +| ---- | ---- | +| gsub( Ere, Repl, [ In ] ) | 除了正则表达式所有具体值被替代这点,它和 sub 函数完全一样地执行。 | +| sub( Ere, Repl, [ In ] ) | 用 Repl 参数指定的字符串替换 In 参数指定的字符串中的由 Ere 参数指定的扩展正则表达式的第一个具体值。sub 函数返回替换的数量。出现在 Repl 参数指定的字符串中的 &(和符号)由 In 参数指定的与 Ere 参数的指定的扩展正则表达式匹配的字符串替换。如果未指定 In 参数,缺省值是整个记录($0 记录变量)。 | +| index( String1, String2 ) | 在由 String1 参数指定的字符串(其中有出现 String2 指定的参数)中,返回位置,从 1 开始编号。如果 String2 参数不在 String1 参数中出现,则返回 0(零)。 | +| length [(String)] | 返回 String 参数指定的字符串的长度(字符形式)。如果未给出 String 参数,则返回整个记录的长度($0 记录变量)。 | +| blength [(String)] | 返回 String 参数指定的字符串的长度(以字节为单位)。如果未给出 String 参数,则返回整个记录的长度($0 记录变量)。 | +| substr( String, M, [ N ] ) | 返回具有 N 参数指定的字符数量子串。子串从 String 参数指定的字符串取得,其字符以 M 参数指定的位置开始。M 参数指定为将 String 参数中的第一个字符作为编号 1。如果未指定 N 参数,则子串的长度将是 M 参数指定的位置到 String 参数的末尾 的长度。 | +| match( String, Ere ) | 在 String 参数指定的字符串(Ere 参数指定的扩展正则表达式出现在其中)中返回位置(字符形式),从 1 开始编号,或如果 Ere 参数不出现,则返回 0(零)。RSTART 特殊变量设置为返回值。RLENGTH 特殊变量设置为匹配的字符串的长度,或如果未找到任何匹配,则设置为 -1(负一)。| +| split( String, A, [Ere] ) | 将 String 参数指定的参数分割为数组元素 A[1], A[2], . . ., A[n],并返回 n 变量的值。此分隔可以通过 Ere 参数指定的扩展正则表达式进行,或用当前字段分隔符(FS 特殊变量)来进行(如果没有给出 Ere 参数)。除非上下文指明特定的元素还应具有一个数字值,否则 A 数组中的元素用字符串值来创建。 | +| tolower( String ) | 返回 String 参数指定的字符串,字符串中每个大写字符将更改为小写。大写和小写的映射由当前语言环境的 LC_CTYPE 范畴定义。 | +| toupper( String ) | 返回 String 参数指定的字符串,字符串中每个小写字符将更改为大写。大写和小写的映射由当前语言环境的 LC_CTYPE 范畴定义。 | +| sprintf(Format, Expr, Expr, . . . ) | 根据 Format 参数指定的 printf 子例程格式字符串来格式化 Expr 参数指定的表达式并返回最后生成的字符串。 | + + +注:Ere都可以是正则表达式。 + +**gsub,sub使用** + +```shell +awk 'BEGIN{info="this is a test2010test!";gsub(/[0-9]+/,"!",info);print info}' +this is a test!test! +``` + +在 info中查找满足正则表达式,`/[0-9]+/` 用`””`替换,并且替换后的值,赋值给info 未给info值,默认是`$0` + + **查找字符串(index使用)** + +```shell +awk 'BEGIN{info="this is a test2010test!";print index(info,"test")?"ok":"no found";}' +ok +``` + +未找到,返回0 + +**正则表达式匹配查找(match使用)** + +``` +awk 'BEGIN{info="this is a test2010test!";print match(info,/[0-9]+/)?"ok":"no found";}' +ok +``` + +**截取字符串(substr使用)** + +```shell +[wangsl@centos5 ~]$ awk 'BEGIN{info="this is a test2010test!";print substr(info,4,10);}' +s is a tes +``` + +从第 4个 字符开始,截取10个长度字符串 + +**字符串分割(split使用)** + +```shell +awk 'BEGIN{info="this is a test";split(info,tA," ");print length(tA);for(k in tA){print k,tA[k];}}' +4 +4 test +1 this +2 is +3 a +``` + +分割info,动态创建数组tA,这里比较有意思,`awk for …in`循环,是一个无序的循环。 并不是从数组下标1…n ,因此使用时候需要注意。 + +**格式化字符串输出(sprintf使用)** + +格式化字符串格式: + +其中格式化字符串包括两部分内容:一部分是正常字符,这些字符将按原样输出; 另一部分是格式化规定字符,以`"%"`开始,后跟一个或几个规定字符,用来确定输出内容格式。 + +| 格式 | 描述 | 格式 | 描述 | +| ---- | ---- | ---- | ---- | +| %d | 十进制有符号整数 | %u | 十进制无符号整数 | +| %f | 浮点数 | %s | 字符串 | +| %c | 单个字符 | %p | 指针的值 | +| %e | 指数形式的浮点数 | %x | %X 无符号以十六进制表示的整数 | +| %o | 无符号以八进制表示的整数 | %g | 自动选择合适的表示法 | + + +```shell +awk 'BEGIN{n1=124.113;n2=-1.224;n3=1.2345; printf("%.2f,%.2u,%.2g,%X,%on",n1,n2,n3,n1,n1);}' +124.11,18446744073709551615,1.2,7C,174 +``` + +### 一般函数 + +| 格式 | 描述 | +| ---- | ---- | +| close( Expression ) | 用同一个带字符串值的 Expression 参数来关闭由 print 或 printf 语句打开的或调用 getline 函数打开的文件或管道。如果文件或管道成功关闭,则返回 0;其它情况下返回非零值。如果打算写一个文件,并稍后在同一个程序中读取文件,则 close 语句是必需的。 | +| system(command ) | 执行 Command 参数指定的命令,并返回退出状态。等同于 system 子例程。| +| Expression `\|` getline [ Variable ] | 从来自 Expression 参数指定的命令的输出中通过管道传送的流中读取一个输入记录,并将该记录的值指定给 Variable 参数指定的变量。如果当前未打开将 Expression 参数的值作为其命令名称的流,则创建流。创建的流等同于调用 popen 子例程,此时 Command 参数取 Expression 参数的值且 Mode 参数设置为一个是 r 的值。只要流保留打开且 Expression 参数求得同一个字符串,则对 getline 函数的每次后续调用读取另一个记录。如果未指定 Variable 参数,则 $0 记录变量和 NF 特殊变量设置为从流读取的记录。| +| getline [ Variable ] < Expression | 从 Expression 参数指定的文件读取输入的下一个记录,并将 Variable 参数指定的变量设置为该记录的值。只要流保留打开且 Expression 参数对同一个字符串求值,则对 getline 函数的每次后续调用读取另一个记录。如果未指定 Variable 参数,则 $0 记录变量和 NF 特殊变量设置为从流读取的记录。 | +| getline [ Variable ] | 将 Variable 参数指定的变量设置为从当前输入文件读取的下一个输入记录。如果未指定 Variable 参数,则 $0 记录变量设置为该记录的值,还将设置 NF、NR 和 FNR 特殊变量。 | + +**打开外部文件(close用法)** + +```shell +awk 'BEGIN{while("cat /etc/passwd"|getline){print $0;};close("/etc/passwd");}' +root:x:0:0:root:/root:/bin/bash +bin:x:1:1:bin:/bin:/sbin/nologin +daemon:x:2:2:daemon:/sbin:/sbin/nologin +``` + +**逐行读取外部文件(getline使用方法)** + +```shell +awk 'BEGIN{while(getline < "/etc/passwd"){print $0;};close("/etc/passwd");}' +root:x:0:0:root:/root:/bin/bash +bin:x:1:1:bin:/bin:/sbin/nologin +daemon:x:2:2:daemon:/sbin:/sbin/nologin +``` + +```shell +awk 'BEGIN{print "Enter your name:";getline name;print name;}' +Enter your name: +chengmo +chengmo +``` + +**调用外部应用程序(system使用方法)** + +```shell +awk 'BEGIN{b=system("ls -al");print b;}' +total 42092 +drwxr-xr-x 14 chengmo chengmo 4096 09-30 17:47 . +drwxr-xr-x 95 root root 4096 10-08 14:01 .. +``` + +b返回值,是执行结果。 + +### 时间函数 + +| 格式 | 描述 | +| ---- | ---- | +| 函数名 | 说明 | +| mktime( YYYY MM dd HH MM ss[ DST]) | 生成时间格式 | +| strftime([format [, timestamp]]) | 格式化时间输出,将时间戳转为时间字符串具体格式,见下表。 | +| systime() | 得到时间戳,返回从1970年1月1日开始到当前时间(不计闰年)的整秒数 | + +**建指定时间(mktime使用)** + +```shell +awk 'BEGIN{tstamp=mktime("2001 01 01 12 12 12");print strftime("%c",tstamp);}' +2001年01月01日 星期一 12时12分12秒 +``` + +```shell +awk 'BEGIN{tstamp1=mktime("2001 01 01 12 12 12");tstamp2=mktime("2001 02 01 0 0 0");print tstamp2-tstamp1;}' +2634468 +``` + +求2个时间段中间时间差,介绍了strftime使用方法 + +```shell +awk 'BEGIN{tstamp1=mktime("2001 01 01 12 12 12");tstamp2=systime();print tstamp2-tstamp1;}' +308201392 +``` + +**strftime日期和时间格式说明符** + +| 格式 | 描述 | +| ---- | ---- | +| %a | 星期几的缩写(Sun) | +| %A | 星期几的完整写法(Sunday) | +| %b | 月名的缩写(Oct) | +| %B | 月名的完整写法(October) | +| %c | 本地日期和时间 | +| %d | 十进制日期 | +| %D | 日期 08/20/99 | +| %e | 日期,如果只有一位会补上一个空格 | +| %H | 用十进制表示24小时格式的小时 | +| %I | 用十进制表示12小时格式的小时 | +| %j | 从1月1日起一年中的第几天 | +| %m | 十进制表示的月份 | +| %M | 十进制表示的分钟 | +| %p | 12小时表示法(AM/PM) | +| %S | 十进制表示的秒 | +| %U | 十进制表示的一年中的第几个星期(星期天作为一个星期的开始) | +| %w | 十进制表示的星期几(星期天是0) | +| %W | 十进制表示的一年中的第几个星期(星期一作为一个星期的开始) | +| %x | 重新设置本地日期(08/20/99) | +| %X | 重新设置本地时间(12:00:00) | +| %y | 两位数字表示的年(99) | +| %Y | 当前月份 | +| %% | 百分号(%) | + + diff --git a/Linux/command/axel.md b/Linux/command/axel.md new file mode 100644 index 00000000..74915d6e --- /dev/null +++ b/Linux/command/axel.md @@ -0,0 +1,69 @@ +axel +=== + +多线程下载工具 + +## 补充说明 + +**axel** 是Linux下一个不错的HTTP/ftp高速下载工具。支持多线程下载、断点续传,且可以从多个地址或者从一个地址的多个连接来下载同一个文件。适合网速不给力时多线程下载提高下载速度。比如在国内VPS或服务器上下载lnmp一键安装包用Axel就比wget快。 + +### 安装 + +CentOS安装Axel: + +目前yum源上没有Axel,我们可以到 http://pkgs.repoforge.org/axel/ 下载rpm包安装。 + +32位CentOS执行下面命令: + +```shell +wget -c http://pkgs.repoforge.org/axel/axel-2.4-1.el5.rf.i386.rpm +rpm -ivh axel-2.4-1.el5.rf.i386.rpm +``` + +64位CentOS执行下面命令: + +```shell +wget -c http://pkgs.repoforge.org/axel/axel-2.4-1.el5.rf.x86_64.rpm +rpm -ivh axel-2.4-1.el5.rf.x86_64.rpm +``` + +Debian/Ubuntu安装Axel: + +```shell +apt-get install axel +``` + +### 语法 + +```shell +axel [options] url1 [url2] [url...] +``` + +### 选项 + +```shell +--max-speed=x , -s x # 最高速度x +--num-connections=x , -n x # 连接数x +--output=f , -o f # 下载为本地文件f +--search[=x] , -S [x] # 搜索镜像 +--header=x , -H x # 添加头文件字符串x(指定 HTTP header) +--user-agent=x , -U x # 设置用户代理(指定 HTTP user agent) +--no-proxy , -N # 不使用代理服务器 +--quiet , -q # 静默模式 +--verbose ,-v # 更多状态信息 +--alternate , -a # Alternate progress indicator +--help ,-h # 帮助 +--version ,-V # 版本信息 +``` + +### 实例 + +如下载lnmp安装包指定10个线程,存到 `/tmp/`: + +```shell +axel -n 10 -o /tmp/ http://www.jsdig.com/lnmp.tar.gz +``` + +如果下载过程中下载中断可以再执行下载命令即可恢复上次的下载进度。 + + diff --git a/Linux/command/badblocks.md b/Linux/command/badblocks.md new file mode 100644 index 00000000..dbd00a31 --- /dev/null +++ b/Linux/command/badblocks.md @@ -0,0 +1,84 @@ +badblocks +=== + +查找磁盘中损坏的区块 + +## 补充说明 + +**badblock命令** 用于查找磁盘中损坏的区块。 硬盘是一个损耗设备,当使用一段时间后可能会出现坏道等物理故障。电脑硬盘出现坏道后,如果不及时更换或进行技术处理,坏道就会越来越多,并会造成频繁死机和数据丢失。最好的处理方式是更换磁盘,但在临时的情况下,应及时屏蔽坏道部分的扇区,不要触动它们。badblocks就是一个很好的检查坏道位置的工具。 + +### 语法 + +```shell +badblock(选项)(参数) +``` + +### 选项 + +```shell +-b<区块大小>:指定磁盘的区块大小,单位为字节; +-o<输出文件>:将检查的结果写入指定的输出文件; +-s:在检查时显示进度; +-v:执行时显示详细的信息; +-w:在检查时,执行写入测试。 +``` + +### 参数 + +* 磁盘装置:指定要检查的磁盘装置; +* 磁盘区块数:指定磁盘装置的区块总数; +* 启始区块:指定要从哪个区块开始检查。 + +### 实例 + +badblocks以 4096 的一个block,每一个block检查16次,将结果输出到“hda-badblocks-list”文件里。 + +```shell +badblocks -b 4096 -c 16 /dev/hda1 -o hda-badblocks-list +``` + +hda-badblocks-list是个文本文件,内容如下: + +```shell +cat hda-badblocks-list +51249 +51250 +51251 +51253 +51254 +…… +61245 +…… +``` + +可以针对可疑的区块多做几次操作。下面,badblocks以4096字节为一个“block”,每一个“block”检查1次, 将结果输出到“hda-badblocks-list.1”文件中,由第51000 block开始,到63000 block结束。 + +```shell +badblocks -b 4096 -c 1 /dev/hda1 -o hda-badblocks-list.1 63000 51000 +``` + +这次花费的时间比较短,硬盘在指定的情况下在很短的时间就产生“嘎嘎嘎嘎”的响声。由于检查条件的不同,其输出的结果也不完全是相同的。重复几次同样的操作,因条件多少都有些不同,所以结果也有所不同。进行多次操作后,直到产生最后的hda-badblock-list.final文件。 + +### 其他 + +**1、fsck使用badblocks的信息** + +badblocks只会在日志文件中标记出坏道的信息,但若希望在检测磁盘时也能跳过这些坏块不检测,可以使用fsck的-l参数: + +``` +fsck.ext3 -l /tmp/hda-badblock-list.final /dev/hda1 +``` + +**2、在创建文件系统前检测坏道** + +badblocks可以随e2fsck和mke2fs的-c删除一起运行(对ext3文件系统也一样),在创建文件系统前就先检测坏道信息: + +```shell +mkfs.ext3 -c /dev/hda1 +``` + +代码表示使用-c在创建文件系统前检查坏道的硬盘。 + +这个操作已经很清楚地告知我们可以采用`mkfs.ext3 -c`选项用`read-only`方式检查硬盘。这个命令会在格式化硬盘时检查硬盘,并标出错误的硬盘“block”。用这个方法格式化硬盘,需要有相当大的耐心,因为命令运行后,会一个个用读的方式检查硬盘。 + + diff --git a/Linux/command/base64.md b/Linux/command/base64.md new file mode 100644 index 00000000..8a8e4e16 --- /dev/null +++ b/Linux/command/base64.md @@ -0,0 +1,52 @@ +base64 +=== + +base64 编码/解码文件或标准输入输出 + +### 描述 + +base64将`文件`或`标准输入`编码或解码为标准输出; + +### 语法 + +```shell +base64 [OPTION]... [FILE] +``` + +### 参数 + +```shell +-d, --decode # 解码 +-i, --ignore-garbage # 解码时,忽略非字母字符 +-w, --wrap=COLS # 在指定的字符数后自动换行(默认为76), 0 为禁用自动换行 + +--help # 显示此帮助说明并退出 +--version # 输出版本信息并退出 +``` + +### 实例 + +编码字符串 + +```bash +printf foo|base64 +``` + +编码文件 + +```bash +base64 file +``` + +解码 + +```bash +printf Zm9v|base64 -d +``` + +解码文件 + +```bash +base64 -d file +``` + diff --git a/Linux/command/basename.md b/Linux/command/basename.md new file mode 100644 index 00000000..731dac68 --- /dev/null +++ b/Linux/command/basename.md @@ -0,0 +1,46 @@ +basename +=== + +打印目录或者文件的基本名称 + +## 补充说明 + +**basename命令** 用于打印目录或者文件的基本名称。basename和dirname命令通常用于shell脚本中的命令替换来指定和指定的输入文件名称有所差异的输出文件名称。 + +### 语法 + +```shell +basename(选项)(参数) +``` + +### 选项 + +```shell +--help:显示帮助; +--version:显示版本号。 +``` + +### 参数 + +* 文件:带路径信息的文件; +* 后缀:可选参数,指定要去除的文件后缀字符串。 + +### 实例 + +1、要显示一个shell变量的基本名称,请输入: + +```shell +basename $WORKFILE +``` + +此命令显示指定给shell变量WORKFILE的值的基本名称。如果WORKFILE变量的值是`/home/jim/program.c`文件,则此命令显示program.c。 + +要构造一个和另一个文件名称相同(除了后缀)的文件名称,请输入: + +```shell +OFILE=`basename $1 .c`.o +``` + +此命令指定给 OFILE 文件第一个位置上的参数($1)的值,但它的 .c 后缀更改至 .o。如果 $1 是 /home/jim/program.c 文件,则 OFILE 成为 program.o。因为 program.o 仅是一个基本文件名称,它标识在当前目录中的文件。 + + diff --git a/Linux/command/batch.md b/Linux/command/batch.md new file mode 100644 index 00000000..2531de30 --- /dev/null +++ b/Linux/command/batch.md @@ -0,0 +1,37 @@ +batch +=== + +在系统不繁忙的时候执行定时任务 + +## 补充说明 + +**batch命令** 用于在指定时间,当系统不繁忙时执行任务,用法与at相似。 + +### 语法 + +```shell +batch(选项)(参数) +``` + +### 选项 + +```shell +-f:指定包含具体指令的任务文件; +-q:指定新任务的队列名称; +-m:任务执行完后向用户发送E-mail。 +``` + +### 参数 + +日期时间:指定任务执行的日期时间。 + +### 实例 + +```shell +batch +at> echo 1234 +at> +job 5 at Sun Apr 28 08:49:00 2013 +``` + + diff --git a/Linux/command/bc.md b/Linux/command/bc.md new file mode 100644 index 00000000..1cf3a43e --- /dev/null +++ b/Linux/command/bc.md @@ -0,0 +1,78 @@ +bc +=== + +算术操作精密运算工具 + +## 补充说明 + +**bc命令** 是一种支持任意精度的交互执行的计算器语言。bash内置了对整数四则运算的支持,但是并不支持浮点运算,而bc命令可以很方便的进行浮点运算,当然整数运算也不再话下。 + +### 语法 + +```shell +bc(选项)(参数) +``` + +### 选项 + +```shell +-i:强制进入交互式模式; +-l:定义使用的标准数学库; +-w:对POSIX bc的扩展给出警告信息; +-q:不打印正常的GNU bc环境信息; +-v:显示指令版本信息; +-h:显示指令的帮助信息。 +``` + +### 参数 + +文件:指定包含计算任务的文件。 + +### 实例 + +算术操作高级运算bc命令它可以执行浮点运算和一些高级函数: + +```shell +echo "1.212*3" | bc +3.636 + +``` + +设定小数精度(数值范围) + +```shell +echo "scale=2;3/8" | bc +0.37 + +``` + +参数`scale=2`是将bc输出结果的小数位设置为2位。 + +进制转换 + +```shell +#!/bin/bash +abc=192 +echo "obase=2;$abc" | bc + +``` + +执行结果为:11000000,这是用bc将十进制转换成二进制。 + +```shell +#!/bin/bash +abc=11000000 +echo "obase=10;ibase=2;$abc" | bc + +``` + +执行结果为:192,这是用bc将二进制转换为十进制。 + +计算平方和平方根: + +```shell +echo "10^10" | bc +echo "sqrt(100)" | bc +``` + + diff --git a/Linux/command/bg.md b/Linux/command/bg.md new file mode 100644 index 00000000..7dd0cb3f --- /dev/null +++ b/Linux/command/bg.md @@ -0,0 +1,48 @@ +bg +=== + +将前台终端作业移动到后台运行 + +## 概要 + +```shell +bg [job_spec ...] +``` + +## 主要用途 + +- 用于将作业放到后台运行,使前台可以执行其他任务。该命令的运行效果与在指令后面添加符号`&`的效果是相同的,都是将其放到系统后台执行。 + +- 若后台任务中只有一个,则使用该命令时可以省略任务号。 + +## 参数 + +job_spec(可选):指定要移动到后台执行的作业标识符,可以是一到多个。 + +## 返回值 + +返回成功除非未开启作业控制或发生了错误。 + +## 例子 + +```shell +# 运行sleep命令,然后按下ctrl+z。 +sleep 60 +^Z +[1]+ Stopped sleep 60 + +# 使用bg命令使得作业在后台运行。 +bg %1 + +# 返回信息: +[1]+ sleep 60 & +``` + +### 注意 + +1. `bash`的作业控制命令包括`bg fg kill wait disown suspend`。 +2. 该命令需要`set`选项`monitor`处于开启状态时才能执行;查看作业控制状态:输入`set -o`查看`monitor`行;执行`set -o monitor`或`set -m`开启该选项。 +3. 该命令是bash内建命令,相关的帮助信息请查看`help`命令。 + + + diff --git a/Linux/command/bind.md b/Linux/command/bind.md new file mode 100644 index 00000000..8a431ed9 --- /dev/null +++ b/Linux/command/bind.md @@ -0,0 +1,58 @@ +bind +=== + +显示或设置键盘按键与其相关的功能 + +## 补充说明 + +**bind命令** 用于显示和设置命令行的键盘序列绑定功能。通过这一命令,可以提高命令行中操作效率。您可以利用bind命令了解有哪些按键组合与其功能,也可以自行指定要用哪些按键组合。 + +### 语法 + +```shell +bind(选项) +``` + +### 选项 + +```shell +-d:显示按键配置的内容; +-f<按键配置文件>:载入指定的按键配置文件; +-l:列出所有的功能; +-m<按键配置>:指定按键配置; +-q<功能>:显示指定功能的按键; +-v:列出目前的按键配置与其功能。 +``` + +### 实例 + +```shell +bind -x '"\C-l":ls -l' #直接按 CTRL+L 就列出目录 +``` + +其中keyseq可以使用`showkey -a`命令来获取: + +```shell +showkey -a + +Press any keys - Ctrl-D will terminate this program + +^[[A 27 0033 0x1b 上 + 91 0133 0x5b + 65 0101 0x41 +^[[B 27 0033 0x1b 下 + 91 0133 0x5b + 66 0102 0x42 +^[[D 27 0033 0x1b 左 + 91 0133 0x5b + 68 0104 0x44 +^[[C 27 0033 0x1b 右 + 91 0133 0x5b + 67 0103 0x43 + 32 0040 0x20 +^M 13 0015 0x0d 字母M +^C 3 0003 0x03 Ctrl-C +^D 4 0004 0x04 Ctrl-D 退出 +``` + + diff --git a/Linux/command/blkid.md b/Linux/command/blkid.md new file mode 100644 index 00000000..be112b59 --- /dev/null +++ b/Linux/command/blkid.md @@ -0,0 +1,95 @@ +blkid +=== + +查看块设备的文件系统类型、LABEL、UUID等信息 + +## 补充说明 + +在Linux下可以使用 **blkid命令** 对查询设备上所采用文件系统类型进行查询。blkid主要用来对系统的块设备(包括交换分区)所使用的文件系统类型、LABEL、UUID等信息进行查询。要使用这个命令必须安装e2fsprogs软件包。 + +### 语法 + +```shell +blkid -L | -U +blkid [-c ] [-ghlLv] [-o] [-s ][-t ] -[w ] [ ...] +blkid -p [-s ] [-O ] [-S ][-o] ... +blkid -i [-s ] [-o] ... +``` + +### 选项 + +```shell +-c # 指定cache文件(default: /etc/blkid.tab, /dev/null = none) +-d # don't encode non-printing characters +-h # 显示帮助信息 +-g # garbage collect the blkid cache +-o # 指定输出格式 +-k # list all known filesystems/RAIDs and exit +-s # 显示指定信息,默认显示所有信息 +-t # find device with a specific token (NAME=value pair) +-l # look up only first device with token specified by -t +-L