别忘记使用LINUX SHELL指令完成工作更快
类别: LINUX教程
你是不是已经忘记可以使用命令列来完成工作,还是你从来不知道他可以为你节省许多的时间与烦恼?
有个叫80/20法则的观念可以联想到软件系统上? 观察发现,80%的使用者族群,固定会去使用的只有20%的系统功能。不需要去大费周章的证实这样的统计值,我二十年以上建立软件架构及使用软件系统的经验告诉我,这样的假定,极有可能是正确的。一堆的Linux命令列程序皆无一例外于这样的普遍现象。Linux提供许多Shell层级的命令,可能只有十个能普遍被了解并使用之,而剩下的极大部份,几乎是被忽略的。
这些在 Linux Shell 里不起眼的小东西有哪些是具有被提出来讨论的价值的呢? 我在这将简短的介绍几个不常用,但却相当好用的 Linux Shell 命令,这些程序是我用了好几年,经得起时间考验的。特别是,我选择将重点放在语法解析及格式化文字内容的命令上。
在这些例子里,我假定大家对命令列的语法有基本的熟悉度,并具简单的 Shell 概念还有一些并不是那么普遍的Linux命令。即使如此,命令列的范例仍附上适当的批注而且它是很直接的。在每一个应用上,各个命令列的执行底下都会有一个使用范例给大家看。
下列便是这些语法、格式及文字内容的展现,虽然并非每个范例皆提供具体的说明,不过必须知道的一点是,下列命令若是没有指定档案参数,则它会读取标准输入。
Head/Tail
head ! 与 tail 就像它的名字一样的浅显易懂,它是用来显示开头或结尾某个数量的文字区块,head 用来显示档案的开头至标准输出中,而 tail 想当然尔就是看档案的结尾??~,看看下面的范例:
## (1) displays the first 6 lines of a file
head -6 readme.txt
## (2) displays the last 25 lines of a file
tail -25 mail.txt
范例一是显示档案的前6行,范例二则是显示档案最后的25行。而下面的范别,结合了 head 与tail的指令,显示档案的第11行到第20行:
# (3)
head -20 file | tail -10
在 tail 的使用手册页中显示了比 head 还多的可用参数,其中有一个很好用的参数 " -f ",使用此参数时,tail 不会回传结束信号,除非我们去自行去中断它;相反的,它会一直等待一段时间,一直到他发现数据自它最后一次被读取后,又被加入新的一行时:
## (4) display ongoing updates to the given
## log file
tail -f /usr/tmp/logs/daemon_log.txt
上述范例可以动态显示该log文件的动态更新。
假设该服务程序是一直不断的加入动态数据到 /usr/adm/logs/daemon_log.txt 的 log 文件里,在命令列控制窗口中使用 tail ! -f,它将会以一定的时间实时追踪该档的所有更新。 ( -f 的只有在其输入为档案时才能使用 )。
假如你在 tail 后下了多个档案参数,你便能在同一个窗口内一次追踪数个log档:
## track the mail log and the server error log
## at the same time.
tail -f /var/log/mail.log /var/log/apache/error_log
tac -- 反过来串连?!
cat倒过来怎么拼? 对啦!! 这就是tac的功能??~它是把档案的顺序内容反过来串连用的,那么~它都用在什么状况下呢? 任何须要以后进先出的顺序重新排列组件的工作都用得上它! 以下面的指令来说,便是以自最后建立的到最先建立的顺序,列出三个最新建的使用者账号:
# (5) last 3 /etc/passwd records - in reverse
$ tail -3 /etc/passwd | tac
curly:x:1003:100:3rd Stooge:/homes/curly:/bin/ksh
larry:x:1002:100:2nd Stooge:/homes/larry:/bin/ksh
moe:x:1001:100:1st Stooge:/homes/moe:/bin/ksh
nl -- 为输出列加上编号
nl 是一个简单但很好用的编号过滤工具,我在输入的地方下了??担???所有行列的??瘁皆靠左,nl 是供了非常多的参数使用,可以定义到很细很细? 熊{序来制定它下好编号的输出,下面是一些参数使用的范例说明:
# (6) Display the first 4 entries of the password
# file - numbers to be three columns wide and
# padded by zeros.
$ head -4 /etc/passwd | nl -nrz -w3
001 root:x:0:1:Super-User:/:/bin/ksh
002 daemon:x:1:1::/:
003 bin:x:2:2::/usr/bin:
004 sys:x:3:3::/:
#
# (7) Prepend ordered line numbers followed by an
# \'=\' sign to each line -- start at 101.
$ nl -s= -v101 Data.txt
101=1st Line ...
102=2nd Line ...
103=3rd Line ...
104=4th Line ...
105=5th Line ...
.......
fmt -- 格式化
fmt 是一个简单的文字格式化工具,它重点是在让文字的数据与最大所能支持的宽度一致,它是利用结合及截断行列的空白所完成的。前提是你需要维护的是一个由文书处理器所产生的文字内容,它所输出的文字可能含括了各种不同长度的行列,若这样的文字是由文字编辑器 ( 像是 vi ) 作的,fmt 便能够将此原始文字转化成更好维护的格式。下面的第一个例子,显示的是下 fmt 指令来重新制作档案格式,让它一? ?Jㄜn超过 80 个字符:
# (8) No more than 60 char lines
$ fmt -w 60 README.txt > NEW_README.txt
#
# (9) Force uniform spacing:
# 1 space between words, 2 between sentences
$ echo "Hello World. Hello Universe." |
fmt -u -w80
Hello World. Hello Universe.
fold -- 将输入分段
fold 跟 fmt 很像,但他通常是用来格式化与非增加文字可读性的数据,下面有个简单的例子:
# (10) Format text in 3 column width lines
$ echo oxoxoxoxo | fold -w3
oxo
xox
oxo
# (11) Parse by triplet-char strings -
# search for \'xox\'
$ echo oxoxoxoxo | fold -w3 | grep "xox"
xox
# (12) One way to iterate through a string of chars
$ for i in $(echo 12345 | fold -w1)
> do
> ### perform some task ...
> print $i
> done
1
2
3
4
5
tr
tr 为一个简单的字组转换器,它的实际应用与一些较复杂的程序有点重复,像是 sed 和 awk [ 更大型的二进制程序代码 ]。tr 在文字的置换、删从及增加上很好用。它的指令模式是 "! 从 ( 放在第一个参数 ) …到 ( 第二个参数 )… " 的模式;下面为它一般的使用语法:
# (13) tr usage
tr [options] "set1" ["set2"] < input > output
要注意的是它不接受档案参数,它是读取标准输入然后写到标准输出的,在两个参数都有设定的情况下,tr 会处理 set1 里头的字符,然后根据 set2 里的字符进行替换。
结论
这篇文章最主要的是要提醒大家在系统中有很多不引人注意的东西,其实是很好用的。我的目的是要让大家知道有一些很少用到的功能,并展示这些工具其实是有其使用价值的,或许你会觉得,还不如用 X 还容易些 -- 在你写一些 script 时,或是被卡在命令列的某个地方时,或许是吧,不过我建议你多去找数据, O\'Reilly Linux in a Nutshell的书是一个不错的参考来源,它编排的很好,可以很快的查到你要的东西,当然我也鼓励你去查查它的安装好的手册 ( 编按:可利用 man 查询指令用法 ) 还有参考一下相关的信息页 ( 编按:可以用 info 指令查询各个命令的内容 ) ,不过,并不是所有命令列的指令都能查得到
有个叫80/20法则的观念可以联想到软件系统上? 观察发现,80%的使用者族群,固定会去使用的只有20%的系统功能。不需要去大费周章的证实这样的统计值,我二十年以上建立软件架构及使用软件系统的经验告诉我,这样的假定,极有可能是正确的。一堆的Linux命令列程序皆无一例外于这样的普遍现象。Linux提供许多Shell层级的命令,可能只有十个能普遍被了解并使用之,而剩下的极大部份,几乎是被忽略的。
这些在 Linux Shell 里不起眼的小东西有哪些是具有被提出来讨论的价值的呢? 我在这将简短的介绍几个不常用,但却相当好用的 Linux Shell 命令,这些程序是我用了好几年,经得起时间考验的。特别是,我选择将重点放在语法解析及格式化文字内容的命令上。
在这些例子里,我假定大家对命令列的语法有基本的熟悉度,并具简单的 Shell 概念还有一些并不是那么普遍的Linux命令。即使如此,命令列的范例仍附上适当的批注而且它是很直接的。在每一个应用上,各个命令列的执行底下都会有一个使用范例给大家看。
下列便是这些语法、格式及文字内容的展现,虽然并非每个范例皆提供具体的说明,不过必须知道的一点是,下列命令若是没有指定档案参数,则它会读取标准输入。
Head/Tail
head ! 与 tail 就像它的名字一样的浅显易懂,它是用来显示开头或结尾某个数量的文字区块,head 用来显示档案的开头至标准输出中,而 tail 想当然尔就是看档案的结尾??~,看看下面的范例:
## (1) displays the first 6 lines of a file
head -6 readme.txt
## (2) displays the last 25 lines of a file
tail -25 mail.txt
范例一是显示档案的前6行,范例二则是显示档案最后的25行。而下面的范别,结合了 head 与tail的指令,显示档案的第11行到第20行:
# (3)
head -20 file | tail -10
在 tail 的使用手册页中显示了比 head 还多的可用参数,其中有一个很好用的参数 " -f ",使用此参数时,tail 不会回传结束信号,除非我们去自行去中断它;相反的,它会一直等待一段时间,一直到他发现数据自它最后一次被读取后,又被加入新的一行时:
## (4) display ongoing updates to the given
## log file
tail -f /usr/tmp/logs/daemon_log.txt
上述范例可以动态显示该log文件的动态更新。
假设该服务程序是一直不断的加入动态数据到 /usr/adm/logs/daemon_log.txt 的 log 文件里,在命令列控制窗口中使用 tail ! -f,它将会以一定的时间实时追踪该档的所有更新。 ( -f 的只有在其输入为档案时才能使用 )。
假如你在 tail 后下了多个档案参数,你便能在同一个窗口内一次追踪数个log档:
## track the mail log and the server error log
## at the same time.
tail -f /var/log/mail.log /var/log/apache/error_log
tac -- 反过来串连?!
cat倒过来怎么拼? 对啦!! 这就是tac的功能??~它是把档案的顺序内容反过来串连用的,那么~它都用在什么状况下呢? 任何须要以后进先出的顺序重新排列组件的工作都用得上它! 以下面的指令来说,便是以自最后建立的到最先建立的顺序,列出三个最新建的使用者账号:
# (5) last 3 /etc/passwd records - in reverse
$ tail -3 /etc/passwd | tac
curly:x:1003:100:3rd Stooge:/homes/curly:/bin/ksh
larry:x:1002:100:2nd Stooge:/homes/larry:/bin/ksh
moe:x:1001:100:1st Stooge:/homes/moe:/bin/ksh
nl -- 为输出列加上编号
nl 是一个简单但很好用的编号过滤工具,我在输入的地方下了??担???所有行列的??瘁皆靠左,nl 是供了非常多的参数使用,可以定义到很细很细? 熊{序来制定它下好编号的输出,下面是一些参数使用的范例说明:
# (6) Display the first 4 entries of the password
# file - numbers to be three columns wide and
# padded by zeros.
$ head -4 /etc/passwd | nl -nrz -w3
001 root:x:0:1:Super-User:/:/bin/ksh
002 daemon:x:1:1::/:
003 bin:x:2:2::/usr/bin:
004 sys:x:3:3::/:
#
# (7) Prepend ordered line numbers followed by an
# \'=\' sign to each line -- start at 101.
$ nl -s= -v101 Data.txt
101=1st Line ...
102=2nd Line ...
103=3rd Line ...
104=4th Line ...
105=5th Line ...
.......
fmt -- 格式化
fmt 是一个简单的文字格式化工具,它重点是在让文字的数据与最大所能支持的宽度一致,它是利用结合及截断行列的空白所完成的。前提是你需要维护的是一个由文书处理器所产生的文字内容,它所输出的文字可能含括了各种不同长度的行列,若这样的文字是由文字编辑器 ( 像是 vi ) 作的,fmt 便能够将此原始文字转化成更好维护的格式。下面的第一个例子,显示的是下 fmt 指令来重新制作档案格式,让它一? ?Jㄜn超过 80 个字符:
# (8) No more than 60 char lines
$ fmt -w 60 README.txt > NEW_README.txt
#
# (9) Force uniform spacing:
# 1 space between words, 2 between sentences
$ echo "Hello World. Hello Universe." |
fmt -u -w80
Hello World. Hello Universe.
fold -- 将输入分段
fold 跟 fmt 很像,但他通常是用来格式化与非增加文字可读性的数据,下面有个简单的例子:
# (10) Format text in 3 column width lines
$ echo oxoxoxoxo | fold -w3
oxo
xox
oxo
# (11) Parse by triplet-char strings -
# search for \'xox\'
$ echo oxoxoxoxo | fold -w3 | grep "xox"
xox
# (12) One way to iterate through a string of chars
$ for i in $(echo 12345 | fold -w1)
> do
> ### perform some task ...
> print $i
> done
1
2
3
4
5
tr
tr 为一个简单的字组转换器,它的实际应用与一些较复杂的程序有点重复,像是 sed 和 awk [ 更大型的二进制程序代码 ]。tr 在文字的置换、删从及增加上很好用。它的指令模式是 "! 从 ( 放在第一个参数 ) …到 ( 第二个参数 )… " 的模式;下面为它一般的使用语法:
# (13) tr usage
tr [options] "set1" ["set2"] < input > output
要注意的是它不接受档案参数,它是读取标准输入然后写到标准输出的,在两个参数都有设定的情况下,tr 会处理 set1 里头的字符,然后根据 set2 里的字符进行替换。
结论
这篇文章最主要的是要提醒大家在系统中有很多不引人注意的东西,其实是很好用的。我的目的是要让大家知道有一些很少用到的功能,并展示这些工具其实是有其使用价值的,或许你会觉得,还不如用 X 还容易些 -- 在你写一些 script 时,或是被卡在命令列的某个地方时,或许是吧,不过我建议你多去找数据, O\'Reilly Linux in a Nutshell的书是一个不错的参考来源,它编排的很好,可以很快的查到你要的东西,当然我也鼓励你去查查它的安装好的手册 ( 编按:可利用 man 查询指令用法 ) 还有参考一下相关的信息页 ( 编按:可以用 info 指令查询各个命令的内容 ) ,不过,并不是所有命令列的指令都能查得到
- 上一篇: 构架LINUX环境下JAVA开发环境(2)
- 下一篇: 一家之言:UNIX应该这样学
-= 资 源 教 程 =-
文 章 搜 索