diff --git a/Linux_man_cn/at.md b/Linux_man_cn/at.md index 7e2bd7e..2e27905 100644 --- a/Linux_man_cn/at.md +++ b/Linux_man_cn/at.md @@ -1,83 +1,35 @@ -at -=== - -在指定时间执行一个任务 +# **at** ## 说明 -**at命令** 用于在指定时间执行命令。at允许使用一套相当复杂的指定时间的方法。它能够接受在当天的hh:mm(小时:分钟)式的时间指定。假如该时间已过去,那么就放在第二天执行。当然也能够使用midnight(深夜),noon(中午),teatime(饮茶时间,一般是下午4点)等比较模糊的 词语来指定时间。用户还能够采用12小时计时制,即在时间后面加上AM(上午)或PM(下午)来说明是上午还是下午。 也能够指定命令执行的具体日期,指定格式为month day(月 日)或mm/dd/yy(月/日/年)或dd.mm.yy(日.月.年)。指定的日期必须跟在指定时间的后面。 +**at命令** 用于在指定时间执行命令。at允许使用一套相当复杂的指定时间的方法。它能够接受在当天的hh:mm(小时:分钟)式的时间 +指定。假如该时间已过去,那么就放在第二天执行。当然也能够使用midnight(深夜),noon(中午),teatime(饮茶时间,一般是下 +午4点)等比较模糊的 词语来指定时间。用户还能够采用12小时计时制,即在时间后面加上AM(上午)或PM(下午)来说明是上午还是 +下午。 也能够指定命令执行的具体日期,指定格式为month day(月 日)或mm/dd/yy(月/日/年)或dd.mm.yy(日.月.年)。指定的 +日期必须跟在指定时间的后面 -上面介绍的都是绝对计时法,其实还能够使用相对计时法,这对于安排不久就要执行的命令是很有好处的。指定格式为:`now + count time-units`,now就是当前时间,time-units是时间单位,这里能够是minutes(分钟)、hours(小时)、days(天)、weeks(星期)。count是时间的数量,究竟是几天,还是几小时,等等。 更有一种计时方法就是直接使用today(今天)、tomorrow(明天)来指定完成命令的时间。 +上面介绍的都是绝对计时法,其实还能够使用相对计时法,这对于安排不久就要执行的命令是很有好处的。指定格式为: +`now + count time-units`,now就是当前时间,time-units是时间单位,这里能够是minutes(分钟)、hours(小时)、days(天) +、weeks(星期)。count是时间的数量,究竟是几天,还是几小时,等等。 更有一种计时方法就是直接使用today(今天)、tomorrow +(明天)来指定完成命令的时间 -### 语法 +## 选项 -``` -at(选项)(参数) +```markdown +-f:指定包含具体指令的任务文件 +-q:指定新任务的队列名称 +-l:显示待执行任务的列表 +-d:删除指定的待执行任务 +-m:任务执行完成后向用户发送E-mail ``` - +## 实例 +```bash +echo "mail -s 'get the train' P@draigBrady.com < /dev/null" | at 17:45 # 在指定的时间发送邮件 +/bin/ls | at 5pm+3 days # 三天后的下午5点锺执行/bin/ls +date >/root/2013.log | at 17:20 tomorrow # 明天17点钟,输出时间到指定文件内 +atq # 计划任务设定后,在没有执行之前我们可以用atq命令来查看系统没有执行工作任务 +at -c 8 # 显示已经设置的任务内容 +echo "DISPLAY=$DISPLAY xmessage cooker" | at "NOW + 30 minutes" # 在给定的时间弹出对话框 ``` --f:指定包含具体指令的任务文件; --q:指定新任务的队列名称; --l:显示待执行任务的列表; --d:删除指定的待执行任务; --m:任务执行完成后向用户发送E-mail。 -``` - -### 参数 - -日期时间:指定任务执行的日期时间。 - -### 实例 - -三天后的下午 5 点锺执行`/bin/ls`: - -``` -[root@localhost ~]# at 5pm+3 days -at> /bin/ls -at> -job 7 at 2013-01-08 17:00 -``` - -明天17点钟,输出时间到指定文件内: - -``` -[root@localhost ~]# at 17:20 tomorrow -at> date >/root/2013.log -at> -job 8 at 2013-01-06 17:20 -``` - -计划任务设定后,在没有执行之前我们可以用atq命令来查看系统没有执行工作任务: - -``` -[root@localhost ~]# atq -8 2013-01-06 17:20 a root -7 2013-01-08 17:00 a root -``` - -删除已经设置的任务: - -``` -[root@localhost ~]# atq -8 2013-01-06 17:20 a root -7 2013-01-08 17:00 a root - -[root@localhost ~]# atrm 7 -[root@localhost ~]# atq -8 2013-01-06 17:20 a root -``` - -显示已经设置的任务内容: - -``` -[root@localhost ~]# at -c 8 -#!/bin/sh -# atrun uid=0 gid=0 -# mail root 0 -umask 22此处省略n个字符 -date >/root/2013.log -``` - - diff --git a/Linux_man_cn/awk.md b/Linux_man_cn/awk.md index 15cea54..3e84e68 100644 --- a/Linux_man_cn/awk.md +++ b/Linux_man_cn/awk.md @@ -2,7 +2,7 @@ ## 说明 -**awk** awk的基本功能是在文件中搜索包含一个或多个模式的行或其他文本单元。当一行与其中一个模式匹配时,将对该行执行特殊操作 +awk的基本功能是在文件中搜索包含一个或多个模式的行或其他文本单元。当一行与其中一个模式匹配时,将对该行执行特殊操作 awk中的程序与大多数其他语言中的程序不同,因为awk程序是“数据驱动的”:您描述要使用的数据,然后在找到时执行的操作。大多数 其他语言都是“程序性的”。您必须详细描述该计划要采取的每个步骤。使用过程语言时,通常很难清楚地描述程序将处理的数据。出于 这个原因,awk程序通常易于读写 @@ -12,11 +12,11 @@ awk中的程序与大多数其他语言中的程序不同,因为awk程序是 ```markdown Usage: awk [POSIX or GNU style options] -f progfile [--] file ... Usage: awk [POSIX or GNU style options] [--] 'program' file ... -POSIX options:GNU long options: (standard) + -f progfile --file=progfile # 从脚本文件中读取awk命令 -F fs --field-separator=fs # fs指定输入分隔符,fs可以是字符串或正则表达式 -v var=val --assign=var=val # 赋值一个用户定义变量,将外部变量传递给awk -Short options:GNU long options: (extensions) + -b --characters-as-bytes -c --traditional -C --copyright @@ -34,11 +34,7 @@ Short options:GNU long options: (extensions) -S --sandbox -t --lint-old -To report bugs, see node `Bugs' in `gawk.info', which is -section `Reporting Problems and Bugs' in the printed version. - -gawk is a pattern scanning and processing language. -By default it reads standard input and writes standard output +gawk is a pattern scanning and processing language.By default it reads standard input and writes standard output ``` ## pattern @@ -61,60 +57,61 @@ pattern可以是以下任意一个: ## awk脚本基本结构 -```sh +```bash awk 'BEGIN{ commands } pattern{ commands } END{ commands }' ``` * 第一步:执行`BEGIN{ commands }`语句块中的语句; -* 第二步:从文件或标准输入(stdin)读取一行,然后执行`pattern{ commands }`语句块,它逐行扫描文件,从第一行到最后一行重复这个过程,直到文件全部被读取完毕。 +* 第二步:从文件或标准输入(stdin)读取一行,然后执行`pattern{ commands }`语句块,它逐行扫描文件,从第一行到最后一行重复
这个过程,直到文件全部被读取完毕。 * 第三步:当读至输入流末尾时,执行`END{ commands }`语句块。 -**BEGIN语句块** 在awk开始从输入流中读取行** 之前** 被执行,这是一个可选的语句块,比如变量初始化、打印输出表格的表头等语句通常可以写在BEGIN语句块中。 +**BEGIN语句块** 在awk开始从输入流中读取行** 之前** 被执行,这是一个可选的语句块,比如变量初始化、打印输出表格的表头等 +语句通常可以写在BEGIN语句块中 -**END语句块** 在awk从输入流中读取完所有的行** 之后** 即被执行,比如打印所有行的分析结果这类信息汇总都是在END语句块中完成,它也是一个可选语句块。 +**END语句块** 在awk从输入流中读取完所有的行** 之后** 即被执行,比如打印所有行的分析结果这类信息汇总都是在END语句块中 +完成,它也是一个可选语句块 -**pattern语句块** 中的通用命令是最重要的部分,它也是可选的。如果没有提供pattern语句块,则默认执行`{ print }`,即打印每一个读取到的行,awk读取的每一行都会执行该语句块。 +**pattern语句块** 中的通用命令是最重要的部分,它也是可选的。如果没有提供pattern语句块,则默认执行`{ print }`,即打印 +每一个读取到的行,awk读取的每一行都会执行该语句块 -一个awk脚本通常由:BEGIN语句块、能够使用模式匹配的通用语句块、END语句块3部分组成,这三个部分是可选的。任意一个部分都可以不出现在脚本中,脚本通常是被**单引号**或**双引号**中,例如: +一个awk脚本通常由:BEGIN语句块、能够使用模式匹配的通用语句块、END语句块3部分组成,这三个部分是可选的。任意一个部分都 +可以不出现在脚本中,脚本通常是被**单引号**或**双引号**中,例如: -```sh +```bash awk 'BEGIN{ i=0 } { i++ } END{ print i }' filename awk "BEGIN{ i=0 } { i++ } END{ print i }" filename ``` ## 实例 -```sh +```bash echo -e "A line 1nA line 2" | awk 'BEGIN{ print "Start" } { print } END{ print "End" }' -输出: +# 输出如下 +: << comment Start -A line 1 -A line 2 +A line 1nA line 2 End -``` - -当使用不带参数的`print`时,它就打印当前行,当`print`的参数是以逗号进行分隔时,打印时则以空格作为定界符。在awk的print语句块中双引号是被当作拼接符使用,例如: - -```sh -echo | awk '{ var1="v1"; var2="v2"; var3="v3"; print var1,var2,var3; }' -输出:v1 v2 v3 -``` -双引号拼接使用: +{ }类似一个循环体,会对文件中的每一行进行迭代,通常变量初始化语句(如:i=0)以及打印文件头部的语句放入BEGIN语句块中, +将打印的结果等语句放在END语句块中。 +comment -```sh -echo | awk '{ var1="v1"; var2="v2"; var3="v3"; print var1"="var2"="var3; }' -输出:v1=v2=v3 +# 当使用不带参数的`print`时,它就打印当前行,当`print`的参数是以逗号进行分隔时,打印时则以空格作为定界符。 +# 在awk的print语句块中双引号是被当作拼接符使用,例如: +echo | awk '{ var1="v1"; var2="v2"; var3="v3"; print var1,var2,var3; }' # 输出:v1 v2 v3 +echo | awk '{ var1="v1"; var2="v2"; var3="v3"; print var1"="var2"="var3; }' # 双引号使用例子,输出:v1=v2=v3 ``` -{ }类似一个循环体,会对文件中的每一行进行迭代,通常变量初始化语句(如:i=0)以及打印文件头部的语句放入BEGIN语句块中,将打印的结果等语句放在END语句块中。 - -## awk内置变量(预定义变量) +### awk内置变量(预定义变量) 说明:[A][N][P][G]表示第一个支持变量的工具,[A]=awk、[N]=nawk、[P]=POSIXawk、[G]=gawk -可自定义变量,变量可以是字符串或数值。输入字段的内容也可以分配给变量。为了更精确地控制输出格式而不是打印通常提供的输出格式,请使用printf。 printf命令可用于指定每个项目使用的字段宽度,以及数字的各种格式选择(例如要使用的输出基数,是否打印指数,是否打印标记以及数字位数在小数点后打印)。这是通过提供一个名为格式字符串的字符串来完成的,该字符串控制打印其他参数的方式和位置。 -```sh +可自定义变量,变量可以是字符串或数值。输入字段的内容也可以分配给变量。为了更精确地控制输出格式而不是打印通常提供的 +输出格式,请使用printf。 printf命令可用于指定每个项目使用的字段宽度,以及数字的各种格式选择(例如要使用的输出基数, +是否打印指数,是否打印标记以及数字位数在小数点后打印)。这是通过提供一个名为格式字符串的字符串来完成的,该字符串控 +制打印其他参数的方式和位置 + +```markdown $n 当前记录的第n个字段,比如n为1表示第一个字段,n为2表示第二个字段 $0 这个变量包含执行过程中当前行的文本内容 [N] ARGC 命令行参数的数目 @@ -139,168 +136,129 @@ $0 这个变量包含执行过程中当前行的文本内容 [N] SUBSEP 数组下标分隔符(默认值是34) ``` -```sh -# FS示例 -awk FS变量用于设置每个记录的字段分割符,其可以设置为任何单个字符或者正则表达式 -FS可以更改任意次数,会保留其值直到明确更改,如果想更改字段分割符,在阅读行之前更改,固此改变会影响阅读的内容 - -awk -F 'FS''命令'文件名 -或 -awk 'BEGIN {FS="FS";}' - -用于读取具有:作为字段分割符的/etc/passwd文件:awk -f etc_pass.awk /etc/passwd -BEGIN{ -FS = ":"; -print "\tUserID\tGroupID\tHomeDirectory"; -} -{ - print $1"\t"$3"\t"$4"\t"$6; -} -END{ - print NR,"打印记录" -#NR统计打印的数目 -} - -awk OFS是awk FS变量的输出,默认情况,awk OFS是单个空格字符 - -awk -F ':' '{print $3,$4;}' /etc/passwd - -打印语句中的:,默认情况下两个参数连接为一个空间,该空间是awk OFS的值,固其值被插入到输出中的字段之间 +### FS示例 +```bash +# awk FS变量用于设置每个记录的字段分割符,其可以设置为任何单个字符或者正则表达式 +# 默认的字段定界符是空格,可以使用`-F "定界符"`明确指定一个定界符 +# 在`BEGIN语句块`中则可以用`OFS=“定界符”`设置输出字段的定界符 +# FS可以更改任意次数,会保留其值直到明确更改,如果想更改字段分割符,在阅读行之前更改,因此改变会影响阅读的内容 + +# 大致格式:awk -F 'FS' '命令' 文件名 或 awk 'BEGIN {FS="FS";}' +# 用于读取具有:作为字段分割符的/etc/passwd文件 +awk 'BEGIN{ FS = ":"; print "\tUserID\tGroupID\tHomeDirectory"; } { print $1"\t"$3"\t"$4"\t"$6; } \ +END{ print NR,"打印记录总数" }' /etc/passwd + +# awk OFS是awk FS变量的输出,默认情况,awk OFS是单个空格字符 +# 打印语句中的:,默认情况下两个参数连接为一个空间,该空间是awk OFS的值,固其值被插入到输出中的字段之间 +awk -F ':' '{print $3,$4;}' /etc/passwd # 打印passwd文件第三第四个字段,-F设置定界符 awk -F ':' 'BEGIN{OFS ="=";}{print $3,$4;}' /etc/passwd ``` -```sh -# RS示例:记录分割符变量 -awk RS定义了一条线,awk默认逐行读取。将信息存储在一个文件中,每个记录由两个新行隔开,每个字段用一个新行分割 - -打印姓名和第二行数字 - -cat student.awk -BEGIN { - RS =“\ n \ n”;; - FS = “\ n”个; +### RS示例:记录分割符变量 -} -{ - print $ 1,$ 2; -} +```bash +# awk RS定义了一条线,awk默认逐行读取。将信息存储在一个文件中,每个记录由两个新行隔开,每个字段用一个新行分割 +awk 'BEGIN{ RS="\n\n"; FS="\n"; } { print $1,$2 }' student.txt # 打印姓名和第二行数字,student.txt文件内容如下 +: << comment +Jones +2143 +78 +84 +77 -awk -f student.awk student.txt -``` +Bob +2321 +56 +58 +45 +comment -```sh -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)`则打印倒数第二个字段,其他以此类推(超出数目则会全部输出): +echo -e "line1 f2 f3n line2 f4 f5" | awk '{print $NF}' # 输出f5 +echo -e "line1 f2 f3n line2 f4 f5" | awk '{print $(NF-1)}' # 输出f4 -```sh -# 使用`print $NF`可以打印出一行中的最后一个字段,使用`$(NF-1)`则是打印倒数第二个字段,其他以此类推: -echo -e "line1 f2 f3n line2 f4 f5" | awk '{print $NF}' -输出: -f3 -f5 -------------------------------------------------------------- -echo -e "line1 f2 f3n line2 f4 f5" | awk '{print $(NF-1)}' -输出: -f2 -f4 -``` +awk 'END{ print NR }' filename # 统计文件中的行数,awk读取每一行会将NR更新为对应行号,读到最后一行则是文件行数 -```sh -awk '{ print $2,$3 }' filename # 打印每一行的第二和第三个字段 -awk 'END{ print NR }' filename # 统计文件中的行数 -# 以上命令只使用了END语句块,在读入每一行的时,awk会将NR更新为对应的行号,当到达最后一行NR的值就是最后一行的行号,所以END语句块中的NR就是文件的行数。 +# file文件每一行中第一个字段值累加的例子 +seq 5 | awk 'BEGIN{ sum=0; print "总和:" } { print $1"+"; sum+=$1 } END{ print "等于"; print sum }' file -seq 5 | awk 'BEGIN{ sum=0; print "总和:" } { print $1"+"; sum+=$1 } END{ print "等于"; print sum }' # 一个每一行中第一个字段值累加的例子 +for i in $(pip list -o | awk 'NR > 2 {print $1}'); do sudo pip install -U $i; done # 批量升级所有过时的pip包 ``` -## 将外部变量值传递给awk - -```sh -# 借助-v选项,可以将外部值(并非来自stdin)传递给awk -VAR=10000 -echo | awk -v VARIABLE=$VAR '{ print VARIABLE }' - -# 另一种传递外部变量方法 -var1="aaa" -var2="bbb" -echo | awk '{ print v1,v2 }' v1=$var1 v2=$var2 +### 将外部变量值传递给awk +```bash +VAR=10000; echo | awk -v VARIABLE=$VAR '{ print VARIABLE }' # 借助-v选项,可以将外部值(并非来自stdin)传递给awk +var1="aaa"; var2="bbb"; echo | awk '{ print v1,v2 }' v1=$var1 v2=$var2 # 另一种传递外部变量方法 awk '{ print v1,v2 }' v1=$var1 v2=$var2 filename # 当输入来自于文件时使用 -# 以上方法中,变量之间用空格分隔作为awk的命令行参数跟随在BEGIN、{}和END语句块之后。 - netstat -antup | grep 7770 | awk '{ print $NF NR}' | awk '{ print $1}' # 查找进程pid ``` -## awk运算与判断 +### awk运算与判断 -作为一种程序设计语言所应具有的特点之一,awk支持多种运算,这些运算与C语言提供的基本相同。awk还提供了一系列内置的运算函数(如log、sqr、cos、sin等)和一些用于对字符串进行操作(运算)的函数(如length、substr等等)。这些函数的引用大大的提高了awk的运算功能。作为对条件转移指令的一部分,关系判断是每种程序设计语言都具备的功能,awk也不例外,awk中允许进行多种测试,作为样式匹配,还提供了模式匹配表达式~(匹配)和~!(不匹配)。作为对测试的一种扩充,awk也支持用逻辑运算符。 +作为一种程序设计语言所应具有的特点之一,awk支持多种运算,这些运算与C语言提供的基本相同。awk还提供了一系列内置的运算 +函数(如log、sqr、cos、sin等)和一些用于对字符串进行操作(运算)的函数(如length、substr等等)。这些函数的引用大大 +的提高了awk的运算功能。作为对条件转移指令的一部分,关系判断是每种程序设计语言都具备的功能,awk也不例外,awk中允许进 +行多种测试,作为样式匹配,还提供了模式匹配表达式~(匹配)和~!(不匹配)。作为对测试的一种扩充,awk也支持用逻辑运算符 -## 算术运算符 +#### 算术运算符 | 运算符 | 描述 | -| ----- | ---- | +| :-----: | :----: | | + - | 加,减 | | * / & | 乘,除与求余 | | + - ! | 一元加,减和逻辑非 | | ^** * | 求幂 | | ++ -- | 增加或减少,作为前缀或后缀 | -```sh -awk 'BEGIN{a="b";print a++,++a;}' -0 2 -# 注意:所有用作算术运算符进行操作,操作数自动转为数值,所有非数值都变为0 +```bash +awk 'BEGIN{a="b";print a++,++a;}' # 输出:0 2 +# 注意:所有字符用作算术运算符进行操作,操作数自动转为数值,所有非数值都变为0 ``` -## 赋值运算符 +#### 赋值运算符 | 运算符 | 描述 | -| ----- | ---- | +| :-----: | :----: | | = += -= *= /= %= ^=** = | 赋值语句 | -```sh -a+=5; 等价于:a=a+5; 其它同类 -``` - -## 逻辑运算符 +#### 逻辑运算符 -| 运算符 | 描述 | -| ----- | ---- | -| `\|\|` | 逻辑或 | -| && | 逻辑与 | +```bash +: << comment +运算符 描述 + || 逻辑或 + && 逻辑与 +comment -```sh -awk 'BEGIN{a=1;b=2;print (a>5 && b<=2),(a>5 || b<=2);}' -0 1 +awk 'BEGIN{a=1;b=2;print (a>5 && b<=2),(a>5 || b<=2);}' # 输出:0 1 ``` -## 正则运算符 +#### 正则运算符 | 运算符 | 描述 | | ----- | ---- | -| ~ ~! | 匹配正则表达式和不匹配正则表达式 | +| ~ | 匹配正则表达式 | +| ~! | 不匹配正则表达式 | -```sh -awk 'BEGIN{a="100testa";if(a ~ /^100*/){print "ok";}}' -ok +```bash +awk 'BEGIN{a="100testa";if(a ~ /^100*/){print "ok";}}' # 输出:ok ``` -## 关系运算符 +#### 关系运算符 | 运算符 | 描述 | | ----- | ---- | | < <= > >= != == | 关系运算符 | -```sh -awk 'BEGIN{a=11;if(a >= 9){print "ok";}}' -ok -# 注意:> < 可以作为字符串比较,也可以用作数值比较,关键看操作数如果是字符串就会转换为字符串比较。两个都为数字才转为数值比较。字符串比较:按照ASCII码顺序比较。 +```bash +awk 'BEGIN{a=11;if(a >= 9){print "ok";}}' # 输出:ok +# 注意:> < 可以作为字符串比较,也可用作数值比较,关键看操作数 +# 如果是字符串就会转换为字符串比较。两个都为数字才转为数值比较。字符串比较:按照ASCII码顺序比较 ``` -## 其它运算符 +#### 其它运算符 | 运算符 | 描述 | | ----- | ---- | @@ -309,155 +267,114 @@ ok | ?: | C条件表达式 | | in | 数组中是否存在某键值 | -```sh +```bash awk 'BEGIN{a="b";print a=="b"?"ok":"err";}' # 输出:ok - 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语句一般用于多行合并: - -```sh -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”行进行跳过,然后需要将内容与下面行合并为一行: +## awk高级输入输出 -```sh -cat text.txt -web01[192.168.2.100] -httpdok -tomcat ok -sendmail ok -web02[192.168.2.101] -httpdok -postfix ok -web03[192.168.2.102] -mysqldok -httpd ok -0 -awk '/^web/{T=$0;next;}{print T":t"$0;}' test.txt -web01[192.168.2.100]: httpdok -web01[192.168.2.100]: tomcat ok -web01[192.168.2.100]: sendmail ok -web02[192.168.2.101]: httpdok -web02[192.168.2.101]: postfix ok -web03[192.168.2.102]: mysqldok -web03[192.168.2.102]: httpd ok -``` +```bash +# awk中next语句:在循环中逐行匹配遇到next,就会跳过当前行,直接忽略下面语句。而进行下一行匹配。next语句一般用于多行合并 +# 打印student.txt偶数行,并打印出对应的行号。解析:当记录行号除以2余1,就跳过当前行。print NR,$0也不会执行。 +awk 'NR%2==1{next}{print NR,$0;}' student.txt -## 简单地读取一条记录 +# 匹配并跳过file文件以web行开头的行,然后将匹配到的行作为下面每行的开始并与下面每行合并为一行 +awk '/^web/{T=$0;next;}{print T"\t"$0;}' file -`awk getline`用法:输出重定向需用到`getline函数`。getline从标准输入、管道或者当前正在处理的文件之外的其他输入文件获得输入。它负责从输入获得下一行的内容,并给NF,NR和FNR等内建变量赋值。如果得到一条记录,getline函数返回1,如果到达文件的末尾就返回0,如果出现错误,例如打开文件失败,就返回-1。 +# 简单地读取一条记录 +: << comment +awk getline用法:输出重定向需用到getline函数。getline从标准输入、管道或者当前正在处理的文件之外的其他输入文件获得输入。 +它负责从输入获得下一行的内容,并给NF,NR和FNR等内建变量赋值。如果得到一条记录,getline函数返回1,如果到达文件的末尾就 +返回0,如果出现错误,例如打开文件失败,就返回-1 getline语法:getline var,变量var包含了特定行的内容。 awk getline从整体上来说,用法说明: +当其左右无重定向符 | 或 < 时:getline作用于当前文件,读入当前文件的第一行给其后跟的变量var或$0(无变量), +应该注意到,由于awk在处理getline之前已经读入了一行,所以getline得到的返回结果是隔行的 -***当其左右无重定向符`|`或`<`时:** getline作用于当前文件,读入当前文件的第一行给其后跟的变量`var`或`$0`(无变量),应该注意到,由于awk在处理getline之前已经读入了一行,所以getline得到的返回结果是隔行的。 -***当其左右有重定向符`|`或`<`时:** getline则作用于定向输入文件,由于该文件是刚打开,并没有被awk读入一行,只是getline读入,那么getline返回的是该文件的第一行,而不是隔行。 - -** 示例:** - -执行linux的`date`命令,并通过管道输出给`getline`,然后再把输出赋值给自定义变量out,并打印它: - -```sh -awk 'BEGIN{ "date" | getline out; print out }' test -``` - -执行shell的date命令,并通过管道输出给getline,然后getline从管道中读取并将输入赋值给out,split函数把变量out转化成数组mon,然后打印数组mon的第二个元素: - -```sh -awk 'BEGIN{ "date" | getline out; split(out,mon); print mon[2] }' test -``` - -命令ls的输出传递给geline作为输入,循环使getline从ls的输出中读取一行,并把它打印到屏幕。这里没有输入文件,因为BEGIN块在打开输入文件前执行,所以可以忽略输入文件。 - -```sh -awk 'BEGIN{ while( "ls" | getline) print }' -``` - -## 关闭文件 - -awk中允许在程序中关闭一个输入或输出文件,方法是使用awk的close语句。 +当其左右有重定向符 | 或 < 时:getline则作用于定向输入文件,由于该文件是刚打开,并没有被awk读入一行, +只是getline读入,那么getline返回的是该文件的第一行,而不是隔行 +comment -```sh -close("filename") -``` +awk 'BEGIN{ "date" | getline out; print out }' # 执行date并通过管道输出给getline,再把输出赋给自定义变量out -filename可以是getline打开的文件,也可以是stdin,包含文件名的变量或者getline使用的确切命令。或一个输出文件,可以是stdout,包含文件名的变量或使用管道的确切命令。 +# 执行date并通过管道输出给getline,getline将输入赋值给out,split函数把变量out转为数组mon,再打印mon第二个元素 +awk 'BEGIN{ "date" | getline out; split(out,mon); print mon[2] }' -## 输出到一个文件 +# ls -l输出传递给geline,循环使getline读取每一行并只打印对应权限。因为BEGIN块在打开输入文件前执行,所以可以忽略输入文件 +awk 'BEGIN{ while( "ls -l" | getline) print $1}' -awk中允许用如下方式将结果输出到一个文件: +echo | awk '{printf("hello word!n") > "datafile"}' # awk中允许用如下方式将结果输出到一个文件 -```sh -echo | awk '{printf("hello word!n") > "datafile"}' -或 -echo | awk '{printf("hello word!n") >> "datafile"}' ``` -## 设置字段定界符 - -默认的字段定界符是空格,可以使用`-F "定界符"`明确指定一个定界符: - -```sh -awk -F: '{ print $NF }' /etc/passwd -或 -awk 'BEGIN{ FS=":" } { print $NF }' /etc/passwd +```bash +# 关闭文件 +# awk中允许在程序中关闭一个输入或输出文件,方法是使用awk的close语句 +# file可以是getline打开的文件,也可以是stdin,包含文件名的变量或者getline使用的确切命令。或一个输出文件, +# 可以是stdout,包含文件名的变量或使用管道的确切命令,例如 + +echo "21 2 +3 52 +17 23" | awk '{ +first[NR]=$1 +second[NR]=$2 +}END{ +print "======打印第1列并排序:===========" > "test.txt" +close("test.txt") +for(i in first) + print first[i] |"sort -n >> test.txt" +close("sort -n >> test.txt") + +print "======打印第2列并排序:===========" >> "test.txt" +close("test.txt") +for(i in second) + print second[i] |"sort -n >> test.txt" +} +close("sort -n >> test.txt") +' +: << comment +# 以上命令输出为,任何一个close都不能去掉,因为awk管道使用时,若不关闭将会被一致使用。 +======打印第1列并排序:=========== +3 +17 +21 +======打印第2列并排序:=========== +2 +23 +52 +comment + +: << comment +# close去掉后输出 +======打印第1列并排序:=========== +======打印第2列并排序:=========== +2 +3 +17 +21 +23 +52 +comment ``` -在`BEGIN语句块`中则可以用`OFS=“定界符”`设置输出字段的定界符。 - ## 流程控制语句 -在linux awk的while、do-while和for语句中允许使用break,continue语句来控制流程走向,也允许使用exit这样的语句来退出。break中断当前正在执行的循环并跳到循环外执行下一条语句。if 是流程选择用法。awk中,流程控制语句,语法结构,与c语言类型。有了这些语句,其实很多shell程序都可以交给awk,而且性能是非常快的。下面是各个语句用法。 - -## 条件判断语句 - -```sh -if(表达式) -语句1 -else -语句2 -``` - -格式中语句1可以是多个语句,为了方便判断和阅读,最好将多个语句用{}括起来。awk分枝结构允许嵌套,其格式为: - -```sh -if(表达式) -{语句1} -else if(表达式) -{语句2} -else -{语句3} -``` - -示例: +```bash +# awk的while、do-while和for语句中允许使用break,continue语句来控制流程走向,也允许使用exit这样的语句来退出。 +# break中断当前正在执行的循环并跳到循环外执行下一条语句。if 是流程选择用法。awk中,流程控制语句,语法结构,与c语言类型。 +# 有了这些语句,其实很多shell程序都可以交给awk,而且性能是非常快的。下面是各个语句用法 -```sh +# if条件判断语句,示例判断数字大小进行对应的输出,输出:very good awk 'BEGIN{ test=100; if(test>90){ @@ -471,23 +388,7 @@ print "no pass"; } }' -very good -``` - -每条命令语句后面可以用`;`** 分号** 结尾。 - -## 循环语句 - -### while语句 - -```sh -while(表达式) -{语句} -``` - -示例: - -```sh +# while循环语句,示例:求1到100和,输出:5050 awk 'BEGIN{ test=100; total=0; @@ -497,51 +398,16 @@ i++; } print total; }' -5050 -``` - -### for循环 - -for循环有两种格式: - -格式1: - -```sh -for(变量 in 数组) -{语句} -``` - -示例: -```sh +# for循环语句,for循环有两种格式: +# 格式1示例:以行的形式打印每个环境变量及其对应值。注:ENVIRON是awk常量,是子典型数组 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: - -```sh -for(变量;条件;表达式) -{语句} -``` -示例: - -```sh +# 格式2示例:同样以求1到100和 awk 'BEGIN{ total=0; for(i=0;i<=100;i++){ @@ -549,219 +415,116 @@ total+=i; } print total; }' -5050 -``` - -### do循环 -```sh -do -{语句} while(条件) -``` +# do循环语句,示例:求1到100和 +awk 'BEGIN{ total=0; i=0; do {total+=i;i++;} while(i<=100); print total }' -例子: - -```sh -awk 'BEGIN{ -total=0; -i=0; -do {total+=i;i++;} while(i<=100) -print total; -}' -5050 +: << comment +# 其他语句 +break 当break 语句用于 while 或 for 语句时,导致退出程序循环 +continue 当continue 语句用于 while 或 for 语句时,使程序循环移动到下一个迭代 +next 能能够导致读入下一个输入行,并返回到脚本的顶部。这可以避免对当前输入行执行其他的操作过程 +exit 语句使主输入循环退出并将控制转移到END,若END存在。若没有定义END规则,或在END中应用exit语句,则终止脚本执行 +comment ``` -## 其他语句 - -***break**当 break 语句用于 while 或 for 语句时,导致退出程序循环。 -***continue**当 continue 语句用于 while 或 for 语句时,使程序循环移动到下一个迭代。 -***next**能能够导致读入下一个输入行,并返回到脚本的顶部。这可以避免对当前输入行执行其他的操作过程。 -***exit**语句使主输入循环退出并将控制转移到END,如果END存在的话。如果没有定义END规则,或在END中应用exit语句,则终止脚本的执行。 - ## 数组应用 -数组是awk的灵魂,处理文本中最不能少的就是它的数组处理。因为数组索引(下标)可以是数字和字符串在awk中数组叫做关联数组(associative arrays)。awk 中的数组不必提前声明,也不必声明大小。数组元素用0或空字符串来初始化,这根据上下文而定。 - -## 数组的定义 - -数字做数组索引(下标): +数组是awk的灵魂,处理文本中最不能少的就是它的数组处理。因为数组索引(下标)可以是数字和字符串在awk中数组叫做关联数组 +(associative arrays)。awk 中的数组不必提前声明,也不必声明大小。数组元素用0或空字符串来初始化,这根据上下文而定 -```sh +```bash +# 数组的定义,数字做数组索引(下标): Array[1]="sun" Array[2]="kai" -``` - -字符串做数组索引(下标): -```sh +# 字符串做数组索引(下标):使用print Array[1]会打印出sun;使用print Array[2]会打印出kai;使用print["birth"]会得到1987 Array["first"]="www" Array"[last"]="name" Array["birth"]="1987" -``` - -使用中`print Array[1]`会打印出sun;使用`print Array[2]`会打印出kai;使用`print["birth"]`会得到1987。 - -** 读取数组的值** -```sh -{ for(item in array) {print array[item]}; } #输出的顺序是随机的 -{ for(i=1;i<=len;i++) {print array[i]}; } #Len是数组的长度 -``` - -## 数组相关函数 - -** 得到数组长度:** - -```sh -awk 'BEGIN{info="it is a test";lens=split(info,tA," ");print length(tA),lens;}' -4 4 -``` - -length返回字符串以及数组长度,split进行分割字符串为数组,也会返回分割得到数组长度。 - -```sh -awk 'BEGIN{info="it is a test";split(info,tA," ");print asort(tA);}' -4 +# 读取数组的值,格式示例如下: +{ for(item in array) {print array[item]}; } # 输出的顺序是随机的 +{ for(i=1;i<=len;i++) {print array[i]}; } # Len是数组的长度 ``` -asort对数组进行排序,返回数组长度。 +### 数组相关函数 -** 输出数组内容(无序,有序输出):** +```bash +# length返回字符串以及数组长度,split进行分割字符串为数组,也会返回分割得到数组长度,asort对数组进行排序,返回数组长度 +awk 'BEGIN{info="it is a test";split(info,tA," ");print asort(tA);}' # 输出:4 -```sh -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 -``` +awk 'BEGIN{info="it is a test";lens=split(info,tA," ");print length(tA),lens;}' # 得到数组长度,输出:4 4 -`for…in`输出,因为数组是关联数组,默认是无序的。所以通过`for…in`得到是无序的数组。如果需要得到有序数组,需要通过下标获得。 +awk 'BEGIN{info="it is a test";split(info,tA," ");for(k in tA){print k,tA[k];}}' # 输出数组内容(无序,有序输出) -```sh +# for ... in 输出,因为数组是关联数组,默认是无序的。固通过`for…in`得到是无序数组。如果需得到有序数组,需要通过下标获得 +# 注意:数组下标是从1开始,与C数组不一样 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数组不一样。 -** 判断键值存在以及删除键值:** +# 判断键值存在以及删除键值,以下为错误的判断方法 +# tB[“c”]没有定义,但循环时已存在该键值且值为空,注意:awk数组是关联数组,只要通过数组引用它的key就会自动创建改序列 +awk 'BEGIN{tB["a"]="a1";tB["b"]="b1";if(tB["c"]!="1"){print "no found";};for(k in tB){print k,tB[k];}}' # 错误判断方法 +awk 'BEGIN{tB["a"]="a1";tB["b"]="b1";if( "c" in tB){print "ok";};for(k in tB){print k,tB[k];}}' # 正确判断方法 -```sh -#错误的判断方法: -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,就会自动创建改序列。 - -```bash -#正确判断方法: -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`键值 +awk 'BEGIN{tB["a"]="a1";tB["b"]="b1";delete tB["a"];for(k in tB){print k,tB[k];}}' # 删除键值 -`if(key in array)`通过这种方法判断数组中是否包含`key`键值。 - -```bash -#删除键值: -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`的,序列值 ``` -`delete array[key]`可以删除,对应数组`key`的,序列值。 +### 二维、多维数组使用 -## 二维、多维数组使用 +awk的多维数组在本质上是一维数组,更确切一点,awk在存储上并不支持多维数组。awk提供了逻辑上模拟二维数组的访问方式。 +例如,`array[2,4]=1`这样的访问是允许的。awk使用一个特殊的字符串`SUBSEP(34)`作为分割字段,在上面的例子中,关联数组 +array存储的键值实际上是2344(此处存疑,暂未实际验证) -awk的多维数组在本质上是一维数组,更确切一点,awk在存储上并不支持多维数组。awk提供了逻辑上模拟二维数组的访问方式。例如,`array[2,4]=1`这样的访问是允许的。awk使用一个特殊的字符串`SUBSEP(�34)`作为分割字段,在上面的例子中,关联数组array存储的键值实际上是2�344。 - -类似一维数组的成员测试,多维数组可以使用`if ( (i,j) in array)`这样的语法,但是下标必须放置在圆括号中。类似一维数组的循环访问,多维数组使用`for ( item in array )`这样的语法遍历数组。与一维数组不同的是,多维数组必须使用`split()`函数来访问单独的下标分量。 +类似一维数组的成员测试,多维数组可以使用`if ( (i,j) in array)`这样的语法,但是下标必须放置在圆括号中。类似一维数组 +的循环访问,多维数组使用`for ( item in array )`这样的语法遍历数组。与一维数组不同的是,多维数组必须使用`split()`函数 +来访问单独的下标分量 ```bash +# 打印99乘法表 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]`引用获得数组内容。 +tarr[i,j]=i*j; print i,"*",j,"=",tarr[i,j];}}}' -另一种方法: - -```bash +# 可以通过array[k,k2]引用获得数组内容,另一种方法: awk 'BEGIN{ for(i=1;i<=9;i++){ for(j=1;j<=9;j++){ -tarr[i,j]=i*j; -} -} +tarr[i,j]=i*j;}} for(m in tarr){ -split(m,tarr2,SUBSEP); print tarr2[1],"*",tarr2[2],"=",tarr[m]; -} -}' +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 参数则使用某天的时间。返回先前的种子值。 | - -举例说明: - -```sh -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 - -``` +| 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 参数则使用某天的时间返回先前的种子值 | -OFMT 设置输出数据格式是保留3位小数。 - -获得随机数: +```bash +# 示例:OFMT 设置输出数据格式是保留3位小数 +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 -```sh -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 +awk 'BEGIN{srand();fr=int(100*rand());print fr;}' # 获得随机数 ``` -## 字符串函数 +### 字符串函数 | 格式 | 描述 | | ---- | ---- | @@ -777,60 +540,29 @@ awk 'BEGIN{srand();fr=int(100*rand());print fr;}' | toupper( String ) | 返回 String 参数指定的字符串,字符串中每个小写字符将更改为大写。大写和小写的映射由当前语言环境的 LC_CTYPE 范畴定义。 | | sprintf(Format, Expr, Expr, . . . ) | 根据 Format 参数指定的 printf 子例程格式字符串来格式化 Expr 参数指定的表达式并返回最后生成的字符串。 | -注:Ere都可以是正则表达式。 - -** gsub,sub使用** - -```sh -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使用)** +```bash +# 注:Ere都可以是正则表达式。gsub,sub使用 +# 在 info中查找满足正则表达式,`/[0-9]+/` 用`””`替换,并且替换后的值,赋值给info 未给info值,默认是`$0` +awk 'BEGIN{info="this is a test2010test!";gsub(/[0-9]+/,"!",info);print info}' # 输出:this is a test!test! -```sh +# 查找字符串(index使用),找到返回ok,未找到,返回0 awk 'BEGIN{info="this is a test2010test!";print index(info,"test")?"ok":"no found";}' -ok -``` - -未找到,返回0 -** 正则表达式匹配查找(match使用)** - -```sh +# 正则表达式匹配查找(match使用) awk 'BEGIN{info="this is a test2010test!";print match(info,/[0-9]+/)?"ok":"no found";}' -ok -``` - -** 截取字符串(substr使用)** - -```sh -[wangsl@centos5 ~]$ awk 'BEGIN{info="this is a test2010test!";print substr(info,4,10);}' -s is a tes -``` - -从第 4个 字符开始,截取10个长度字符串 -** 字符串分割(split使用)** +# 截取字符串(substr使用)。从第 4个 字符开始,截取10个长度字符串 +awk 'BEGIN{info="this is a test2010test!";print substr(info,4,10);}' # 输出:s is a tes -```sh +# 字符串分割(split使用) +# 分割info,动态创建数组tA,awk for … in循环是一个无序的循环。并不是从数组下标1到n ,因此使用时候需要注意 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使用)** +### 格式化字符串输出(sprintf使用) -格式化字符串格式: - -其中格式化字符串包括两部分内容:一部分是正常字符,这些字符将按原样输出; 另一部分是格式化规定字符,以`"%"`开始,后跟一个或几个规定字符,用来确定输出内容格式。 +格式化字符串格式:其中格式化字符串包括两部分内容:一部分是正常字符,这些字符将按原样输出; 另一部分是格式化规定字符, +以`"%"`开始,后跟一个或几个规定字符,用来确定输出内容格式 | 格式 | 描述 | 格式 | 描述 | | ---- | ---- | ---- | ---- | @@ -840,58 +572,35 @@ awk 'BEGIN{info="this is a test";split(info,tA," ");print length(tA);for(k in tA | %e | 指数形式的浮点数 | %x | %X 无符号以十六进制表示的整数 | | %o | 无符号以八进制表示的整数 | %g | 自动选择合适的表示法 | -```sh +```bash 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 +# 输出: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用法)** +| 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 特殊变量 | -```sh +```bash +# 打开外部文件(close用法) 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使用方法)** -```sh +# 逐行读取外部文件(getline使用方法) 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 -``` -```sh awk 'BEGIN{print "Enter your name:";getline name;print name;}' -Enter your name: -chengmo -chengmo -``` -** 调用外部应用程序(system使用方法)** - -```sh -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 .. +# 调用外部应用程序(system使用方法) +awk 'BEGIN{b=system("ls -al");print b;}' # b返回值,是执行结果 ``` -b返回值,是执行结果。 - -## 时间函数 +### 时间函数 | 格式 | 描述| | ---- | ---- | @@ -900,26 +609,16 @@ b返回值,是执行结果。 | strftime([format [, timestamp]]) | 格式化时间输出,将时间戳转为时间字符串具体格式,见下表。 | | systime() | 得到时间戳,返回从1970年1月1日开始到当前时间(不计闰年)的整秒数 | -** 建指定时间(mktime使用)** - -```sh +```bash +# 指定时间(mktime使用) awk 'BEGIN{tstamp=mktime("2001 01 01 12 12 12");print strftime("%c",tstamp);}' -2001年01月01日 星期一 12时12分12秒 -``` - -```sh awk 'BEGIN{tstamp1=mktime("2001 01 01 12 12 12");tstamp2=mktime("2001 02 01 0 0 0");print tstamp2-tstamp1;}' -2634468 -``` -求2个时间段中间时间差,介绍了strftime使用方法 - -```sh +# 求2个时间段中间时间差,介绍了strftime使用方法 awk 'BEGIN{tstamp1=mktime("2001 01 01 12 12 12");tstamp2=systime();print tstamp2-tstamp1;}' -308201392 ``` -** strftime日期和时间格式说明符** +strftime日期和时间格式说明符 | 格式 | 描述| | ---- | ---- | @@ -949,101 +648,92 @@ awk 'BEGIN{tstamp1=mktime("2001 01 01 12 12 12");tstamp2=systime();print tstamp2 ## 文件间隔 -```sh -#双空间文件 +```bash +# 双空间文件 awk'1; {print“”}' awk'BEGIN {ORS =“\ n \ n”}; 1' -#双空间的文件已经有空行。输出文件 -#在文本行之间应该包含不超过一个空白行。 -#注意:在Unix系统上,只有CRLF(\ r \ n)的DOS行是 -#经常被视为非空白,因此仅'NF'将返回TRUE。 +# 双空间的文件已经有空行。输出文件,在文本行之间应该包含不超过一个空白行。 +# 注意:在Unix系统上,只有CRLF(\ r \ n)的DOS行是经常被视为非空白,因此仅'NF'将返回TRUE awk'NF {print $ 0“\ n”}' -#三重空间文件 +# 三重空间文件 awk'1; {print“\ n”}' ``` -## 编号和计算: +## 编号和计算 -#在每行的前面加上行号为该文件(左对齐)。 -#使用选项卡(\ t)而不是空格将保留页边距。 -awk'{print FNR'\ t“$ 0}'文件* - -#在每行的前面加上行号FOR ALL FILES TOGETHER,并带有制表符。 -awk'{print NR'\ t“$ 0}'文件* +```bash -#编号文件的每一行(左边的数字,右对齐) -#如果从DOS命令提示符处键入,则将符号加倍。 -awk'{printf(“%5d:%s \ n”,NR,$ 0)}' +# 在每行的前面加上行号为该文件(左对齐),使用\t而不是空格将保留页边距 +awk'{print FNR "\t" $0}'文件 -#为文件的每一行编号,但如果行不是空白,则只打印数字 -#记住关于\ r的Unix处理的注意事项(如上所述) -awk'NF {$ 0 = ++ a“:”$ 0}; 1' -awk'{print(NF?++ a“:”:“”)$ 0}' +# 在每行的前面加上行号FOR ALL FILES TOGETHER,并带有制表符 +awk'{print NR \t $0}'文件 -#计数行(模拟“wc -l”) -awk'END {print NR}' +# 编号文件的每一行(左边的数字,右对齐),如果从DOS命令提示符处键入,则将符号加倍 +awk '{printf("%5d:%s \ n",NR,$0)}' -#打印每行的字段总和 -awk'{s = 0; 对于(i = 1; i <= NF; i ++)s = s + $ i; 打印s}' +# 为文件的每一行编号,但如果行不是空白,则只打印数字。记住关于\ r的Unix处理的注意事项(如上所述) +awk 'NF { $0=++a ":" $0}; 1' +awk '{ print(NF?++a ":") $0}' -#添加所有行中的所有字段并打印总和 -awk'{for(i = 1; i <= NF; i ++)s = s + $ i}; END {print s}' +awk'END {print NR}' # 计数行(模拟“wc -l”) +awk '{s = 0; for(i = 1; i <= NF; i ++)s = s + $ i; print s}' # 打印每行的字段总和 +awk'{for(i = 1; i <= NF; i ++)s = s + $ i}; END {print s}' # 添加所有行中的所有字段并打印总和 -#在用绝对值替换每个字段后,每行打印一行 +#在用绝对值替换每个字段后,每行打印一行 awk'{for(i = 1; i <= NF; i ++)if($ i <0)$ i =-$ i; 打印}' awk'{for(i = 1; i <= NF; i ++)$ i =($ i <0)? -$ i:$ i; 打印}' -#在所有行中打印字段总数(“字数”) +#在所有行中打印字段总数(“字数”) awk'{total = total + NF}; END {打印总计}'文件 -#打印包含“Beth”的总行数 +#打印包含“Beth”的总行数 awk'/ Beth / {n ++}; END {print n + 0}'文件 -#打印最大的第一个字段和包含它的行 -#旨在查找字段#1中最长的字符串 +#打印最大的第一个字段和包含它的行 +#旨在查找字段#1中最长的字符串 awk'$ 1> max {max = $ 1; MAXLINE = $ 0}; END {print max,maxline}' -#打印每行中的字段数,然后是行 +#打印每行中的字段数,然后是行 awk'{print NF':“$ 0}' -#打印每行的最后一个字段 +#打印每行的最后一个字段 awk'{print $ NF}' -#打印最后一行的最后一个字段 +#打印最后一行的最后一个字段 awk'{field = $ NF}; END {打印字段}' -#打印每行超过4个字段 +#打印每行超过4个字段 awk'NF> 4' -#打印最后一个字段值大于4的每一行 +#打印最后一个字段值大于4的每一行 awk'$ NF> 4' 创建字符串: -#创建一个特定长度的字符串(例如,生成513个空格) +#创建一个特定长度的字符串(例如,生成513个空格) awk'BEGIN {while(a ++ <513)s = s“”; 打印s}' -#在特定字符位置插入特定长度的字符串 -#示例:在每个输入行的#6列之后插入49个空格。 +#在特定字符位置插入特定长度的字符串 +#示例:在每个输入行的#6列之后插入49个空格。 gawk --re-interval'BEGIN {while(a ++ <49)s = s“”}; {sub(/ ^。{6} /,“&”s)}; 1' - -```sh +``` ## 阵列创作 ```sh -#接下来的2个条目不是单行脚本,而是技术 -#非常方便,因此在这里值得一试。 +#接下来的2个条目不是单行脚本,而是技术 +#非常方便,因此在这里值得一试。 -#创建一个名为“月”的数组,索引数字,以便该月[1] -#是'Jan',月份[2]是'Feb',月份[3]是'Mar'等等。 +#创建一个名为“月”的数组,索引数字,以便该月[1] +#是'Jan',月份[2]是'Feb',月份[3]是'Mar'等等。 拆分(“1月2月3月4月5月6月7月8月9月10月11月12月”,月,“”) -#创建一个名为“mdigit”的数组,用字符串索引,这样 -#mdigit [“Jan”]是1,mdigit [“Feb”]是2等等。需要“月”数组 +#创建一个名为“mdigit”的数组,用字符串索引,这样 +#mdigit [“Jan”]是1,mdigit [“Feb”]是2等等。需要“月”数组 for(i = 1; i <= 12; i ++)mdigit [month [i]] = i ``` @@ -1052,80 +742,80 @@ for(i = 1; i <= 12; i ++)mdigit [month [i]] = i ```sh -#在UNIX环境中:将DOS换行符(CR / LF)转换为Unix格式 -awk'{sub(/ \ r $ /,“”)}; 1'#假设每行都以Ctrl-M结尾 +#在UNIX环境中:将DOS换行符(CR / LF)转换为Unix格式 +awk'{sub(/ \ r $ /,“”)}; 1'#假设每行都以Ctrl-M结尾 -#在UNIX环境中:将Unix换行符(LF)转换为DOS格式 +#在UNIX环境中:将Unix换行符(LF)转换为DOS格式 awk'{sub(/ $ /,“\ r”)}; 1' -#在DOS环境下:将Unix换行符(LF)转换为DOS格式 +#在DOS环境下:将Unix换行符(LF)转换为DOS格式 awk 1 -#在DOS环境下:将DOS换行符(CR / LF)转换为Unix格式 -#不能用DOS版本的awk完成,除了gawk: +#在DOS环境下:将DOS换行符(CR / LF)转换为Unix格式 +#不能用DOS版本的awk完成,除了gawk: gawk -v BINMODE =“w”'1'infile> outfile -#使用“tr”代替。 -tr -d \ r outfile#GNU tr版本1.22或更高 +#使用“tr”代替。 +tr -d \ r outfile#GNU tr版本1.22或更高 -#从每行前面删除前导空格(空格,制表符) -#左对齐所有文本 +#从每行前面删除前导空格(空格,制表符) +#左对齐所有文本 awk'{sub(/ ^ [\ t] + /,“”)}; 1' -#从每行末尾删除尾随空格(空格,制表符) +#从每行末尾删除尾随空格(空格,制表符) awk'{sub(/ [\ t] + $ /,“”)}; 1' -#删除每行的前导和尾随空白 +#删除每行的前导和尾随空白 awk'{gsub(/ ^ [\ t] + | [\ t] + $ /,“”)}; 1' -awk'{$ 1 = $ 1}; 1'#也会删除字段之间的额外空间 +awk'{$ 1 = $ 1}; 1'#也会删除字段之间的额外空间 -#在每行的开头插入5个空格(使页面偏移) +#在每行的开头插入5个空格(使页面偏移) awk'{sub(/ ^ /,“”)}; 1' -#将所有文本均匀对齐到79列宽度 +#将所有文本均匀对齐到79列宽度 awk'{printf'%79s \ n“,$ 0}'文件* -#将所有文字放在79个字符的宽度上 +#将所有文字放在79个字符的宽度上 awk'{l = length(); s = int((79-1)/ 2); printf“%”(s + l)“s \ n”,$ 0}'文件* -#在每行上用“bar”代替(查找并替换)“foo” -awk'{sub(/ foo /,“bar”)}; 1'#只替换第一个实例 -gawk'{$ 0 = gensub(/ foo /,“bar”,4)}; 1'#只替换第四个实例 -awk'{gsub(/ foo /,“bar”)}; 1'#将所有实例替换成一行 +#在每行上用“bar”代替(查找并替换)“foo” +awk'{sub(/ foo /,“bar”)}; 1'#只替换第一个实例 +gawk'{$ 0 = gensub(/ foo /,“bar”,4)}; 1'#只替换第四个实例 +awk'{gsub(/ foo /,“bar”)}; 1'#将所有实例替换成一行 -#将“foo”替换为“bar”,仅用于包含“baz” +#将“foo”替换为“bar”,仅用于包含“baz” awk'/ baz / {gsub(/ foo /,“bar”)}; 1' -#将“foo”替换为“bar”除了包含“baz”的行以外 +#将“foo”替换为“bar”除了包含“baz”的行以外 awk'!/ baz / {gsub(/ foo /,“bar”)}; 1' -#将“猩红”或“红宝石”或“puce”改为“红色” +#将“猩红”或“红宝石”或“puce”改为“红色” awk'{gsub(/ scarlet | ruby​​ | puce /,“red”)}; 1' -#行的反向顺序(模拟“tac”) +#行的反向顺序(模拟“tac”) awk'{a [i ++] = $ 0} END {for(j = i-1; j> = 0;)print a [j--]}'file * -#如果一行以反斜杠结尾,则将下一行追加到它(如果失败,则失败 -#有多行以反斜杠结尾......) +#如果一行以反斜杠结尾,则将下一行追加到它(如果失败,则失败 +#有多行以反斜杠结尾......) awk'/ \\ $ / {sub(/ \\ $ /,“”); getline t; 打印$ 0 t; 下一个}; 1'文件* -#打印并排序所有用户的登录名 +#打印并排序所有用户的登录名 awk -F“:”'{print $ 1 | “sort”}'/ etc / passwd -#按每行的相反顺序打印前两个字段 +#按每行的相反顺序打印前两个字段 awk'{print $ 2,$ 1}'文件 -#切换每行的前两个字段 +#切换每行的前两个字段 awk'{temp = $ 1; $ 1 = $ 2; $ 2 = temp}'文件 -#打印每一行,删除该行的第二个字段 +#打印每一行,删除该行的第二个字段 awk'{$ 2 =“”; 打印}' -#按相反顺序打印每行的字段 +#按相反顺序打印每行的字段 awk'{for(i = NF; i> 0; i--)printf(“%s”,$ i); print“”}'file -#使用逗号分隔符连接每5行输入 -#字段之间 +#使用逗号分隔符连接每5行输入 +#字段之间 awk'ORS = NR%5?“,”:“\ n”'文件 ``` @@ -1134,70 +824,70 @@ awk'ORS = NR%5?“,”:“\ n”'文件 ```sh -#打印前10行文件(模拟“head”的行为) +#打印前10行文件(模拟“head”的行为) awk'NR <11' -#打印文件的第一行(模拟“head -1”) +#打印文件的第一行(模拟“head -1”) awk'NR> 1 {exit}; 1' - #打印文件的最后两行(模拟“tail -2”) + #打印文件的最后两行(模拟“tail -2”) awk'{y = x“\ n”$ 0; x = $ 0}; END {print y}' -#打印文件的最后一行(模拟“tail -1”) +#打印文件的最后一行(模拟“tail -1”) awk'END {print}' -#只打印符合正则表达式的行(模拟“grep”) +#只打印符合正则表达式的行(模拟“grep”) awk'/ regex /' -#只打印与正则表达式不匹配的行(模拟“grep -v”) +#只打印与正则表达式不匹配的行(模拟“grep -v”) awk'!/ regex /' -#打印字段#5等于“abc123”的任何行 +#打印字段#5等于“abc123”的任何行 awk'$ 5 ==“abc123”' -#仅打印字段#5不等于“abc123”的行 -#这也将打印少于5个字段的行。 +#仅打印字段#5不等于“abc123”的行 +#这也将打印少于5个字段的行。 awk'$ 5!=“abc123”' awk'!($ 5 ==“abc123”)' -#将字段与正则表达式匹配 -awk'$ 7〜/ ^ [af] /'#print line if field#7 matches regex -awk'$ 7!〜/ ^ [af] /'#print line if field#7 does not match regex +#将字段与正则表达式匹配 +awk'$ 7〜/ ^ [af] /'#print line if field#7 matches regex +awk'$ 7!〜/ ^ [af] /'#print line if field#7 does not match regex -#在正则表达式之前立即打印行,但不是行 -#包含正则表达式 +#在正则表达式之前立即打印行,但不是行 +#包含正则表达式 awk'/ regex / {print x}; {x = $ 0}' awk'/ regex / {print(NR == 1?“match line 1:x)}; {x = $ 0}' -#在正则表达式之后立即打印行,但不是行 -#包含正则表达式 +#在正则表达式之后立即打印行,但不是行 +#包含正则表达式 awk'/ regex / {getline; print}' -#grep for AAA和BBB和CCC(在同一行上以任意顺序) +#grep for AAA和BBB和CCC(在同一行上以任意顺序) awk'/ AAA / && / BBB / && / CCC /' -#grep用于AAA和BBB和CCC(按此顺序) +#grep用于AAA和BBB和CCC(按此顺序) awk'/AAA.*BBB.*CCC/' -#只能打印65个字符或更长的行 +#只能打印65个字符或更长的行 awk'长度> 64' -#仅打印少于65个字符的行 +#仅打印少于65个字符的行 awk'长度<64' -#从正则表达式到文件结束的文件的打印部分 +#从正则表达式到文件结束的文件的打印部分 awk'/ regex /,0' awk'/ regex /,EOF' -#根据行号打印文件部分(第8-12行,含) +#根据行号打印文件部分(第8-12行,含) awk'NR == 8,NR == 12' -#打印行号52 +#打印行号52 awk'NR == 52' -awk'NR == 52 {print; exit}'#在大文件上效率更高 +awk'NR == 52 {print; exit}'#在大文件上效率更高 -#打印两个正则表达式之间的文件部分(含) -awk'/爱荷华州/,/蒙大拿州/'#区分大小写 +#打印两个正则表达式之间的文件部分(含) +awk'/爱荷华州/,/蒙大拿州/'#区分大小写 ``` diff --git a/Linux_man_cn/badblocks.md b/Linux_man_cn/badblocks.md index a3cfada..8e5c905 100644 --- a/Linux_man_cn/badblocks.md +++ b/Linux_man_cn/badblocks.md @@ -1,26 +1,100 @@ -badblocks -=== - -查找磁盘中损坏的区块 +# badblocks ## 说明 -**badblock命令** 用于查找磁盘中损坏的区块。 硬盘是一个损耗设备,当使用一段时间后可能会出现坏道等物理故障。电脑硬盘出现坏道后,如果不及时更换或进行技术处理,坏道就会越来越多,并会造成频繁死机和数据丢失。最好的处理方式是更换磁盘,但在临时的情况下,应及时屏蔽坏道部分的扇区,不要触动它们。badblocks就是一个很好的检查坏道位置的工具。 - -### 语法 +**badblock命令** 用于查找磁盘中损坏的区块。 硬盘是一个损耗设备,当使用一段时间后可能会出现坏道等物理故障。电脑硬盘 +出现坏道后,如果不及时更换或进行技术处理,坏道就会越来越多,并会造成频繁死机和数据丢失。最好的处理方式是更换磁盘,但 +在临时的情况下,应及时屏蔽坏道部分的扇区,不要触动它们。badblocks就是一个很好的检查坏道位置的工具 -``` -badblock(选项)(参数) -``` +## 选项 - - -``` +```markdown -b<区块大小>:指定磁盘的区块大小,单位为字节; -o<输出文件>:将检查的结果写入指定的输出文件; -s:在检查时显示进度; -v:执行时显示详细的信息; -w:在检查时,执行写入测试。 + +OPTIONS + -b block-size + Specify the size of blocks in bytes. The default is 1024. + + -c number of blocks + is the number of blocks which are tested at a time. The default is 64. + + -e max bad block count + Specify a maximum number of bad blocks before aborting the test. The default is 0, meaning the test will continue until the + end of the test range is reached. + + -d read delay factor + This parameter, if passed and non-zero, will cause bad blocks to sleep between reads if there were no errors encountered in the + read operation; the delay will be calculated as a percentage of the time it took for the read operation to be performed. In + other words, a value of 100 will cause each read to be delayed by the amount the previous read took, and a value of 200 by + twice the amount. + + -f Normally, badblocks will refuse to do a read/write or a non-destructive test on a device which is mounted, since either can + cause the system to potentially crash and/or damage the filesystem even if it is mounted read-only. This can be overridden + using the -f flag, but should almost never be used --- if you think you're smarter than the badblocks program, you almost cer‐ + tainly aren't. The only time when this option might be safe to use is if the /etc/mtab file is incorrect, and the device + really isn't mounted. + + -i input_file + -e max bad block count + Specify a maximum number of bad blocks before aborting the test. The default is 0, meaning the test will continue until the + end of the test range is reached. + + -d read delay factor + This parameter, if passed and non-zero, will cause bad blocks to sleep between reads if there were no errors encountered in the + read operation; the delay will be calculated as a percentage of the time it took for the read operation to be performed. In + other words, a value of 100 will cause each read to be delayed by the amount the previous read took, and a value of 200 by + twice the amount. + + -f Normally, badblocks will refuse to do a read/write or a non-destructive test on a device which is mounted, since either can + cause the system to potentially crash and/or damage the filesystem even if it is mounted read-only. This can be overridden + using the -f flag, but should almost never be used --- if you think you're smarter than the badblocks program, you almost cer‐ + tainly aren't. The only time when this option might be safe to use is if the /etc/mtab file is incorrect, and the device + really isn't mounted. + + -i input_file + Read a list of already existing known bad blocks. Badblocks will skip testing these blocks since they are known to be bad. If + input_file is specified as "-", the list will be read from the standard input. Blocks listed in this list will be omitted from + the list of new bad blocks produced on the standard output or in the output file. The -b option of dumpe2fs(8) can be used to + retrieve the list of blocks currently marked bad on an existing filesystem, in a format suitable for use with this option. + + -n Use non-destructive read-write mode. By default only a non-destructive read-only test is done. This option must not be com‐ + bined with the -w option, as they are mutually exclusive. + + -o output_file + Write the list of bad blocks to the specified file. Without this option, badblocks displays the list on its standard output. + The format of this file is suitable for use by the -l option in e2fsck(8) or mke2fs(8). + + -p num_passes + Repeat scanning the disk until there are no new blocks discovered in num_passes consecutive scans of the disk. Default is 0, + meaning badblocks will exit after the first pass. + + -s Show the progress of the scan by writing out rough percentage completion of the current badblocks pass over the disk. Note + that badblocks may do multiple test passes over the disk, in particular if the -p or -w option is requested by the user. + + -t test_pattern + Specify a test pattern to be read (and written) to disk blocks. The test_pattern may either be a numeric value between 0 and + ULONG_MAX-1 inclusive, or the word "random", which specifies that the block should be filled with a random bit pattern. For + read/write (-w) and non-destructive (-n) modes, one or more test patterns may be specified by specifying the -t option for each + test pattern desired. For read-only mode only a single pattern may be specified and it may not be "random". Read-only testing + with a pattern assumes that the specified pattern has previously been written to the disk - if not, large numbers of blocks + will fail verification. If multiple patterns are specified then all blocks will be tested with one pattern before proceeding + to the next pattern. + + -v Verbose mode. Will write the number of read errors, write errors and data- corruptions to stderr. + + -w Use write-mode test. With this option, badblocks scans for bad blocks by writing some patterns (0xaa, 0x55, 0xff, 0x00) on + every block of the device, reading every block and comparing the contents. This option may not be combined with the -n option, + as they are mutually exclusive. + + -B Use buffered I/O and do not use Direct I/O, even if it is available. + + -X Internal flag only to be used by e2fsck(8) and mke2fs(8). It bypasses the exclusive mode in-use device safety check. + + ``` ### 参数 diff --git a/Linux_man_cn/bc.md b/Linux_man_cn/bc.md index 7cf3c59..d32094c 100644 --- a/Linux_man_cn/bc.md +++ b/Linux_man_cn/bc.md @@ -22,6 +22,8 @@ echo "1.212*3" | bc # 算术操作高级运算bc命令它可以执行浮点运算和一些高级函数 echo "scale=2;3/8" | bc # 设定小数精度(数值范围)参数`scale=2`是将bc输出结果的小数位设置为2位 echo "obase=2;192" | bc # 进制转换,将数字192转换为2进制,注意:只能对数字进行进制转换,对应的进制有2,8,16,64 +echo "$((0x2dec))" # 十六进制转十进制 +echo "sqrt(1000/10) + 1" | bc -l # 计算平方和平方根 echo "10^10" | bc diff --git a/Linux_man_cn/cal.md b/Linux_man_cn/cal.md index 7542d3d..161254f 100644 --- a/Linux_man_cn/cal.md +++ b/Linux_man_cn/cal.md @@ -1,71 +1,27 @@ -cal -=== - -显示当前日历或指定日期的日历 +# cal ## 说明 -**cal命令** 用于显示当前日历,或者指定日期的日历。 +**cal命令** 用于显示当前日历,或者指定日期的日历 -### 语法 +## 选项 -``` -cal(选项)(参数) -``` +```markdown +cal [选项] [[[日] 月] 年] - +-1, --one 只显示当前月份(默认) +-3, --three 显示上个月、当月和下个月 +-s, --sunday 周日作为一周第一天 +-m, --monday 周一用为一周第一天 +-j, --julian 输出儒略日,即显示“julian”日期 +-y, --year 输出整年 -``` --l:显示单月输出; --3:显示临近三个月的日历; --s:将星期日作为月的第一天; --m:将星期一作为月的第一天; --j:显示“julian”日期; --y:显示当前年的日历。 ``` -### 参数 +## 实例 -``` -月:指定月份; -年:指定年份。 -``` - -### 实例 +```bash +cal -j +cal 9 1752 # 显示指定月,年的日历 -单独执行cal命令会打印出日历: - -``` -[root@localhost ~]# cal - 十二月 2013 -日 一 二 三 四 五 六 - 1 2 3 4 5 6 7 - 8 9 10 11 12 13 14 -15 16 17 18 19 20 21 -22 23 24 25 26 27 28 -29 30 31 ``` - -``` -[root@localhost ~]# cal -j - 十二月 2013 - 日 一 二 三 四 五 六 -335 336 337 338 339 340 341 -342 343 344 345 346 347 348 -349 350 351 352 353 354 355 -356 357 358 359 360 361 362 -363 364 365 -``` - -``` -[root@localhost ~]# cal -3 - 十一月 2013 十二月 2013 一月 2014 -日 一 二 三 四 五 六 日 一 二 三 四 五 六 日 一 二 三 四 五 六 - 1 2 1 2 3 4 5 6 7 1 2 3 4 - 3 4 5 6 7 8 9 8 9 10 11 12 13 14 5 6 7 8 9 10 11 -10 11 12 13 14 15 16 15 16 17 18 19 20 21 12 13 14 15 16 17 18 -17 18 19 20 21 22 23 22 23 24 25 26 27 28 19 20 21 22 23 24 25 -24 25 26 27 28 29 30 29 30 31 26 27 28 29 30 31 -``` - - diff --git a/Linux_man_cn/cat.md b/Linux_man_cn/cat.md index a99fe82..f756186 100644 --- a/Linux_man_cn/cat.md +++ b/Linux_man_cn/cat.md @@ -19,5 +19,11 @@ ## 实例 ```bash - +cat -n /etc/passwd | sed '2,5d' # 显示passwd内容,将2-5行删除后再显示 +cat -n /etc/passwd | sed '2a hello' # 在passwd文件第二行后加上hello语句 +cat -n /etc/passwd | sed '2a hello? \ zhangfneg ?' # 在passwd文件第二行后面加上两行字 +cat -n /etc/passwd | sed '3,37c我是好人' # 将2至5行内容替换成我是好人 +cat -n /etc/passwd | sed -n '5,7p' # 只显示5至7行 +cat /var/log/secure | sed -n '/12:12:50/,/12:13:50/p' # 分析secure日志 +cat /proc/partitions # 显示所在系统注册的分区 ``` \ No newline at end of file diff --git a/Linux_man_cn/crontab.md b/Linux_man_cn/crontab.md index 6fe4022..7112d0c 100644 --- a/Linux_man_cn/crontab.md +++ b/Linux_man_cn/crontab.md @@ -32,11 +32,12 @@ Default operation is replace, per 1003.2 Linux下的任务调度分为两类: **系统任务调度** 和 **用户任务调度** 。 - **系统任务调度:** 系统周期性所要执行的工作,比如写缓存数据到硬盘、日志清理等。在`/etc`目录下有一个crontab文件,这个就是系统任务调度的配置文件。 +**系统任务调度:** 系统周期性所要执行的工作,比如写缓存数据到硬盘、日志清理等。在`/etc`目录下有一个crontab文件,这个就是 +系统任务调度的配置文件 -`/etc/crontab`文件包括下面几行: +/etc/crontab文件包括下面几行: -``` +```markdown SHELL=/bin/bash PATH=/sbin:/bin:/usr/sbin:/usr/bin MAILTO=""HOME=/ @@ -48,160 +49,58 @@ MAILTO=""HOME=/ 42 4 1 * * root run-parts /etc/cron.monthly ``` -前四行是用来配置crond任务运行的环境变量,第一行SHELL变量指定了系统要使用哪个shell,这里是bash,第二行PATH变量指定了系统执行命令的路径,第三行MAILTO变量指定了crond的任务执行信息将通过电子邮件发送给root用户,如果MAILTO变量的值为空,则表示不发送任务执行信息给用户,第四行的HOME变量指定了在执行命令或者脚本时使用的主目录。 +前四行是用来配置crond任务运行的环境变量,第一行SHELL变量指定了系统要使用哪个shell,这里是bash,第二行PATH变量指定了系统 +执行命令的路径,第三行MAILTO变量指定了crond的任务执行信息将通过电子邮件发送给root用户,如果MAILTO变量的值为空,则表示不 +发送任务执行信息给用户,第四行的HOME变量指定了在执行命令或者脚本时使用的主目录 - **用户任务调度:** 用户定期要执行的工作,比如用户数据备份、定时邮件提醒等。用户可以使用 crontab 工具来定制自己的计划任务。所有用户定义的crontab文件都被保存在`/var/spool/cron`目录中。其文件名与用户名一致,使用者权限文件如下: +**用户任务调度:** 用户定期要执行的工作,比如用户数据备份、定时邮件提醒等。用户可以使用 crontab 工具来定制自己的计划任 +务。所有用户定义的crontab文件都被保存在`/var/spool/cron`目录中。其文件名与用户名一致,使用者权限文件如下: -``` +```markdown /etc/cron.deny 该文件中所列用户不允许使用crontab命令 /etc/cron.allow 该文件中所列用户允许使用crontab命令 /var/spool/cron/ 所有用户crontab文件存放的目录,以用户名命名 -``` - -crontab文件的含义:用户所建立的crontab文件中,每一行都代表一项任务,每行的每个字段代表一项设置,它的格式共分为六个字段,前五段是时间设定段,第六段是要执行的命令段,格式如下: -``` +crontab文件的含义:用户所建立的crontab文件中,每一行都代表一项任务,每行的每个字段代表一项设置,它的格式共分为六个字段, +前五段是时间设定段,第六段是要执行的命令段,格式如下: minute hour day month week command 顺序:分 时 日 月 周 ``` 其中: -* minute: 表示分钟,可以是从0到59之间的任何整数。 -* hour:表示小时,可以是从0到23之间的任何整数。 -* day:表示日期,可以是从1到31之间的任何整数。 -* month:表示月份,可以是从1到12之间的任何整数。 -* week:表示星期几,可以是从0到7之间的任何整数,这里的0或7代表星期日。 -* command:要执行的命令,可以是系统命令,也可以是自己编写的脚本文件。 +* minute: 表示分钟,可以是从0到59之间的任何整数 +* hour:表示小时,可以是从0到23之间的任何整数 +* day:表示日期,可以是从1到31之间的任何整数 +* month:表示月份,可以是从1到12之间的任何整数 +* week:表示星期几,可以是从0到7之间的任何整数,这里的0或7代表星期日 +* command:要执行的命令,可以是系统命令,也可以是自己编写的脚本文件 在以上各个字段中,还可以使用以下特殊字符: -* 星号(*):代表所有可能的值,例如month字段如果是星号,则表示在满足其它字段的制约条件后每月都执行该命令操作。 +* 星号(*):代表所有可能的值,例如month字段如果是星号,则表示在满足其它字段的制约条件后每月都执行该命令操作 * 逗号(,):可以用逗号隔开的值指定一个列表范围,例如,“1,2,5,7,8,9” * 中杠(-):可以用整数之间的中杠表示一个整数范围,例如“2-6”表示“2,3,4,5,6” -* 正斜线(/):可以用正斜线指定时间的间隔频率,例如“0-23/2”表示每两小时执行一次。同时正斜线可以和星号一起使用,例如*/10,如果用在minute字段,表示每十分钟执行一次。 - - **crond服务** - -``` -/sbin/service crond start //启动服务 -/sbin/service crond stop //关闭服务 -/sbin/service crond restart //重启服务 -/sbin/service crond reload //重新载入配置 -``` +* 正斜线(/):可以用正斜线指定时间的间隔频率,例如“0-23/2”表示每两小时执行一次。同时正斜线可以和星号一起使用,例如 + */10,如果用在minute字段,表示每十分钟执行一次 -查看crontab服务状态: - -``` -service crond status -``` - -手动启动crontab服务: - -``` -service crond start -``` - -查看crontab服务是否已设置为开机启动,执行命令: - -``` -ntsysv -``` - -加入开机自动启动: - -``` -chkconfig –level 35 crond on -``` - -### 实例 - -每1分钟执行一次command - -``` -* * * * * command -``` - -每小时的第3和第15分钟执行 - -``` -3,15 * * * * command -``` - -在上午8点到11点的第3和第15分钟执行 - -``` -3,15 8-11 * * * command -``` - -每隔两天的上午8点到11点的第3和第15分钟执行 - -``` -3,15 8-11 */2 * * command -``` +## 实例 -每个星期一的上午8点到11点的第3和第15分钟执行 - -``` -3,15 8-11 * * 1 command -``` - -每晚的21:30重启smb  - -``` -30 21 * * * /etc/init.d/smb restart -``` - -每月1、10、22日的4 : 45重启smb  - -``` -45 4 1,10,22 * * /etc/init.d/smb restart -``` - -每周六、周日的1:10重启smb - -``` -10 1 * * 6,0 /etc/init.d/smb restart -``` - -每天18 : 00至23 : 00之间每隔30分钟重启smb  - -``` -0,30 18-23 * * * /etc/init.d/smb restart -``` - -每星期六的晚上11:00 pm重启smb  - -``` -0 23 * * 6 /etc/init.d/smb restart -``` - -每一小时重启smb  - -``` -* */1 * * * /etc/init.d/smb restart -``` - -晚上11点到早上7点之间,每隔一小时重启smb - -``` -* 23-7/1 * * * /etc/init.d/smb restart -``` - -每月的4号与每周一到周三的11点重启smb  - -``` -0 11 4 * mon-wed /etc/init.d/smb restart -``` - -一月一号的4点重启smb - -``` -0 4 1 jan * /etc/init.d/smb restart -``` - -每小时执行`/etc/cron.hourly`目录内的脚本 +```markdown +* * * * * command # 每1分钟执行一次command +3,15 * * * * command # 每小时的第3和第15分钟执行 +3,15 8-11 * * * command # 在上午8点到11点的第3和第15分钟执行 +3,15 8-11 */2 * * command # 每隔两天的上午8点到11点的第3和第15分钟执行 +3,15 8-11 * * 1 command # 每个星期一的上午8点到11点的第3和第15分钟执行 +30 21 * * * /etc/init.d/smb restart # 每晚的21:30重启smb +45 4 1,10,22 * * /etc/init.d/smb restart # 每月1、10、22日的4:45重启smb  +10 1 * * 6,0 /etc/init.d/smb restart # 每周六、周日的1:10重启smb +0,30 18-23 * * * /etc/init.d/smb restart # 每天18:00至23:00之间每隔30分钟重启smb  +0 23 * * 6 /etc/init.d/smb restart # 每星期六的晚上11:00重启smb  +* */1 * * * /etc/init.d/smb restart # 每一小时重启一次smb +* 23-7/1 * * * /etc/init.d/smb restart # 晚上11点到早上7点之间,每隔一小时重启smb +0 11 4 * mon-wed /etc/init.d/smb restart # 每月的4号与每周一到周三的11点重启smb  +0 4 1 jan * /etc/init.d/smb restart # 一月一号的4点重启smb +01 * * * * root run-parts /etc/cron.hourly # 每小时执行`/etc/cron.hourly`目录内的脚本 ``` -01 * * * * root run-parts /etc/cron.hourly -``` diff --git a/Linux_man_cn/cut.md b/Linux_man_cn/cut.md index d306368..ae33e7a 100644 --- a/Linux_man_cn/cut.md +++ b/Linux_man_cn/cut.md @@ -42,6 +42,7 @@ Mandatory arguments to long options are mandatory for short options too. grep "model name" /proc/cpuinfo | uniq | cut -f2 -d : # 显示CPU信息;-f截取,-d以:字符分界 cut -f2 --complement test.txt # --complement选项提取指定字段之外的列(打印除了第二列之外的列) cut -f2 -d";" test2.txt # 使用-d选项指定字段分隔符 +pip3 list -o --format columns | cut -d ' ' -f1 | xargs -n1 pip install -U # 一次性升级所有pip包 ### 指定字段的字符或者字节范围 diff --git a/Linux_man_cn/date.md b/Linux_man_cn/date.md index 5642118..da2a720 100644 --- a/Linux_man_cn/date.md +++ b/Linux_man_cn/date.md @@ -100,17 +100,19 @@ date --date='TZ="America/Los_Angeles" 09:00 next Fri' ```bash date +"%Y-%m-%d" # 格式化输出并用-符号连接日期 - -# 输出昨天日期 -date -d "1 day ago" +"%Y-%m-%d" -date -d "yesterday" +"%Y-%m-%d" -date -d "-1 day" +"%Y-%m-%d" - date -d "2 second" +"%Y-%m-%d %H:%M.%S" # 2秒后输出 date -d "1970-01-01 1234567890 seconds" +"%Y-%m-%d %H:%m:%S" # 输出传说中的1234567890秒 date -d "2009-12-12" +"%Y/%m/%d %H:%M.%S" # 普通转格式 date -d "Dec 5, 2009 12:00:37 AM" +"%Y-%m-%d %H:%M.%S" # apache格式转换 date -d "Dec 5, 2009 12:00:37 AM 2 year ago" +"%Y-%m-%d %H:%M.%S" # 格式转换后时间游走 +date --date='25 Dec' +%A # 今年的圣诞节是星期几 +date -d fri # 这个星期五是几号 +date --date '1970-01-01 UTC 2147483647 seconds' # 将相对于1970-01-01 00:00的秒数转换成时间 + +# 输出昨天日期 +date -d "1 day ago" +"%Y-%m-%d" +date -d "yesterday" +"%Y-%m-%d" +date -d "-1 day" +"%Y-%m-%d" # 加减操作 date +%Y%m%d # 显示前天年月日 diff --git a/Linux_man_cn/dd.md b/Linux_man_cn/dd.md index afbeb67..9304f02 100644 --- a/Linux_man_cn/dd.md +++ b/Linux_man_cn/dd.md @@ -2,16 +2,19 @@ ## 说明 -**dd命令** 用于复制文件并对原文件的内容进行转换和格式化处理。dd命令功能很强大的,对于一些比较底层的问题,使用dd命令往往可以得到出人意料的效果。用的比较多的还是用dd来备份裸设备。但是不推荐,如果需要备份oracle裸设备,可以使用rman备份,或使用第三方软件备份,使用dd的话,管理起来不太方便。 +**dd命令** 用于复制文件并对原文件的内容进行转换和格式化处理。dd命令功能很强大的,对于一些比较底层的问题,使用dd命令往往 +可以得到出人意料的效果。用的比较多的还是用dd来备份裸设备。但是不推荐,如果需要备份oracle裸设备,可以使用rman备份,或使用 +第三方软件备份,使用dd的话,管理起来不太方便 -建议在有需要的时候使用dd 对物理磁盘操作,如果是文件系统的话还是使用tar backup cpio等其他命令更加方便。另外,使用dd对磁盘操作时,最好使用块设备文件。 +建议在有需要的时候使用dd 对物理磁盘操作,如果是文件系统的话还是使用tar backup cpio等其他命令更加方便。另外,使用dd对磁盘 +操作时,最好使用块设备文件 其次,dd命令可以创建一个固定大小的文件如下: dd if=/dev/zero of=/var/swap/file.swap bs=1024K count=64( linux支持K单位,unix不支持;) +## 选项 - -```sh +```markdown bs=BYTES 一次读写BYTES字节数 cbs=BYTES 一次转换BYTES字节数,即指定转换缓冲区大小 conv=CONVS 以逗号分隔的参数列表转换文件,具体参数见下面详述 @@ -24,7 +27,8 @@ of=FILE 从文件写入而不是从标准输出 oflag=FLAGS 按逗号分隔的参数列表写入 seek=N 在输出开始时跳过N个obs-sized的块 skip=N 在输入开始时跳过N个ibs-sized的块 -status=LEVEL 要打印到stderr的信息的级别; 'none'除了错误消息之外禁止其他所有输出,'noxfer'禁止最终传输统计信息,'progress'显示定期传输统计信息 +status=LEVEL 要打印到stderr的信息的级别; 'none'除了错误消息之外禁止其他所有输出,'noxfer'禁止最终传输统计信息, + 'progress'显示定期传输统计信息 N和BYTES之后可以跟随以下乘法后缀: c =1, w =2, b =512, kB =1000, K =1024, MB =1000*1000, M =1024*1024, xM =M @@ -78,12 +82,8 @@ print I/O statistics to standard error and then resume copying. ## 实例 -```sh -dd if=/dev/zero of=sun.txt bs=1M count=1 -1+0 records in -1+0 records out -1048576 bytes (1.0 MB) copied, 0.006107 seconds, 172 MB/s -可以看出dd命令来测试内存操作速度 +```bash +dd if=/dev/zero of=sun.txt bs=1M count=1 # 可以看出dd命令来测试内存操作速度 ``` 该命令创建了一个1M大小的文件sun.txt,其中参数解释: @@ -105,20 +105,17 @@ dd if=/dev/zero of=sun.txt bs=1M count=1 | 兆字节(1024KB) | M | | 吉字节(1024MB) | G | +```bash ## 用dd命令备份磁盘 - -```sh -dd if=/dev/sda of=/deb/sdb # “if”表示inputfile,“of”表示outputfile。参数“conv = noerror”,如果存在读取错误,它将继续复制。 - +dd if=/dev/sda of=/deb/sdb # if表示inputfile,of表示outputfile。参数conv=noerror,如果存在读取错误,它仍将继续复制 dd if=/dev/hda of=~/hdadisk.img # 创建硬盘镜像 - dd if=hdadisk.img of=/dev/hdb # 从硬盘镜像恢复 - dd if=/dev/hda1 of=~/partition1.img # 备份分区 - dd if=/dev/cdrom of=tgsservice.iso bs=2048 # 备份CDROM +dd bs=1M if=/dev/sda | gzip | ssh user@remote 'dd of=sda.gz' # 将硬盘sda压缩并备份到远程机器上 +dd bs=1 seek=2TB if=/dev/null of=ext4.test # 建立一个大的测试文件(不占用空间) -dd if=/dev/zero bs=1024 count=1000000 of=/root/1Gb.filedd if=/root/1Gb.file bs=64k | dd of=/dev/null # 测试硬盘的读写速度 +# 确定硬盘的最佳块大小 +dd if=/dev/zero bs=1024 count=1000000 of=/root/1Gb.filedd if=/dev/zero bs=2048 count=500000 of=/root/1Gb.filedd if=/dev/zero bs=4096 count=250000 of=/root/1Gb.filedd if=/dev/zero bs=8192 count=125000 of=/root/1Gb.file -dd if=/dev/zero bs=1024 count=1000000 of=/root/1Gb.filedd if=/dev/zero bs=2048 count=500000 of=/root/1Gb.filedd if=/dev/zero bs=4096 count=250000 of=/root/1Gb.filedd if=/dev/zero bs=8192 count=125000 of=/root/1Gb.file # 确定硬盘的最佳块大小 ``` \ No newline at end of file diff --git a/Linux_man_cn/df.md b/Linux_man_cn/df.md index 5453610..509cf49 100644 --- a/Linux_man_cn/df.md +++ b/Linux_man_cn/df.md @@ -7,65 +7,31 @@ ## 选项 ```markdown --a或--all:包含全部的文件系统; ---block-size=<区块大小>:以指定的区块大小来显示区块数目; --h或--human-readable:以可读性较高的方式来显示信息; --H或--si:与-h参数相同,但在计算时是以1000 Bytes为换算单位而非1024 Bytes; --i或--inodes:显示inode的信息; --k或--kilobytes:指定区块大小为1024字节; --l或--local:仅显示本地端的文件系统; --m或--megabytes:指定区块大小为1048576字节; ---no-sync:在取得磁盘使用信息前,不要执行sync指令,此为预设值; --P或--portability:使用POSIX的输出格式; ---sync:在取得磁盘使用信息前,先执行sync指令; --t<文件系统类型>或--type=<文件系统类型>:仅显示指定文件系统类型的磁盘信息; --T或--print-type:显示文件系统的类型; --x<文件系统类型>或--exclude-type=<文件系统类型>:不要显示指定文件系统类型的磁盘信息; ---help:显示帮助; ---version:显示版本信息。 -``` - -### 参数 - -文件:指定文件系统上的文件。 - -### 实例 - -查看系统磁盘设备,默认是KB为单位: +-a, --all 包含全部的文件系统 +-B, --block-size=SIZE 在打印之前按size调整大小; 例如:'- BM'以1048576字节为单位打印size;请参阅下面的SIZE格式 + --direct show statistics for a file instead of mount point + --total produce a grand total +-h, --human-readable 以可读性较高的方式来显示信息(e.g., 1K 234M 2G) +-H, --si 与-h参数相同,但在计算时是以1000 Bytes为换算单位而非1024 Bytes +-i, --inodes 显示inode 信息而非块使用量 +-k 即--block-size=1K +-l, --local 只显示本机的文件系统 + --no-sync 取得使用量数据前不进行同步动作(默认) + --output[=FIELD_LIST] use the output format defined by FIELD_LIST, + or print all fields if FIELD_LIST is omitted. +-P, --portability 使用POSIX的输出格式 + --sync invoke sync before getting usage info +-t, --type=TYPE 仅显示指定文件系统类型的磁盘信息 +-T, --print-type 显示文件系统的类型 +-x, --exclude-type=TYPE 不显示指定文件系统类型的磁盘信息 -``` -[root@LinServ-1 ~]# df -文件系统 1K-块 已用 可用 已用% 挂载点 -/dev/sda2 146294492 28244432 110498708 21% / -/dev/sda1 1019208 62360 904240 7% /boot -tmpfs 1032204 0 1032204 0% /dev/shm -/dev/sdb1 2884284108 218826068 2518944764 8% /data1 ``` -使用`-h`选项以KB以上的单位来显示,可读性高: +## 实例 -``` -[root@LinServ-1 ~]# df -h -文件系统 容量 已用 可用 已用% 挂载点 -/dev/sda2 140G 27G 106G 21% / -/dev/sda1 996M 61M 884M 7% /boot -tmpfs 1009M 0 1009M 0% /dev/shm -/dev/sdb1 2.7T 209G 2.4T 8% /data1 -``` +```bash +df # 查看系统磁盘设备,默认是KB为单位 -查看全部文件系统: - -``` -[root@LinServ-1 ~]# df -a -文件系统 1K-块 已用 可用 已用% 挂载点 -/dev/sda2 146294492 28244432 110498708 21% / -proc 0 0 0 - /proc -sysfs 0 0 0 - /sys -devpts 0 0 0 - /dev/pts -/dev/sda1 1019208 62360 904240 7% /boot -tmpfs 1032204 0 1032204 0% /dev/shm -/dev/sdb1 2884284108 218826068 2518944764 8% /data1 -none 0 0 0 - /proc/sys/fs/binfmt_misc ``` diff --git a/Linux_man_cn/dmidecode.md b/Linux_man_cn/dmidecode.md index 34527a7..57a5f3e 100644 --- a/Linux_man_cn/dmidecode.md +++ b/Linux_man_cn/dmidecode.md @@ -2,15 +2,19 @@ ## 说明 -**dmidecode命令** 可以让你在Linux系统下获取有关硬件方面的信息。dmidecode的作用是将DMI数据库中的信息解码,以可读的文本方式显示。由于DMI信息可以人为修改,因此里面的信息不一定是系统准确的信息。dmidecode遵循SMBIOS/DMI标准,其输出的信息包括BIOS、系统、主板、处理器、内存、缓存等等。 +**dmidecode命令** 可以让你在Linux系统下获取有关硬件方面的信息。dmidecode的作用是将DMI数据库中的信息解码,以可读的文本 +方式显示。由于DMI信息可以人为修改,因此里面的信息不一定是系统准确的信息。dmidecode遵循SMBIOS/DMI标准,其输出的信息包括 +BIOS、系统、主板、处理器、内存、缓存等等 -DMI(Desktop Management Interface,DMI)就是帮助收集电脑系统信息的管理系统,DMI信息的收集必须在严格遵照SMBIOS规范的前提下进行。SMBIOS(System Management BIOS)是主板或系统制造者以标准格式显示产品管理信息所需遵循的统一规范。SMBIOS和DMI是由行业指导机构Desktop Management Task Force(DMTF)起草的开放性的技术标准,其中DMI设计适用于任何的平台和操作系统。 +DMI(Desktop Management Interface,DMI)就是帮助收集电脑系统信息的管理系统,DMI信息的收集必须在严格遵照SMBIOS规范的前提 +下进行。SMBIOS(System Management BIOS)是主板或系统制造者以标准格式显示产品管理信息所需遵循的统一规范。SMBIOS和DMI是 +由行业指导机构Desktop Management Task Force(DMTF)起草的开放性的技术标准,其中DMI设计适用于任何的平台和操作系统 -DMI充当了管理工具和系统层之间接口的角色。它建立了标准的可管理系统更加方便了电脑厂商和用户对系统的了解。DMI的主要组成部分是Management Information Format(MIF)数据库。这个数据库包括了所有有关电脑系统和配件的信息。通过DMI,用户可以获取序列号、电脑厂商、串口信息以及其它系统配件信息。 +DMI充当了管理工具和系统层之间接口的角色。它建立了标准的可管理系统更加方便了电脑厂商和用户对系统的了解。DMI的主要组成 +部分是Management Information Format(MIF)数据库。这个数据库包括了所有有关电脑系统和配件的信息。通过DMI,用户可以获取 +序列号、电脑厂商、串口信息以及其它系统配件信息 - - -```info +```markdown Usage: dmidecode [OPTIONS] -d, --dev-mem FILE 从设备文件读取信息,输出内容与不加参数标准输出相同(默认: /dev/mem) @@ -110,7 +114,7 @@ Usage: dmidecode [OPTIONS] ## 实例 -```sh +```bash dmidecode -t 1 # 查看服务器信息 dmidecode | grep 'Product Name' # 查看服务器型号 dmidecode | grep 'Serial Number' # 查看主板的序列号 @@ -121,7 +125,7 @@ dmidecode -t 11 # 查看OEM信息 dmidecode -t 17 # 查看内存条数 dmidecode -t 16 # 查询内存信息 dmidecode -t 4 # 查看CPU信息 - +dmidecode -q | less # 显示SMBIOS/DMI 信息 cat /proc/scsi/scsi # 查看服务器硬盘信息 #不带选项执行dmidecode命令通常会输出所有的硬件信息。dmidecode命令有个很有用的选项-t,可以按指定类型输出相关信息,假如要获得处理器方面的信息,则可以执行: diff --git a/Linux_man_cn/dpkg.md b/Linux_man_cn/dpkg.md index 92691cf..f7547d7 100644 --- a/Linux_man_cn/dpkg.md +++ b/Linux_man_cn/dpkg.md @@ -20,6 +20,7 @@ Deb软件包:指定要操作的.deb软件包。 ### 实例 ``` +dpkg-query -W -f='${Installed-Size;10}\t${Package}\n' | sort -k1,1n | 显示所有在deb发布版上安装的包,并以KB包大小为序 dpkg -i package.deb #安装包 dpkg -r package #删除包 dpkg -P package #删除包(包括配置文件) diff --git a/Linux_man_cn/du.md b/Linux_man_cn/du.md index 8f165bd..97db9a2 100644 --- a/Linux_man_cn/du.md +++ b/Linux_man_cn/du.md @@ -4,15 +4,9 @@ **du命令** 也是查看使用空间的,但是与df命令不同的是Linux du命令是对文件和目录磁盘使用的空间的查看,还是和df命令有一些区别 -### 语法 +## 选项 -``` -du [选项][文件] -``` - - - -``` +```markdown -a或-all 显示目录中个别文件的大小。 -b或-bytes 显示目录或文件大小时,以byte为单位。 -c或--total 除了显示个别目录或文件的大小外,同时也显示所有目录或文件的总和。 @@ -33,7 +27,7 @@ du [选项][文件] ## 实例 ```bash -du -sh /etc/* | sort -rh | head -n 10 # etc目录下所占空间倒序排序前十个目录或文件 +du -sh * | sort -k1,1rh | head -n 10 # 当前目录下所占空间倒序排序前十个 ``` diff --git a/Linux_man_cn/echo.md b/Linux_man_cn/echo.md index 981c33a..d2fc480 100644 --- a/Linux_man_cn/echo.md +++ b/Linux_man_cn/echo.md @@ -33,7 +33,7 @@ echo LONG-OPTION ```bash echo "I live in `locale territory`" # 从locale数据库中展开信息 - +echo "$((0x2dec))" # 十六进制转十进制 # 用echo命令打印带有色彩的文字: ## 文字色:# 颜色码:重置=0,黑色=30,红色=31,绿色=32,黄色=33,蓝色=34,洋红=35,青色=36,白色=37 @@ -47,4 +47,36 @@ echo -e "\e[1;42mGreed Background\e[0m" ## 文字闪动:# 红色数字处还有其他数字参数:0 关闭所有属性、1 设置高亮度(加粗)、4 下划线、5 闪烁、7 反显、8 消隐 echo -e "\033[37;31;5mMySQL Server Stop...\033[39;49;0m" -``` + +# 关于转义字符使用如下: +echo -e "\v\v\v" # 用-e选项,echo会打印出转义字符 +echo -e "\042" # 根据"引号字符的八进制ASCII码打印出字符 +echo $'\042' # 版本2开始bash允许使用$'\nnn'结构,这里'\nnn'表示一个八进制的值 +echo $'\x22' # 使用$'\xnnn'结构也可以使用十六进制来转义 + +# 当使用像$'\x'的结构时,-e的选项是多余的 +echo "NEW LINE and BEEP" +echo $'\n' # 新行 +echo $'\a' # 警告(峰鸣) + +# 用ASCII码值把字符赋给变量 +quote=$'\042' # 引号"被赋值给变量quote +echo "$quote 这是一个引号字符串" + +# 用连串的ASCII码把一串字符赋给变量 +triple_underline=$'\137\137\137' # 137是字符'_'的ASCII码 +echo "$triple_underline UNDERLINE $triple_underline" + +ABC=$'\101\102\103\010' # 101, 102, 103分别是A, B, C字符的八进制ASCII码. +echo $ABC + +escape=$'\033' # 033是ESC的ASCII码的八进制值 +echo "\"escape\" echoes as $escape" # 不可见的输出 + +: << comment +一个字符串赋给变量时里面的组成部分可能会被转义,但如果单独一个转义字符(\)是不能赋给变量的 +转义一个空格可以防止一个字符串参数被分割成多个命令行参数 +转义符也提供了写一个多行命令的手段。一般地,每个单独的行有一个不同的命令,而在一行末尾的转义符转义新行符,命令序列则由下 +一行继续 +comment +``` \ No newline at end of file diff --git a/Linux_man_cn/ethtool.md b/Linux_man_cn/ethtool.md index 42a2b89..6c2b1ac 100644 --- a/Linux_man_cn/ethtool.md +++ b/Linux_man_cn/ethtool.md @@ -1,15 +1,12 @@ -ethtool -=== - -显示或修改以太网卡的配置信息 +# **ethtool** ## 说明 -ethtool命令用于获取以太网卡的配置信息,或者修改这些配置。这个命令比较复杂,功能特别多。 +ethtool命令用于获取以太网卡的配置信息,或者修改这些配置。这个命令比较复杂,功能特别多 -### 语法 +## 选项 -``` +```markdown ethtool [ -a | -c | -g | -i | -d | -k | -r | -S |] ethX ethtool [-A] ethX [autoneg on|off] [rx on|off] [tx on|off] ethtool [-C] ethX [adaptive-rx on|off] [adaptive-tx on|off] [rx-usecs N] [rx-frames N] [rx-usecs-irq N] [rx-frames-irq N] [tx-usecs N] [tx-frames N] [tx-usecs-irq N] [tx-frames-irq N] [stats-block-usecs N][pkt-rate-low N][rx-usecs-low N] [rx-frames-low N] [tx-usecs-low N] [tx-frames-lowN] [pkt-rate-high N] [rx-usecs-high N] [rx-frames-high N] [tx-usecs-high N] [tx-frames-high N] [sample-interval N] @@ -21,11 +18,7 @@ ethtool [-p] ethX [N] ethtool [-t] ethX [offline|online] ethtool [-s] ethX [speed 10|100|1000] [duplex half|full] [autoneg on|off] [port tp|aui|bnc|mii] [phyad N] [xcvr internal|external] [wol p|u|m|b|a|g|s|d...] [sopass xx:yy:zz:aa:bb:cc] [msglvl N] -``` - - -``` -a 查看网卡中 接收模块RX、发送模块TX和Autonegotiate模块的状态:启动on 或 停用off。 -A 修改网卡中 接收模块RX、发送模块TX和Autonegotiate模块的状态:启动on 或 停用off。 -c display the Coalesce information of the specified ethernet card。 @@ -43,202 +36,181 @@ ethtool [-s] ethX [speed 10|100|1000] [duplex half|full] [autoneg on|off] [port -S 显示NIC- and driver-specific 的统计参数,如网卡接收/发送的字节数、接收/发送的广播包个数等。 -t 让网卡执行自我检测,有两种模式:offline or online。 -s 修改网卡的部分配置,包括网卡速度、单工/全双工模式、mac地址等。 -``` -### 数据来源 + ethtool DEVNAME Display standard information about device + ethtool -s|--change DEVNAME Change generic options + [ speed %d ] + [ duplex half|full ] + [ port tp|aui|bnc|mii|fibre ] + [ mdix auto|on|off ] + [ autoneg on|off ] + [ advertise %x ] + [ phyad %d ] + [ xcvr internal|external ] + [ wol p|u|m|b|a|g|s|d... ] + [ sopass %x:%x:%x:%x:%x:%x ] + [ msglvl %d | msglvl type on|off ... ] + ethtool -a|--show-pause DEVNAME Show pause options + ethtool -A|--pause DEVNAME Set pause options + [ autoneg on|off ] + [ rx on|off ] + [ tx on|off ] + ethtool -c|--show-coalesce DEVNAME Show coalesce options + ethtool -C|--coalesce DEVNAME Set coalesce options + [adaptive-rx on|off] + [adaptive-tx on|off] + [rx-usecs N] + [rx-frames N] + [rx-usecs-irq N] + [rx-frames-irq N] + [tx-usecs N] + [tx-frames N] + [tx-usecs-irq N] + [tx-frames-irq N] + [stats-block-usecs N] + [pkt-rate-low N] + [rx-usecs-low N] + [rx-frames-low N] + [tx-usecs-low N] + [tx-frames-low N] + [pkt-rate-high N] + [rx-usecs-high N] + [rx-frames-high N] + [tx-usecs-high N] + [tx-frames-high N] + [sample-interval N] + ethtool -g|--show-ring DEVNAME Query RX/TX ring parameters + ethtool -G|--set-ring DEVNAME Set RX/TX ring parameters + [ rx N ] + [ rx-mini N ] + [ rx-jumbo N ] + [ tx N ] + ethtool -k|--show-features|--show-offload DEVNAME Get state of protocol offload and other features + ethtool -K|--features|--offload DEVNAME Set protocol offload and other features + FEATURE on|off ... + ethtool -i|--driver DEVNAME Show driver information + ethtool -d|--register-dump DEVNAME Do a register dump + [ raw on|off ] + [ file FILENAME ] + ethtool -e|--eeprom-dump DEVNAME Do a EEPROM dump + [ raw on|off ] + [ offset N ] + [ length N ] + ethtool -E|--change-eeprom DEVNAME Change bytes in device EEPROM + [ magic N ] + [ offset N ] + [ length N ] + [ value N ] + ethtool -r|--negotiate DEVNAME Restart N-WAY negotiation + ethtool -p|--identify DEVNAME Show visible port identification (e.g. blinking) + [ TIME-IN-SECONDS ] + ethtool -t|--test DEVNAME Execute adapter self test + [ online | offline | external_lb ] + ethtool -S|--statistics DEVNAME Show adapter statistics + ethtool --phy-statistics DEVNAME Show phy statistics + ethtool -n|-u|--show-nfc|--show-ntuple DEVNAME Show Rx network flow classification options or rules + [ rx-flow-hash tcp4|udp4|ah4|esp4|sctp4|tcp6|udp6|ah6|esp6|sctp6 [context %d] | + rule %d ] + ethtool -N|-U|--config-nfc|--config-ntuple DEVNAME Configure Rx network flow classification options or rules + rx-flow-hash tcp4|udp4|ah4|esp4|sctp4|tcp6|udp6|ah6|esp6|sctp6 m|v|t|s|d|f|n|r... [context %d] | + flow-type ether|ip4|tcp4|udp4|sctp4|ah4|esp4|ip6|tcp6|udp6|ah6|esp6|sctp6 + [ src %x:%x:%x:%x:%x:%x [m %x:%x:%x:%x:%x:%x] ] + [ dst %x:%x:%x:%x:%x:%x [m %x:%x:%x:%x:%x:%x] ] + [ proto %d [m %x] ] + [ src-ip IP-ADDRESS [m IP-ADDRESS] ] + [ dst-ip IP-ADDRESS [m IP-ADDRESS] ] + [ tos %d [m %x] ] + [ tclass %d [m %x] ] + [ l4proto %d [m %x] ] + [ src-port %d [m %x] ] + [ dst-port %d [m %x] ] + [ spi %d [m %x] ] + [ vlan-etype %x [m %x] ] + [ vlan %x [m %x] ] + [ user-def %x [m %x] ] + [ dst-mac %x:%x:%x:%x:%x:%x [m %x:%x:%x:%x:%x:%x] ] + [ action %d ] + [ context %d ] + [ loc %d]] | + delete %d + ethtool -T|--show-time-stamping DEVNAME Show time stamping capabilities + ethtool -x|--show-rxfh-indir|--show-rxfh DEVNAME Show Rx flow hash indirection table and/or RSS hash key + [ context %d ] + ethtool -X|--set-rxfh-indir|--rxfh DEVNAME Set Rx flow hash indirection table and/or RSS hash key + [ context %d|new ] + [ equal N | weight W0 W1 ... | default ] + [ hkey %x:%x:%x:%x:%x:.... ] + [ hfunc FUNC ] + [ delete ] + ethtool -f|--flash DEVNAME Flash firmware image from the specified file to a region on the device + FILENAME [ REGION-NUMBER-TO-FLASH ] + ethtool -P|--show-permaddr DEVNAME Show permanent hardware address + ethtool -w|--get-dump DEVNAME Get dump flag, data + [ data FILENAME ] + ethtool -W|--set-dump DEVNAME Set dump flag of the device + N + ethtool -l|--show-channels DEVNAME Query Channels + ethtool -L|--set-channels DEVNAME Set Channels + [ rx N ] + [ tx N ] + [ other N ] + [ combined N ] + ethtool --show-priv-flags DEVNAME Query private flags + ethtool --set-priv-flags DEVNAME Set private flags + FLAG on|off ... + ethtool -m|--dump-module-eeprom|--module-info DEVNAME Query/Decode Module EEPROM information and optical diagnostics if available + [ raw on|off ] + [ hex on|off ] + [ offset N ] + [ length N ] + ethtool --show-eee DEVNAME Show EEE settings + ethtool --set-eee DEVNAME Set EEE settings + [ eee on|off ] + [ advertise %x ] + [ tx-lpi on|off ] + [ tx-timer %d ] + ethtool --show-fec DEVNAME Show FEC settings + ethtool --set-fec DEVNAME Set FEC settings + [ encoding auto|off|rs|baser ] + +``` + +## 数据来源 Ethtool命令显示的信息来源于网卡驱动层,即TCP/ip协议的链路层。该命令在Linux内核中实现的逻辑层次为: -最重要的结构体`struct ethtool_ops`,该结构体成员为用于显示或修改以太网卡配置的一系列函数指针,见下表中的第二列。 - -网卡驱动负责实现(部分)这些函数,并将其封装入`ethtool_ops`结构体,为网络核心层提供统一的调用接口。因此,不同的网卡驱动会给应用层返回不同的信息。`Ethtool命令选项`、`struct ethtool_ops成员函数`、`Ethtool命令显示参数的来源`,三者间的对应关系如下表所示: - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
命令选项struct ethtool_ops成员函数Ethtool命令显示参数的来源(以网卡驱动BNX2为例)
无 -sget_settingsget_wol get_msglevel get_link set_settings set_wol set_msglevel从网卡寄存器中获得网卡速度等信息,可配置。
-a -Aget_pauseparam set_pauseparam从网卡寄存器中获得Autonegotiate/RX/TX模块的状态:on oroff,可配置。
-c -Cget_coalesceset_coalesce从网卡寄存器中获得coalescing参数:TX/RX一个数据包后,推迟发生TX/RX中断的时间(us)/数据包个数。—减小该值可以提高网卡的响应时间。 当rx-usecs&rx-frames同时被设为0时,RX中断停止。 当tx-usecs&tx-frames同时被设为0时,TX中断停止。
-g -Gget_ringparam set_ringparam除当前TX/RX ring的值(从网卡寄存器中读取得到,可配置)外,其它为网卡bnx2自己固定的信息。
-k -Kget_rx_csumget_tx_csum get_sg get_tso set_rx_csum set_tx_csum set_sg set_tso显示信息从保存该状态的变量中读取得到,没有对应的寄存器。因此,TX/RX校验等模块一直处于on状态,实际上是无法修改的。
-iget_drvinfo[self_test_count, get_stats_coun,t get_regs_len, get_eeprom_len]网卡bnx2自己固定的信息,如: -——————————————————– -driver: bnx2 version: 1.4.30 firmware-version: 1.8.0.5 bus-info: 0000:09:00.0 -——————————————————–
-dget_drvinfoget_regs不支持,即bnx2中没有实现函数get_regs。
-e -Eget_eepromset_eeprom不支持,即bnx2中没有实现函数get_eeprom。
-rnway_reset配置网卡MII_BMCR寄存器,重启Auto negotiation模块。
-pphys_id配置网卡BNX2_EMAC_LED寄存器,实现LED闪功能。
-tself_test通过配置网卡寄存器,逐一测试网卡的硬件模块:registers,memory,loopback,Link stat,interrupt。
-Sget_ethtool_stats显示信息来源于网卡驱动中的结构体变量stats_blk。(网卡通过DMA方式,将寄存器BNX2_HC_STATISTICS _ADDR_L和BNX2_HC_STATISTICS_ADDR_H中的数据实时地读取到结构体变量struct statistics_block *stats_blk中。) —显示的数据都是从网卡寄存器中统计得到的,各项的含义需查询网卡(芯片)手册。
- -由上可见,ethtool命令用于显示/配置网卡硬件(寄存器)。   - -### 实例 - -查看机器上网卡的速度:百兆还是千兆,请输入: - -``` -ethool eth0 +最重要的结构体`struct ethtool_ops`,该结构体成员为用于显示或修改以太网卡配置的一系列函数指针,见下表中的第二列 + +网卡驱动负责实现(部分)这些函数,并将其封装入`ethtool_ops`结构体,为网络核心层提供统一的调用接口。因此,不同的网卡驱动 +会给应用层返回不同的信息。`Ethtool命令选项`、`struct ethtool_ops成员函数`、`Ethtool命令显示参数的来源`,三者间的对应关系 +如下表所示: + +| 命令选项 | struct ethtool_ops成员函数 | Ethtool命令显示参数的来源(以网卡驱动BNX2为例) | +| :------: | :------: | :------: | +| 无 -s | get_settingsget_wol get_msglevel get_link set_settings set_wol set_msglevel | 从网卡寄存器中获得网卡速度等信息,可配置 | +| -a -A | get_pauseparam set_pauseparam | 从网卡寄存器中获得Autonegotiate/RX/TX模块的状态:on oroff,可配置 | +| -c -C | get_coalesceset_coalesce | 从网卡寄存器中获得coalescing参数:TX/RX一个数据包后,推迟发生TX/RX中断的时间(us)/数据包个数。—减小该值可以提高网卡的响应时间。 当rx-usecs&rx-frames同时被设为0时,RX中断停止。 当tx-usecs&tx-frames同时被设为0时,TX中断停止 | +| -g -G | get_ringparam set_ringparam | 除当前TX/RX ring的值(从网卡寄存器中读取得到,可配置)外,其它为网卡bnx2自己固定的信息 | +| -k -K | get_rx_csumget_tx_csum get_sg get_tso set_rx_csum set_tx_csum set_sg set_tso | 显示信息从保存该状态的变量中读取得到,没有对应的寄存器。因此,TX/RX校验等模块一直处于on状态,实际上是无法修改的 | +| -i | get_drvinfo[self_test_count, get_stats_coun,t get_regs_len, get_eeprom_len] | 网卡bnx2自己固定的信息,如: —– driver: bnx2 version: 1.4.30 firmware-version: 1.8.0.5 bus-info: 0000:09:00.0 —— | +| -d | get_drvinfoget_regs | 不支持,即bnx2中没有实现函数get_regs | +| -e -E | get_eepromset_eeprom | 不支持,即bnx2中没有实现函数get_eeprom | +| -r | nway_reset | 配置网卡MII_BMCR寄存器,重启Auto negotiation模块 | +| -p | phys_id | 配置网卡BNX2_EMAC_LED寄存器,实现LED闪功能 | +| -t | self_test | 通过配置网卡寄存器,逐一测试网卡的硬件模块:registers,memory,loopback,Link stat,interrupt | +| -S | get_ethtool_stats | 显示信息来源于网卡驱动中的结构体变量stats_blk。(网卡通过DMA方式,将寄存器BNX2_HC_STATISTICS _ADDR_L和BNX2_HC_STATISTICS_ADDR_H中的数据实时地读取到结构体变量struct statistics_block *stats_blk中。) —显示的数据都是从网卡寄存器中统计得到的,各项的含义需查询网卡(芯片)手册 | + +由上可见,ethtool命令用于显示/配置网卡硬件(寄存器) + +## 实例 + +```bash +ethool eth0 # 查看机器上网卡的速度:百兆还是千兆 +ethtool -A tx off eth0 # 输出信息中`Speed:`这一项就指示了网卡的速度。停止网卡的发送模块TX +ethtool -i eth0 # 可输入`ethtool -a eth0`,查看tx模块是否已被停止。查看网卡eth0采用了何种驱动 +ethtool -K eth0 rx off # 显示 driver: bnx2;version: 1.4.30 等信息。关闭网卡对收到的数据包的校验功能 +ethtool -p eth0 10 # 可输入`ethtool –k eth0`,查看校验功能是否已被停止。如安装了两块网卡,查询eth0对应那块网卡 +ethtool -S eth0 # 看哪块网卡的led灯在闪,eth0就对应着哪块网卡。查看网卡,在接收/发送数据时,有没有出错 +ethtool -s eth0 speed 100 # 将千兆网卡的速度降为百兆 +ethtool --change eth0 autoneg off speed 100 duplex full # 手动设制网卡速度 ``` - -操作完毕后,输出信息中`Speed:`这一项就指示了网卡的速度。停止网卡的发送模块TX,请输入: - -``` -ethtool -A tx off eth0 -``` - -操作完毕后,可输入`ethtool -a eth0`,查看tx模块是否已被停止。查看网卡eth0采用了何种驱动,请输入: - -``` -ethtool -i eth0 -``` - -操作完毕后,显示 driver: bnx2;version: 1.4.30 等信息。关闭网卡对收到的数据包的校验功能,请输入: - -``` -ethtool -K eth0 rx off -``` - -操作完毕后,可输入`ethtool –k eth0`,查看校验功能是否已被停止。如果机器上安装了两块网卡,那么eth0对应着哪块网卡呢?输入: - -``` -ethtool -p eth0 10 -``` - -操作完毕后,看哪块网卡的led灯在闪,eth0就对应着哪块网卡。查看网卡,在接收/发送数据时,有没有出错?请输入: - -``` -ethtool –S eth0 -``` - -将千兆网卡的速度降为百兆,请输入: - -``` -ethtool -s eth0 speed 100    - -``` - - diff --git a/Linux_man_cn/fdisk.md b/Linux_man_cn/fdisk.md index 386fe06..c0397b3 100644 --- a/Linux_man_cn/fdisk.md +++ b/Linux_man_cn/fdisk.md @@ -1,21 +1,17 @@ -fdisk -=== - -查看磁盘使用情况和磁盘分区 +# **fdisk** ## 说明 -**fdisk命令** 用于观察硬盘实体使用情况,也可对硬盘分区。它采用传统的问答式界面,而非类似DOS fdisk的cfdisk互动式操作界面,因此在使用上较为不便,但功能却丝毫不打折扣。 - -### 语法 +**fdisk命令** 用于观察硬盘实体使用情况,也可对硬盘分区。它采用传统的问答式界面,而非类似DOSfdisk的cfdisk互动式操作界面, +因此在使用上较为不便,但功能却丝毫不打折扣 -``` -fdisk(选项)(参数) -``` +## 选项 - +```markdown +fdisk [选项] <磁盘> 更改分区表 +fdisk [选项] -l <磁盘> 列出分区表 +fdisk -s <分区> 给出分区大小(块数) -``` -b <大小> 扇区大小(512、1024、2048或4096) -c[=<模式>] 兼容模式:“dos”或“nondos”(默认) -h 打印此帮助文本 @@ -24,23 +20,19 @@ fdisk(选项)(参数) -C <数字> 指定柱面数 -H <数字> 指定磁头数 -S <数字> 指定每个磁道的扇区数 -``` - -### 参数 -设备文件:指定要进行分区或者显示分区的硬盘设备文件。 +``` -### 实例 +## 实例 +```bash +# 新建分区及目录详细步骤: +: << comment 首先选择要进行操作的磁盘: - -``` -[root@localhost ~]# fdisk /dev/sdb -``` +fdisk /dev/sdb 输入`m`列出可以执行的命令: -``` command (m for help): m Command action a toggle a bootable flag @@ -59,11 +51,9 @@ Command action v verify the partition table w write table to disk and exit x extra functionality (experts only) -``` 输入`p`列出磁盘目前的分区情况: -``` Command (m for help): p Disk /dev/sdb: 3221 MB, 3221225472 bytes @@ -73,21 +63,17 @@ Units = cylinders of 16065 * 512 = 8225280 bytes Device Boot Start End Blocks Id System /dev/sdb1 1 1 8001 8e Linux LVM /dev/sdb2 2 26 200812+ 83 Linux -``` 输入`d`然后选择分区,删除现有分区: -``` Command (m for help): d Partition number (1-4): 1 Command (m for help): d Selected partition 2 -``` 查看分区情况,确认分区已经删除: -``` Command (m for help): print Disk /dev/sdb: 3221 MB, 3221225472 bytes @@ -97,11 +83,9 @@ Units = cylinders of 16065 * 512 = 8225280 bytes Device Boot Start End Blocks Id System Command (m for help): -``` 输入`n`建立新的磁盘分区,首先建立两个主磁盘分区: -``` Command (m for help): n Command action e extended @@ -121,11 +105,9 @@ Partition number (1-4): 2 //分区号为2 First cylinder (101-391, default 101): Using default value 101 Last cylinder or +size or +sizeM or +sizeK (101-391, default 391): +200M //分区结束位置,单位为M -``` 确认分区建立成功: -``` Command (m for help): p Disk /dev/sdb: 3221 MB, 3221225472 bytes @@ -135,11 +117,9 @@ Units = cylinders of 16065 * 512 = 8225280 bytes Device Boot Start End Blocks Id System /dev/sdb1 1 100 803218+ 83 Linux /dev/sdb2 101 125 200812+ 83 Linux -``` 再建立一个逻辑分区: -``` Command (m for help): n Command action e extended @@ -150,11 +130,9 @@ First cylinder (126-391, default 126): Using default value 126 Last cylinder or +size or +sizeM or +sizeK (126-391, default 391): Using default value 391 -``` 确认扩展分区建立成功: -``` Command (m for help): p Disk /dev/sdb: 3221 MB, 3221225472 bytes @@ -165,11 +143,9 @@ Units = cylinders of 16065 * 512 = 8225280 bytes /dev/sdb1 1 100 803218+ 83 Linux /dev/sdb2 101 125 200812+ 83 Linux /dev/sdb3 126 391 2136645 5 Extended -``` 在扩展分区上建立两个逻辑分区: -``` Command (m for help): n Command action l logical (5 or over) @@ -188,11 +164,9 @@ First cylinder (176-391, default 176): Using default value 176 Last cylinder or +size or +sizeM or +sizeK (176-391, default 391): Using default value 391 -``` 确认逻辑分区建立成功: -``` Command (m for help): p Disk /dev/sdb: 3221 MB, 3221225472 bytes @@ -207,104 +181,31 @@ Units = cylinders of 16065 * 512 = 8225280 bytes /dev/sdb6 176 391 1734988+ 83 Linux Command (m for help): -``` 从上面的结果我们可以看到,在硬盘sdb我们建立了2个主分区(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分区: +# 建立好分区之后我们还需要对分区进行格式化才能在系统中使用磁盘 +mkfs.ext4 /dev/sdb1 # 在sdb1上建立ext4分区 -``` -[root@localhost ~]# mkfs.ext2 /dev/sdb1 -mke2fs 1.39 (29-May-2006) -Filesystem label= -OS type: Linux -Block size=4096 (log=2) -Fragment size=4096 (log=2) -100576 inodes, 200804 blocks -10040 blocks (5.00%) reserved for the super user -First data block=0 -Maximum filesystem blocks=209715200 -7 block groups -32768 blocks per group, 32768 fragments per group -14368 inodes per group -Superblock backups stored on blocks: - 32768, 98304, 163840 - -Writing inode tables: done -Writing superblocks and filesystem accounting information: done - -This filesystem will be automatically checked every 32 mounts or -180 days, whichever comes first. Use tune2fs -c or -i to override. -``` -在sdb6上建立ext3分区: - -``` -[root@localhost ~]# mkfs.ext3 /dev/sdb6 -mke2fs 1.39 (29-May-2006) -Filesystem label= -OS type: Linux -Block size=4096 (log=2) -Fragment size=4096 (log=2) -217280 inodes, 433747 blocks -21687 blocks (5.00%) reserved for the super user -First data block=0 -Maximum filesystem blocks=444596224 -14 block groups -32768 blocks per group, 32768 fragments per group -15520 inodes per group -Superblock backups stored on blocks: - 32768, 98304, 163840, 229376, 294912 - -Writing inode tables: done -Creating journal (8192 blocks): done -Writing superblocks and filesystem accounting information: done - -This filesystem will be automatically checked every 32 mounts or -180 days, whichever comes first. Use tune2fs -c or -i to override. -[root@localhost ~]# -``` - -建立两个目录`/oracle`和`/web`,将新建好的两个分区挂载到系统: - -``` -[root@localhost ~]# mkdir /oracle -[root@localhost ~]# mkdir /web -[root@localhost ~]# mount /dev/sdb1 /oracle -[root@localhost ~]# mount /dev/sdb6 /web -``` - -查看分区挂载情况: - -``` -[root@localhost ~]# df -h -文件系统 容量 已用 可用 已用% 挂载点 -/dev/mapper/VolGroup00-LogVol00 - 6.7G 2.8G 3.6G 44% / -/dev/sda1 99M 12M 82M 13% /boot -tmpfs 125M 0 125M 0% /dev/shm -/dev/sdb1 773M 808K 733M 1% /oracle -/dev/sdb6 1.7G 35M 1.6G 3% /web -``` +# 建立两个目录`/oracle`和`/web`,将新建好的两个分区挂载到系统 +mkdir /oracle +mkdir /web +mount /dev/sdb1 /oracle +mount /dev/sdb6 /web 如果需要每次开机自动挂载则需要修改`/etc/fstab`文件,加入两行配置: - -``` -[root@localhost ~]# vim /etc/fstab + vim /etc/fstab /dev/VolGroup00/LogVol00 / ext3 defaults 1 1 LABEL=/boot /boot ext3 defaults 1 2 @@ -313,8 +214,10 @@ devpts /dev/pts devpts gid=5,mode=620 0 0 sysfs /sys sysfs defaults 0 0 proc /proc proc defaults 0 0 /dev/VolGroup00/LogVol01 swap swap defaults 0 0 -/dev/sdb1 /oracle ext2 defaults 0 0 -/dev/sdb6 /web ext3 defaults 0 0 +/dev/sdb1 /oracle ext4 defaults 0 0 +/dev/sdb6 /web ext4 defaults 0 0 +comment + ``` diff --git a/Linux_man_cn/find.md b/Linux_man_cn/find.md index 06c9145..726d420 100644 --- a/Linux_man_cn/find.md +++ b/Linux_man_cn/find.md @@ -192,7 +192,6 @@ find . -type f -name "*.txt" -exec cat {} \;> all.txt # 查找当前目录下 find . -type f -name "*.txt" -exec printf "File: %s\n" {} \; # 找出当前目录下所有.txt文件并以“File:文件名”的形式打印出来 find . -type f -name "*" | xargs grep "test" # 当前目录搜索包含test内容的文件 find . -type f -mmin -10 # 搜索当前目录中,所有过去10分钟中更新过的普通文件。如果不加-type f参数,则搜索普通文件+特殊文件+目录 - ``` ```bash @@ -216,6 +215,10 @@ find . -type f -amin +10 # 搜索访问时间超过10分钟的所有文件 find . -type f -mmin -5 # 查找在5分钟内修改过的文件 find . -type f -newer file.log # 找出比file.log修改时间更长的所有文件 find . -newer file1 ! -newer file2 -exec ls -l {} \; # 查找更改时间比文件file1新但比file2旧的文件 + +# 查找当前目录更改时间一天以内的文件并压缩 +find . -mtime -1 -type f -print0 | xargs -0 tar rvf "archive.tar" +find . -mtime -1 -type f -exec tar rvf "archive.tar" '{}' \; ``` ```bash diff --git a/Linux_man_cn/grep.md b/Linux_man_cn/grep.md index 2ff3bb4..2b17189 100644 --- a/Linux_man_cn/grep.md +++ b/Linux_man_cn/grep.md @@ -132,6 +132,7 @@ fgrep 快速grep命令,不支持正则表达式,与grep -F等价 ## grep命令常见用法 ```bash +grep MemTotal /proc/meminfo # 查看系统可见的总内存 grep bash /etc/passwd | cut -d: -f1 # 显示系统上使用Bash shell登录的所有用户 ls -algG --time-style=+%s | grep ^[^d] | awk -vlimit=$(date +%s -d '10 hours ago') '$4 > limit { print substr($0, index($0, $4) + length($4) + 1) }' # 搜索目录下十小时前更改的文件,不包括文件夹,只使用grep实现。(更好的方式用find实现) grep ^[[:upper:]] test.txt # 搜索test.txt以大写字母开头的行,POSIX字符类作为模式的用法都类似,使用时注意用方括号将POSIX字符括起来就行了 diff --git a/Linux_man_cn/hdparm.md b/Linux_man_cn/hdparm.md index 9a11f19..968d89f 100644 --- a/Linux_man_cn/hdparm.md +++ b/Linux_man_cn/hdparm.md @@ -1,21 +1,12 @@ -hdparm -=== - -显示与设定硬盘的参数 +# hdparm ## 说明 -**hdparm命令** 提供了一个命令行的接口用于读取和设置IDE或SCSI硬盘参数。 - -### 语法 - -``` -hdparm(选项)(参数) -``` +**hdparm命令** 提供了一个命令行的接口用于读取和设置IDE或SCSI硬盘参数 - +## 选项 -``` +```markdown -a<快取分区>:设定读取文件时,预先存入块区的分区数,若不加上<快取分区>选项,则显示目前的设定; -A<0或1>:启动或关闭读取文件时的快取功能; -c:设定IDE32位I/O模式; @@ -46,70 +37,18 @@ hdparm(选项)(参数) -Z:关闭某些Seagate硬盘的自动省电功能。 ``` -### 参数 - -设备文件:指定id驱动对应的设备文件名。 - -### 实例 +## 实例 -显示硬盘的相关设置: - -``` -hdparm /dev/sda -/dev/sda: -IO_support = 0 (default 16-bit) -readonly = 0 (off) -readahead = 256 (on) -geometry = 19457[柱面数]/255[磁头数]/63[扇区数], sectors = 312581808[总扇区数], start = 0[起始扇区数] +```bash +hdparm -i /dev/sda # 显示硬盘/dev/sda的相关设置 +hdparm -tT /dev/sda # 检测磁盘sda的读取速度 +hdparm -g /dev/sda # 显示硬盘的柱面、磁头、扇区数 +hdparm -T /dev/xvda # 测试硬盘缓存的读取速度 +hdparm -C /dev/sda # 检测硬盘的电源管理模式 +hdparm -m /dev/sda # 设置硬盘多重扇区存取的扇区数,以增进硬盘的存取效率,-m不加参数只查询此信息 +# 硬盘坏道修复方法(步骤) +smartctl -l selftest /dev/sda +umount /dev/sda* +badblocks /dev/sda ``` - -显示硬盘的柱面、磁头、扇区数: - -``` -hdparm -g /dev/sda -/dev/sda: -geometry = 19457[柱面数]/255[磁头数]/63[扇区数], sectors = 312581808[总扇区数], start = 0[起始扇区数] -``` - -测试硬盘的读取速度: - -``` -hdparm -T /dev/sda -/dev/sda: - Timing cached reads: 4684 MB in 2.00 seconds = 2342.92 MB/sec -``` - -测试硬盘缓存的读取速度: - -``` -hdparm -T /dev/xvda -/dev/xvda: -Timing cached reads: 11154 MB in 1.98 seconds = 5633.44 MB/sec - -``` - -检测硬盘的电源管理模式: - -``` -hdparm -C /dev/sda -/dev/sda: -drive state is: standby [省电模式] -``` - -查询并设置硬盘多重扇区存取的扇区数,以增进硬盘的存取效率: - -``` -hdparm -m /dev/sda -hdparm -m #参数值为整数值如8 /dev/sda -``` - - **附:硬盘坏道修复方法** - -``` -检查:smartctl -l selftest /dev/sda -卸载:umount /dev/sda* -修复:badblocks /dev/sda -``` - - diff --git a/Linux_man_cn/head.md b/Linux_man_cn/head.md index 1919f2b..3adcc48 100644 --- a/Linux_man_cn/head.md +++ b/Linux_man_cn/head.md @@ -25,5 +25,5 @@ GB 1000*1000*1000, G 1024*1024*1024, 对于T, P, E, Z, Y 同样适用 ```bash head -1 file # 显示file文件第一行 - +head -n1 /etc/issue # 查看操作系统版本,不一定每个系统都能看到 ``` \ No newline at end of file diff --git a/Linux_man_cn/host.md b/Linux_man_cn/host.md index e3701ec..fb30f9f 100644 --- a/Linux_man_cn/host.md +++ b/Linux_man_cn/host.md @@ -1,56 +1,27 @@ -host -=== - -常用的分析域名查询工具 +# host ## 说明 -**host命令** 是常用的分析域名查询工具,可以用来测试域名系统工作是否正常。 - -### 语法 - -``` -host(选项)(参数) -``` - - - -``` --a:显示详细的DNS信息; --c<类型>:指定查询类型,默认值为“IN“; --C:查询指定主机的完整的SOA记录; --r:在查询域名时,不使用递归的查询方式; --t<类型>:指定查询的域名信息类型; --v:显示指令执行的详细信息; --w:如果域名服务器没有给出应答信息,则总是等待,直到域名服务器给出应答; --W<时间>:指定域名查询的最长时间,如果在指定时间内域名服务器没有给出应答信息,则退出指令; --4:使用IPv4; --6:使用IPv6. -``` - -### 参数 - -主机:指定要查询信息的主机信息。 - -### 实例 - +**host命令** 是常用的分析域名查询工具,可以用来测试域名系统工作是否正常 + +## 选项 + +```markdown +-a:显示详细的DNS信息 +-c<类型>:指定查询类型,默认值为IN +-C:查询指定主机的完整的SOA记录 +-r:在查询域名时,不使用递归的查询方式 +-t<类型>:指定查询的域名信息类型 +-v:显示指令执行的详细信息 +-w:如果域名服务器没有给出应答信息,则总是等待,直到域名服务器给出应答 +-W<时间>:指定域名查询的最长时间,如果在指定时间内域名服务器没有给出应答信息,则退出指令 +-4:使用IPv4 +-6:使用IPv6 ``` -[root@localhost ~]# host www.jsdig.com -www.jsdig.com is an alias for host.1.jsdig.com. -host.1.jsdig.com has address 100.42.212.8 - -[root@localhost ~]# host -a www.jsdig.com -Trying "www.jsdig.com" -;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 34671 -;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 0 -;; QUESTION SECTION: -;www.jsdig.com. IN ANY +## 实例 -;; ANSWER SECTION: -www.jsdig.com. 463 IN CNAME host.1.jsdig.com. +```bash +host www.jsdig.com -Received 54 bytes from 202.96.104.15#53 in 0 ms ``` - - diff --git a/Linux_man_cn/hostname.md b/Linux_man_cn/hostname.md index 41a1c49..b4c576c 100644 --- a/Linux_man_cn/hostname.md +++ b/Linux_man_cn/hostname.md @@ -1,39 +1,47 @@ -hostname -=== - -显示和设置系统的主机名 +# hostname ## 说明 -**hostname命令** 用于显示和设置系统的主机名称。环境变量HOSTNAME也保存了当前的主机名。在使用hostname命令设置主机名后,系统并不会永久保存新的主机名,重新启动机器之后还是原来的主机名。如果需要永久修改主机名,需要同时修改`/etc/hosts`和`/etc/sysconfig/network`的相关内容。 +**hostname命令** 用于显示和设置系统的主机名称。环境变量HOSTNAME也保存了当前的主机名。在使用hostname命令设置主机名后,系 +统并不会永久保存新的主机名,重新启动机器之后还是原来的主机名。如果需要永久修改主机名,需要同时修改`/etc/hosts`和 +`/etc/sysconfig/network`的相关内容 -### 语法 +## 选项 -``` -hostname(选项)(参数) -``` +```markdown +Usage: hostname [-b] {hostname|-F file} set host name (from file) + hostname [-a|-A|-d|-f|-i|-I|-s|-y] display formatted name + hostname display host name - + {yp,nis,}domainname {nisdomain|-F file} set NIS domain name (from file) + {yp,nis,}domainname display NIS domain name -``` --v:详细信息模式; --a:显示主机别名; --d:显示DNS域名; --f:显示FQDN名称; --i:显示主机的ip地址; --s:显示短主机名称,在第一个点处截断; --y:显示NIS域名。 -``` + dnsdomainname display dns domain name -### 参数 + hostname -V|--version|-h|--help print info and exit -主机名:指定要设置的主机名。 +Program name: + {yp,nis,}domainname=hostname -y + dnsdomainname=hostname -d -### 实例 +Program options: + -a, --alias 显示主机别名 + -A, --all-fqdns all long host names (FQDNs) + -b, --boot set default hostname if none available + -d, --domain 显示DNS域名 + -f, --fqdn, --long 显示FQDN名称 + -F, --file read host name or NIS domain name from given file + -i, --ip-address 显示主机的ip地址 + -I, --all-ip-addresses all addresses for the host + -s, --short 显示短主机名称,在第一个点处截断 + -y, --yp, --nis 显示NIS/YP域名 ``` -[root@AY1307311912260196fcZ ~]# hostname -AY1307311912260196fcZ + +## 实例 + +```bash +hostname -i # 查寻本地主机的IP地址同等于host `hostname` ``` diff --git a/Linux_man_cn/join.md b/Linux_man_cn/join.md index 597d55a..c677787 100644 --- a/Linux_man_cn/join.md +++ b/Linux_man_cn/join.md @@ -1,34 +1,36 @@ -join -=== - -两个文件中指定栏位内容相同的行连接起来 +# join ## 说明 -**join命令** 用来将两个文件中,制定栏位内容相同的行连接起来。找出两个文件中,指定栏位内容相同的行,并加以合并,再输出到标准输出设备。 - -### 语法 +**join命令** 用来将两个文件中,制定栏位内容相同的行连接起来。找出两个文件中,指定栏位内容相同的行,并加以合并,再输出到 +标准输出设备 + +## 选项 + +```markdown +-a FILENUM 除了显示原来的输出内容之外,还显示指令文件中没有相同栏位的行 +-e EMPTY 若[文件1]与[文件2]中找不到指定的栏位,则在输出中填入选项中的字符串 +-i, --ignore-case 比较栏位内容时,忽略大小写的差异 +-j FIELD equivalent to '-1 FIELD -2 FIELD' +-o FORMAT 按照指定的格式来显示结果 +-t CHAR 使用栏位的分割字符 +-v 文件编号 类似 -a 文件编号,但禁止组合输出行 +-1 域 在文件1 的此域组合 +-2 域 在文件2 的此域组合 +--check-order 检查输入行是否正确排序,即使所有输入行均是成对的 +--nocheck-order 不检查输入是否正确排序 +--header 将首行视作域的头部,直接输出而不对其进行匹配 +-z, --zero-terminated 以0 字节而非新行作为行尾标志 ``` -join(选项)(参数) -``` - - -``` --a<1或2>:除了显示原来的输出内容之外,还显示指令文件中没有相同栏位的行; --e<字符串>:若[文件1]与[文件2]中找不到指定的栏位,则在输出中填入选项中的字符串; --i或--ignore-case:比较栏位内容时,忽略大小写的差异; --o<格式>:按照指定的格式来显示结果; --t<字符>:使用栏位的分割字符; --v<1或2>:更-a相同,但是只显示文件中没有相同栏位的行; --1<栏位>:连接[文件1]指定的栏位; --2<栏位>:连接[文件2]指定的栏位。 -``` - -### 参数 - -* 文件1:要进行合并操作的第1个文件参数; -* 文件2:要进行合并操作的第2个文件参数。 +## 实例 +```bash +# 以下如果是英文文本的话export LANG=C可以提高速度 +join -t'\0' -a1 -a2 file1 file2 # 两个有序文件的并集 +join -t'\0' file1 file2 # 两个有序文件的交集 +join -t'\0' -v2 file1 file2 # 两个有序文件的差集 +join -t'\0' -v1 -v2 file1 file2 # 两个有序文件的对称差集 +``` diff --git a/Linux_man_cn/jwhois.md b/Linux_man_cn/jwhois.md deleted file mode 100644 index 55d6a14..0000000 --- a/Linux_man_cn/jwhois.md +++ /dev/null @@ -1,61 +0,0 @@ -jwhois -=== - -whois 客户端服务 - -## 说明 - -**jwhois** searches Whois servers for the object on the command line.The host to query is taken from a global configuration file, a configuration file specified on the command line, or selected directly on the command line. - -### 语法 - -``` -jwhois [选项] -``` - - - -``` ---version display version number and patch level ---help display this help --v, --verbose verbose debug output --c FILE, --config=FILE use FILE as configuration file --h HOST, --host=HOST explicitly query HOST --n, --no-redirect disable content redirection --s, --no-whoisservers disable whois-servers.net service support --a, --raw disable reformatting of the query --i, --display-redirections display all redirects instead of hiding them --p PORT, --port=PORT use port number PORT (in conjunction with HOST) --r, --rwhois force an rwhois query to be made ---rwhois-display=DISPLAY sets the display option in rwhois queries ---rwhois-limit=LIMIT sets the maximum number of matches to return -``` - -> 注:以上英文部分寻求网友协助翻译,翻译结果可发送至 sa(at)linuxde.net,谢谢! - -### 实例 - -显示指定用户信息: - -``` -# jwhois root - -//查找root用户信息 -``` - -查询域名信息: - -``` -[root@localhost ~]# jwhois linuxde.net -[Querying whois.verisign-grs.com] -[Redirected to whois.west263.com] -[Querying whois.west263.com] -[whois.west263.com] -Domain Name: linuxde.net                    -Registry Domain id: whois protect -Registrar WHOIS Server: whois.west263.com - -...省略部分内容 -``` - - diff --git a/Linux_man_cn/kill.md b/Linux_man_cn/kill.md index bb0022e..e8a78de 100644 --- a/Linux_man_cn/kill.md +++ b/Linux_man_cn/kill.md @@ -2,11 +2,10 @@ ## 说明 -**kill命令** 用来删除执行中的程序或工作。kill可将指定的信息送至程序。预设的信息为SIGTERM(15),可将指定程序终止。若仍无法终止该程序,可使用SIGKILL(9)信息尝试强制删除程序。程序或工作的编号可利用ps指令或job指令查看。 +**kill命令** 用来删除执行中的程序或工作。kill可将指定的信息送至程序。预设的信息为SIGTERM(15),可将指定程序终止。若仍无法 +终止该程序,可使用SIGKILL(9)信息尝试强制删除程序。程序或工作的编号可利用ps指令或job指令查看 - - -```sh +```markdown -a:当处理当前进程时,不限制命令名和进程号的对应关系; -l <信息编号>:若不加<信息编号>选项,则-l参数会列出全部的信息名称 -L, --table List signal names in a nice table @@ -19,7 +18,7 @@ 列出所有信号名称: -```sh +```markdown kill -l 1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL 2) SIGTRAP 6) SIGABRT 7) SIGBUS 8) SIGFPE @@ -41,7 +40,7 @@ 只有第9种信号(SIGKILL)才可以无条件终止进程,其他信号进程都有权利忽略, **下面是常用的信号:** -```sh +```markdown HUP 1 终端断线 INT 2 中断(同 Ctrl + C) QUIT 3 退出(同 Ctrl + \) @@ -51,14 +50,7 @@ CONT 18 继续(与STOP相反, fg/bg命令) STOP 19 暂停(同 Ctrl + Z) ``` -先用ps查找进程,然后用kill杀掉: -```sh -ps -ef | grep vim -root 3268 2884 0 16:21 pts/1 00:00:00 vim install.log -root 3370 2822 0 16:21 pts/0 00:00:00 grep vim +```bash -kill 3268 -kill 3268 --bash: kill: (3268) - 没有那个进程 ``` diff --git a/Linux_man_cn/lsof.md b/Linux_man_cn/lsof.md index 9263f5c..99e05d8 100644 --- a/Linux_man_cn/lsof.md +++ b/Linux_man_cn/lsof.md @@ -126,5 +126,5 @@ lsof输出各列信息的意义如下: ```bash lsof -i # 列出所有的网络连接或端口 - +lsof ~ # 查看打开用户目录的进程 ``` diff --git a/Linux_man_cn/lspci.md b/Linux_man_cn/lspci.md index f4f7410..faa78ba 100644 --- a/Linux_man_cn/lspci.md +++ b/Linux_man_cn/lspci.md @@ -1,21 +1,12 @@ -lspci -=== - -显示当前主机的所有PCI总线信息 +# lspci ## 说明 **lspci命令** 用于显示当前主机的所有PCI总线信息,以及所有已连接的PCI设备信息。 -### 语法 - -``` -lspci(选项) -``` - - +## 选项 -``` +```markdown -n:以数字方式显示PCI厂商和设备代码; -t:以树状结构显示PCI设备的层次关系,包括所有的总线、桥、设备以及它们之间的联接; -b:以总线为中心的视图; @@ -23,57 +14,53 @@ lspci(选项) -s:仅显示指定总线、插槽上的设备和设备上的功能块信息; -i:指定PCI编号列表文件,而不使用默认的文件; -m:以机器可读方式显示PCI设备信息。 -``` -### 实例 +Usage: lspci [] + +Basic display modes: +-mm Produce machine-readable output (single -m for an obsolete format) +-t Show bus tree + +Display options: +-v Be verbose (-vv for very verbose) +-k Show kernel drivers handling each device +-x Show hex-dump of the standard part of the config space +-xxx Show hex-dump of the whole config space (dangerous; root only) +-xxxx Show hex-dump of the 4096-byte extended config space (root only) +-b Bus-centric view (addresses and IRQ's as seen by the bus) +-D Always show domain numbers + +Resolving of device ID's to names: +-n Show numeric ID's +-nn Show both textual and numeric ID's (names & numbers) +-q Query the PCI ID database for unknown ID's via DNS +-qq As above, but re-query locally cached entries +-Q Query the PCI ID database for all ID's via DNS + +Selection of devices: +-s [[[[]:]]:][][.[]] Show only devices in selected slots +-d []:[][:] Show only devices with specified ID's + +Other options: +-i Use specified ID database instead of /usr/share/hwdata/pci.ids +-p Look up kernel modules in a given file instead of default modules.pcimap +-M Enable `bus mapping' mode (dangerous; root only) + +PCI access options: +-A Use the specified PCI access method (see `-A help' for a list) +-O = Set PCI access parameter (see `-O help' for a list) +-G Enable PCI access debugging +-H Use direct hardware access ( = 1 or 2) +-F Read PCI configuration dump from a given file + ``` -[root@localhost ~]# lspci -00:00.0 host bridge: Intel Corporation 5500 I/O Hub to ESI Port (rev 22) -00:01.0 PCI bridge: Intel Corporation 5520/5500/X58 I/O Hub PCI Express Root Port 1 (rev 22) -00:02.0 PCI bridge: Intel Corporation 5520/5500/X58 I/O Hub PCI Express Root Port 2 (rev 22) -00:03.0 PCI bridge: Intel Corporation 5520/5500/X58 I/O Hub PCI Express Root Port 3 (rev 22) -00:07.0 PCI bridge: Intel Corporation 5520/5500/X58 I/O Hub PCI Express Root Port 7 (rev 22) -00:08.0 PCI bridge: Intel Corporation 5520/5500/X58 I/O Hub PCI Express Root Port 8 (rev 22) -00:09.0 PCI bridge: Intel Corporation 5520/5500/X58 I/O Hub PCI Express Root Port 9 (rev 22) -00:0a.0 PCI bridge: Intel Corporation 5520/5500/X58 I/O Hub PCI Express Root Port 10 (rev 22) -00:10.0 PIC: Intel Corporation 5520/5500/X58 Physical and Link Layer Registers Port 0 (rev 22) -00:10.1 PIC: Intel Corporation 5520/5500/X58 Routing and Protocol Layer Registers Port 0 (rev 22) -00:11.0 PIC: Intel Corporation 5520/5500 Physical and Link Layer Registers Port 1 (rev 22) -00:11.1 PIC: Intel Corporation 5520/5500 Routing & Protocol Layer Register Port 1 (rev 22) -00:14.0 PIC: Intel Corporation 5520/5500/X58 I/O Hub System Management Registers (rev 22) -00:14.1 PIC: Intel Corporation 5520/5500/X58 I/O Hub GPIO and Scratch Pad Registers (rev 22) -00:14.2 PIC: Intel Corporation 5520/5500/X58 I/O Hub Control Status and RAS Registers (rev 22) -00:14.3 PIC: Intel Corporation 5520/5500/X58 I/O Hub Throttle Registers (rev 22) -00:16.0 System peripheral: Intel Corporation 5520/5500/X58 Chipset QuickData Technology Device (rev 22) -00:16.1 System peripheral: Intel Corporation 5520/5500/X58 Chipset QuickData Technology Device (rev 22) -00:16.2 System peripheral: Intel Corporation 5520/5500/X58 Chipset QuickData Technology Device (rev 22) -00:16.3 System peripheral: Intel Corporation 5520/5500/X58 Chipset QuickData Technology Device (rev 22) -00:16.4 System peripheral: Intel Corporation 5520/5500/X58 Chipset QuickData Technology Device (rev 22) -00:16.5 System peripheral: Intel Corporation 5520/5500/X58 Chipset QuickData Technology Device (rev 22) -00:16.6 System peripheral: Intel Corporation 5520/5500/X58 Chipset QuickData Technology Device (rev 22) -00:16.7 System peripheral: Intel Corporation 5520/5500/X58 Chipset QuickData Technology Device (rev 22) -00:1a.0 USB controller: Intel Corporation 82801JI (ICH10 Family) USB UHCI Controller #4 -00:1a.1 USB controller: Intel Corporation 82801JI (ICH10 Family) USB UHCI Controller #5 -00:1a.7 USB controller: Intel Corporation 82801JI (ICH10 Family) USB2 EHCI Controller #2 -00:1b.0 Audio device: Intel Corporation 82801JI (ICH10 Family) HD Audio Controller -00:1c.0 PCI bridge: Intel Corporation 82801JI (ICH10 Family) PCI Express Root Port 1 -00:1c.4 PCI bridge: Intel Corporation 82801JI (ICH10 Family) PCI Express Root Port 5 -00:1c.5 PCI bridge: Intel Corporation 82801JI (ICH10 Family) PCI Express Root Port 6 -00:1d.0 USB controller: Intel Corporation 82801JI (ICH10 Family) USB UHCI Controller #1 -00:1d.1 USB controller: Intel Corporation 82801JI (ICH10 Family) USB UHCI Controller #2 -00:1d.2 USB controller: Intel Corporation 82801JI (ICH10 Family) USB UHCI Controller #3 -00:1d.3 USB controller: Intel Corporation 82801JI (ICH10 Family) USB UHCI Controller #6 -00:1d.7 USB controller: Intel Corporation 82801JI (ICH10 Family) USB2 EHCI Controller #1 -00:1e.0 PCI bridge: Intel Corporation 82801 PCI Bridge (rev 90) -00:1f.0 ISA bridge: Intel Corporation 82801JIR (ICH10R) lpc Interface Controller -00:1f.2 IDE interface: Intel Corporation 82801JI (ICH10 Family) 4 port SATA IDE Controller #1 -00:1f.3 SMBus: Intel Corporation 82801JI (ICH10 Family) SMBus Controller -00:1f.5 IDE interface: Intel Corporation 82801JI (ICH10 Family) 2 port SATA IDE Controller #2 -01:01.0 VGA compatible controller: ASPEED Technology, Inc. ASPEED Graphics Family (rev 10) -02:00.0 Ethernet controller: Intel Corporation 82574L Gigabit Network Connection -03:00.0 Ethernet controller: Intel Corporation 82574L Gigabit Network Connection -04:00.0 Serial Attached SCSI controller: LSI Logic / Symbios Logic SAS2008 PCI-Express Fusion-MPT SAS-2 [Falcon] (rev 03) + +## 实例 + +```bash +lspci -tv # 显示PCI信息 + ``` diff --git a/Linux_man_cn/lsusb.md b/Linux_man_cn/lsusb.md index 975a509..7e4541b 100644 --- a/Linux_man_cn/lsusb.md +++ b/Linux_man_cn/lsusb.md @@ -1,23 +1,15 @@ -lsusb -=== - -显示本机的USB设备列表信息 +# lsusb ## 说明 -**lsusb命令** 用于显示本机的USB设备列表,以及USB设备的详细信息。 - -lsusb命令是一个学习USB驱动开发,认识USB设备的助手,推荐大家使用,如果您的开发板中或者产品中没有lsusb命令可以自己移植一个,放到文件系统里面。 +**lsusb命令** 用于显示本机的USB设备列表,以及USB设备的详细信息 -### 语法 - -``` -lsusb(选项) -``` +lsusb命令是一个学习USB驱动开发,认识USB设备的助手,推荐大家使用,如果您的开发板中或者产品中没有lsusb命令可以自己移植 +一个,放到文件系统里面 - +## 选项 -``` +```markdown -v:显示USB设备的详细信息; -s<总线:设备号>仅显示指定的总线和(或)设备号的设备; -d<厂商:产品>:仅显示指定厂商和产品编号的设备; @@ -25,17 +17,18 @@ lsusb(选项) -V:显示命令的版本信息。 ``` -### 实例 +## 实例 +```bash +: << comment 插入usb鼠标后执行lsusb的输出内容如下: - -``` Bus 005 Device 001: id 0000:0000 Bus 001 Device 001: ID 0000:0000 Bus 004 Device 001: ID 0000:0000 Bus 003 Device 001: ID 0000:0000 Bus 002 Device 006: ID 15d9:0a37 Bus 002 Device 001: ID 0000:0000 +comment ``` 解释: diff --git a/Linux_man_cn/mount.md b/Linux_man_cn/mount.md index a4b98de..6bb6b3b 100644 --- a/Linux_man_cn/mount.md +++ b/Linux_man_cn/mount.md @@ -2,70 +2,70 @@ ## 说明 -**mount命令** Linux mount命令是经常会使用到的命令,它用于挂载Linux系统外的文件。 +**mount命令** Linux mount命令是经常会使用到的命令,它用于挂载Linux系统外的文件 ## 选项 ```markdown -mount [-hV] -mount -a [-fFnrsvw] [-t vfstype] -mount [-fnrsvw] [-o options [,...]] device | dir -mount [-fnrsvw] [-t vfstype] [-o options] device dir + mount [-lhV] + mount -a [选项] + mount [选项] [--source] <源> | [--target] <目录> + mount [选项] <源> <目录> + mount <操作> <挂载点> [<目标>] --v:显示较讯息,通常和 -f 用来除错。 --a:将 /etc/fstab 中定义的所有档案系统挂上。 --F:这个命令通常和 -a 一起使用,它会为每一个 mount 的动作产生一个行程负责执行。在系统需要挂上大量 NFS 档案系统时可以加快挂上的动作。 --f:通常用在除错的用途。它会使 mount 并不执行实际挂上的动作,而是模拟整个挂上的过程。通常会和 -v 一起使用。 --n:一般而言,mount 在挂上后会在 /etc/mtab 中写入一笔资料。但在系统中没有可写入档案系统存在的情况下可以用这个选项取消这个动作。 --s-r:等于 -o ro --w:等于 -o rw --L:将含有特定标签的硬盘分割挂上。 --U:将档案分割序号为 的档案系统挂下。-L 和 -U 必须在/proc/partition 这种档案存在时才有意义。 --t:指定档案系统的型态,通常不必指定。mount 会自动选择正确的型态。 --o async:打开非同步模式,所有的档案读写动作都会用非同步模式执行。 --o sync:在同步模式下执行。 --o atime、-o noatime:当 atime 打开时,系统会在每次读取档案时更新档案的『上一次调用时间』。当我们使用 flash 档案系统时可能会选项把这个选项关闭以减少写入的次数。 --o auto、-o noauto:打开/关闭自动挂上模式。 --o defaults:使用预设的选项 rw, suid, dev, exec, auto, nouser, and async. --o dev、-o nodev-o exec、-o noexec允许执行档被执行。 --o suid、-o nosuid: -允许执行档在 root 权限下执行。 --o user、-o nouser:使用者可以执行 mount/umount 的动作。 --o remount:将一个已经挂下的档案系统重新用不同的方式挂上。例如原先是唯读的系统,现在用可读写的模式重新挂上。 --o ro:用唯读模式挂上。 --o rw:用可读写模式挂上。 --o loop=:使用 loop 模式用来将一个档案当成硬盘分割挂上系统。 -``` - -## 实例 - -```bash -将 `/dev/hda1` 挂在 `/mnt` 之下。 -#mount /dev/hda1 /mnt +选项: + -a, --all 挂载 fstab 中的所有文件系统 + -c, --no-canonicalize 不对路径规范化 + -f, --fake 空运行;跳过 mount(2) 系统调用,通常用在除错的用途 + -F, --fork 对每个设备禁用 fork(和 -a 选项一起使用) + -T, --fstab <路径> /etc/fstab 的替代文件 + -h, --help 显示此帮助并退出 + -i, --internal-only 不调用 mount.<类型> 助手程序 + -l, --show-labels 列出所有带有指定标签的挂载 + -n, --no-mtab 不写 /etc/mtab + -o, --options <列表> 挂载选项列表,以英文逗号分隔 + -O, --test-opts <列表> 限制文件系统集合(和 -a 选项一起使用) + -r, --read-only 以只读方式挂载文件系统(同 -o ro) + -t, --types <列表> 限制文件系统类型集合 + --source <源> 指明源(路径、标签、uuid) + --target <目标> 指明挂载点 + -v, --verbose 打印当前进行的操作 + -V, --version 显示版本信息并退出 + -w, --rw, --read-write 以读写方式挂载文件系统(默认) -mount | column -t # 以表格形式输出 -``` +源: + -L, --label <标签> 同 LABEL=