Linux Shell 裡一些很少用到卻很有用的指令

2009年11月30日 13:53:00 yaoyasong 阅读数:414
 

Linux Shell 裡一些很少用到卻很有用的指令 
你是不是已經忘記可以使用命令列來完成工作,還是你從來不知道他可以為你節省許多的時間與煩惱?

有個叫 80/20 法則的觀念可以聯想到軟體系統上? A觀查發現, 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 是一個簡單但很好用的編號過濾工具,我在輸入的地方下了担屗行辛械木幋a皆靠左,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 指令來重新製作檔案格式,讓它一? 璊ㄜ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 Shell 裡一些很少用到卻很有用的指令的更多相关文章

  1. 11 个很少人知道但很有用的 Linux 命令

    Linux命令行吸引了大多数Linux爱好者.一个正常的Linux用户一般掌握大约50-60个命令来处理每日的任务.Linux命令和它们的转换对于Linux用户.Shell脚本程序员和管理员来说是最有 ...

  2. xgboost/gbdt在调参时为什么树的深度很少就能达到很高的精度?

    问题: 用xgboost/gbdt在在调参的时候把树的最大深度调成6就有很高的精度了.但是用DecisionTree/RandomForest的时候需要把树的深度调到15或更高.用RandomFore ...

  3. linux shell 指令搜索顺序

    在linux shell 中输入一个命令,如果有多个同名指令,shell需要按照一定规则去取优先级高的一个执行,shell命令的搜索顺序为: 1.别名,使用alias创建的命令. 2.关键字,如if, ...

  4. linux shell 执行命令顺序

    1.shell命令搜索顺序 在linux shell 中输入一个命令,如果有多个同名指令,shell需要按照一定规则去取优先级高的一个执行,shell命令的搜索顺序为: 1.别名,使用alias创建的 ...

  5. Unix / 类 Unix shell 中有哪些很酷很冷门很少用很有用的命令?(转)

    著作权归作者所有. 商业转载请联系作者获得授权,非商业转载请注明出处. 作者:孙立伟 链接:http://www.zhihu.com/question/20140085/answer/14107336 ...

  6. linux下snprintf和sprinf很少被提及的区别

    函数原型:int snprintf(char *dest, size_t size, const char *fmt, ...);函数说明: snprintf函数中的第二个参数,size的解释:siz ...

  7. Linux Shell Bash 带有特殊含义的退出码

    linux在执行完一条命令后,使用 echo $? 会显示上一条命令是否执行成功,相关状态码如下 0为成功 表格 D-1. "保留的"退出码 退出码的值 含义 例子 注释 1 通用 ...

  8. linux shell 正则表达式(BREs,EREs,PREs)差异比较

    linux shell 正则表达式(BREs,EREs,PREs)差异比较 则表达式:在计算机科学中,是指一个用来描述或者匹配一系列符合某个句法规则的字符 串的单个字符串.在很多文本编辑器或其他工具里 ...

  9. 读《Linux Shell脚本攻略》(第2版) 总结

    前段时间读完了<Linux Shell脚本攻略>(第2版)这本书,给部分想读这本书的人分享下个人感受. 说下这本书的难度吧.纯新手或者只懂少部分编程知识的人,读起来还是有很大难度的.以我为 ...

随机推荐

  1. Ubuntu16.04 14.04 配置caffe(CPU only)

    1.安装依赖 sudo apt-get install libprotobuf-dev libleveldb-dev libsnappy-dev libopencv-dev libhdf5-seria ...

  2. Python中collections.defaultdict()使用

    一个小示例 from collections import defaultdict import json def tree(): return defaultdict(tree) users = t ...

  3. jbox小型交互表单(ajax)

    function updateval(id){ var url = '${ctx}/zbapp/ranking/zbappRankingList/form?id=${zbappRankingList. ...

  4. Git 版本控制管理(一)

    Git 是一个分布式版本控制工具,它的作者 Linus Torvalds 是这样给我们介绍 Git  —— The stupid content tracker(傻瓜式的内容跟踪器) 关于 Git 的 ...

  5. MIT-6.828-JOS-lab6:Network Driver

    MIT-6.828 Lab 6: Network Driver (default final project) tags: mit-6.828 os 概述 本lab是6.828默认的最后一个实验,围绕 ...

  6. JAVAEE——SpringBoot入门:简介、微服务、环境准备、helloworld与探究、快速构建项目

    一.Spring Boot 入门 1.Spring Boot 简介 简化Spring应用开发的一个框架: 整个Spring技术栈的一个大整合: J2EE开发的一站式解决方案: 2.微服务 2014,m ...

  7. windows10 卸载 Docker 和 DockerNAT

    删除docker程序 记事本新建脚本文件 a.ps1,内容如下: $ErrorActionPreference = "SilentlyContinue" kill -force - ...

  8. BZOJ.3265.志愿者招募加强版(费用流SPFA)

    题目链接 见上题. 每类志愿者可能是若干段,不满足那个...全幺模矩阵(全单位模矩阵)的条件,所以线性规划可能存在非整数解. 于是就可以用费用流水过去顺便拿个rank2 233. //20704kb ...

  9. POJ.2454.Jersey Politics(随机化算法)

    题目链接 \(Description\) 将长为\(3n\)的序列划分成\(3\)个子序列,要求至少有两个子序列的和都\(\geq 500*n\),输出任一方案.保证有解. \(Solution\) ...

  10. Western Subregional of NEERC, Minsk, Wednesday, November 4, 2015 Problem A. A + B

    Problem A. A + B 题目连接: http://opentrains.snarknews.info/~ejudge/team.cgi?SID=c75360ed7f2c7022&al ...