1—基本命令
1.1 命令ls
"列出"文件的基本命令
使用-R选项, 递归选项, ls将会以目录树的形式列出所有文件.
选项-S, 将会按照文件尺寸列出所有文件,
选项-t, 将会按照修改时间来列出文件,
选项-i选项会显示文件的inode
1.2 命令cat, tac
cat, 是单词concatenate的缩写, 把文件的内容输出到stdout. 当与重定向操作符(>或>>), 一般都是用来将多个文件连接起来
#cat file.1 file.2 file.3 > file.123 # 把三个文件连接到一个文件中.
1.3 命令rev
把每一行中的内容反转, 并且输出到stdout上. 这个命令与tac命令的效果是不同的, 因为它并不反转行序, 而是把每行的内容反转.
bash$ cat file1.txt
This is line 1.
This is line 2.
bash$ tac file1.txt
This is line 2.
This is line 1.
bash$ rev file1.txt
.1 enil si sihT
.2 enil si sihT
1.4 cp这是文件拷贝命令. cp file1 file2把文件file1拷贝到file2, 如果file2存在的话, 那么file2将被覆盖
特别有用的选项就是-a选项, 这是归档标志(目的是为了copy一个完整的目录树), -u是更新选项, -r和-R选项是递归标志.
1 cp -u source_dir/* dest_dir
2 # 把源目录"同步"到目标目录上,
3 #+ 也就是拷贝所有更新的文件和之前不存在的文件.
1.5mv这是文件移动命令. 它等价于cp和rm命令的组合. 它可以把多个文件移动到目录中,甚 至将目录重命名.
1.6 rm删除(清除)一个或多个文件. -f选项将强制删除文件, 即使这个文件是只读的. 并且可以用来避免用户输入(在非交互脚本中使用).
解决这个问题的一个方法就是在要删除的文件的前边加上./ . bash$ rm ./-badname
另一种解决的方法是在文件名前边加上" -- ". bash$ rm -- -badname
当使用递归参数-r时, 这个命令将会删除整个目录树. 如果不慎的使用rm -rf *的话, 那整个目录树就真的完了.
1.7rmdir删除目录. 但是只有这个目录中没有文件的时候 -- 当然会包含"不可见的"点文件 [1] -- 这个命令才会成功.
1.8mkdir生成目录, 创建一个空目录. 比如, mkdir -p project/programs/December将会创建指定的目录, 即使project目录和programs目录都不存在. -p选项将会自动产生必要的父目录, 这样也就同时创建了多个目录.
1.9chmod修改一个现存文件的属性(请参考例子 11-12).
1 chmod +x filename
4 chmod u+s filename
1 chmod 644 filename
1 chmod 1777 directory-name
1.10chattr修改文件属性. 这个命令与上边的chmod命令项类似, 但是有不同的选项和不同的调用语法, 并且这个命令只能工作在ext2文件系统中.
chattr命令的一个特别有趣的选项是i. chattr +i filename将使得这个文件被标记为永远不变. 这个文件将不能被修改, 连接, 或删除, 即使是root也不行. 这个文件属性只能被root设置和删除. 类似的, a选项将会把文件标记为只能追加数据
root# chattr +i file1.txt
1.11 ln创建文件链接, 前提是这个文件是存在的. "链接"就是一个文件的引用, 也就是这个文件的另一个名字. ln命令允许对同一个文件引用多个链接, 并且是避免混淆的一个很好的方法(请参考例子 4-6).
ln对于文件来说只不过是创建了一个引用, 一个指针而已, 因为创建出来的连接文件只有几个字节.
比如: ln -s oldfile newfile将对之前存在的oldfile产生一个新的连接, newfile.
1.12 man, info
这两个命令用来查看系统命令或安装工具的手册和信息. 当两者都可用时, info页一般会比man页包含更多的细节描述.
注意事项
2—复杂命令
2.1 find
2.2 xargs
这是给命令传递参数的一个过滤器, 也是组合多个命令的一个工具. 它把一个数据流分割为一些足够小的块, 以方便过滤器和命令进行处理. 由此这个命令也是后置引用的一个强有力的替换. 当在一般情况下使用过多参数的命令替换都会产生失败的现象, 这时候使用xargs命令来替换, 一般都能成功. [1] 一般的, xargs从stdin或者管道中读取数据, 但是它也能够从文件的输出中读取数据. xargs的默认命令是echo. 这意味着通过管道传递给xargs的输入将会包含换行和空白, 不过通过xargs的处理, 换行和空白将被空格取代
2.3 expr
通用求值表达式: 通过给定的操作(参数必须以空格分开)连接参数, 并对参数求值. 可以使算术操作, 比较操作, 字符串操作或者是逻辑操作
3-时间/日期命令
3.1时间/日期和计时date
直接调用date命令就会把日期和时间输出到 stdout上. 这个命令有趣的地方在于它的格式化和分析选项上.
3.2 zdump
时区dump: 查看特定时区的当前时间.
bash$ zdump EST
EST Tue Sep 18 22:09:22 2001 EST
3.3time
输出统计出来的命令执行的时间.
3.4touch这是一个用来更新文件被访问或修改的时间的工具, 这个时间可以是当前系统的时间,也可以是指定的时间, 这个命令也用来产生一个新文件. 命令touch zzz将产生一个zzz为名字的0字节长度文件, 当然前提是zzz文件不存在. 为了存储时间信息, 就需要一个时间戳为空的文件, 比如当你想跟踪一个工程的修改时间的时候, 这就非常有用了.
touch命令等价于: >> newfile或>> newfile(对于一个普通文件).
3.5at命令是一个作业控制命令, 用来在指定时间点上执行指定的命令集合. 它有点像cron命令, 然而, at命令主要还是用来执行那种一次性执行的命令集合.
at 2pm January 15将会产生提示, 提示你输入需要在这个时间上需要执行的命令序列. 这些命令应该是可以和shll脚本兼容的, 因为实际上在一个可执行的脚本中, 用户每次只能输入一行. 输入将以Ctl-D结束.
你可以使用-f选项或者使用(<)重定向操作符, 来让at命令从一个文件中读取命令集合. 这个文件其实就一个可执行的的脚本, 虽然它是一个不可交互的脚本. 在文件中包含一个run-parts命令, 对于执行一套不同的脚本来说是非常聪明的做法.
bash$ at 2:30 am Friday < at-jobs.list
job 2 at 2000-10-27 02:30
3.6 batch作业控制命令与at令的行为很相像, 但是batch命令被用来在系统平均负载量降到.8以下时执行一次性的任务. 与at命令相似的是, 它也可以使用-f选项来从文件中读取命令.
3.7cal从stdout中输出一个格式比较整齐的日历. 既可以指定当前年度, 也可以指定过去或将来的某个年度.
3.8sleep这个命令与一个等待循环的效果一样. 你可以指定需要暂停的秒数, 这段时间将什么都不干. 当一个后台运行的进程需要偶尔检测一个事件时
sleep 3 # 暂停3秒.
sleep默认是以秒为单位, 但是你也可以指定分钟, 小时, 或者天数为单位. 1 sleep 3 h # 暂停3小时!
如果你想每隔一段时间来运行一个命令的话, 那么watch命令将比sleep命令好得多.
3.9usleep
指定需要sleep的微秒数 ("u"会被希腊人读成"mu", 或者是 micro- 前缀). 与上边的sleep命令相同, 但这个命令以微秒为单位. 当需要精确计时, 或者需要非常频繁的监控一个正在运行进程的时候, 这个命令非常有用.
1 usleep 30 # 暂停30微秒.
这个命令是Red Hat的initscripts / rc-scripts包的一部分.
事实上usleep命令并不能提供非常精确的计时, 所以如果你需要运行一个实时的任务的话, 这个命令并不适合.
3.10 hwclock, clock
hwclock命令可以访问或调整硬件时钟. 这个命令的一些选项需要具有root权限. 在系统启动的时候, /etc/rc.d/rc.sysinit, 会使用hwclock来从硬件时钟中读取并设置系统时间.
clock命令与hwclock命令完全相同
4—文本处理命令
4.1sort文件排序, 通常用在管道中当过滤器来使用. 这个命令可以依据指定的关键字或指定的字符位置, 对文件行进行排序. 使用-m选项, 它将会合并预排序的输入文件. 想了解这个命令的全部参数请参考这个命令的info页.
4.2tsort拓扑排序, 读取以空格分隔的有序对, 并且依靠输入模式进行排序.
4.3uniq这个过滤器将会删除一个已排序文件中的重复行. 这个命令经常出现在sort命令的管道后边.
1 cat list-1 list-2 list-3 | sort | uniq > final.list
2 # 将3个文件连接起来,
3 # 将它们排序,
4 # 删除其中重复的行,
5 # 最后将结果重定向到一个文件中.
-c用来统计每行出现的次数, 并把次数作为前缀放到输出行的前面.
sort INPUTFILE | uniq -c | sort -nr 命令先对INPUTFILE文件进行排序, 然后统计每行出现的次数 (sort命令的-nr选项会产生一个数字的反转排序). 这种命令模板一般都用来分析log文件或者用来分析字典列表, 或者用在那些需要检查文本词汇结构的地方.
4.4 expand, unexpand
expand命令将会把每个tab转化为一个空格. 这个命令经常用在管道中.
unexpand命令将会把每个空格转化为一个tab. 效果与expand命令相反.
4.5 cut一个从文件中提取特定域的工具. 这个命令与awk中使用的print $N命令很相似, 但是更受限. 在脚本中使用cut命令会比使用awk命令来得容易一些. 最重要的选项就是-d(字段定界符)和-f(域分隔符)选项. 使用cut来获得所有mount上的文件系统的列表: 1 cut -d ' ' -f1,2 /etc/mtab
使用cut命令列出OS和内核版本: 1 uname -a | cut -d" " -f1,3,11,12
4.6 paste将多个文件, 以每个文件一列的形式合并到一个文件中, 合并后文件中的每一列就是原来的一个文件. 与cut结合使用, 经常用于创建系统log文件.
4.7join这个命令与paste命令属于同类命令. 但是它能够完成某些特殊的目地. 这个强力工具能够以一种特殊的形式来合并两个文件, 这种特殊的形式本质上就是一个关联数据库的简单版本.
join命令只能够操作两个文件. 它可以将那些具有特定标记域(通常是一个数字标签)的行合并起来, 并且将结果输出到stdout. 被加入的文件应该事先根据标记域进行排序以便于能够正确的匹配.
4.8head
把文件的头部内容打印到stdout上(默认为10行, 可以自己修改). 这个命令有一些比较有趣的选项.
4.9 tail
将一个文件结尾部分的内容输出到stdout中(默认为10行). 通常用来跟踪一个系统logfile的修改情况, 如果使用-f选项的话, 这个命令将会继续显示添加到文件中的行.
4.10 grep
使用正则表达式的一个多用途文本搜索工具. 这个命令本来是ed行编辑器中的一个命令/过滤器: g/re/p -- global - regular expression - print.
grep pattern [file...]
如果没有指定文件参数, grep通常用在管道中对stdout进行过滤.
bash$ ps ax | grep clock
-i 选项在搜索时忽略大小写.
-w 选项用来匹配整个单词.
-l 选项仅列出符合匹配的文件, 而不列出匹配行.
-r (递归) 选项不仅在当前工作目录下搜索匹配, 而且搜索子目录.
-n 选项列出所有匹配行, 并显示行号.
-v (或者--invert-match)选项将会显示所有不匹配的行.
-c (--count) 选项将只会显示匹配到的行数的总数,而不会列出具体的匹配. 当有多个文件参数的时候, grep将会指出哪个文件中包含具体的匹配.
如果存在一个成功的匹配, 那么grep命令将会返回0作为退出状态码, 这样就可以将grep命令的结果放在脚本的条件测试中来使用, 尤其和-q(禁止输出)选项组合时特别有用.
4.11 egrep - 扩展的grep - 这个命令与grep -E等价. 这个命令用起来有些不同, 由于使用正则表达式的扩展集合, 将会使得搜索更具灵活性. 它也允许逻辑|(或)操作.
fgrep - 快速的grep - 这个命令与grep -F等价. 这是一种按照字符串字面意思进行的搜索(即不允许使用正则表达式), 这样有时候会使搜索变得容易一些.
在某些Linux发行版中, egrep和fgrep都是grep命令的符号链接或者别名, 只不过在调用的时候分别使用了-E和-F选项罢了.
agrep (近似grep)扩展了grep近似匹配的能力. 搜索的字符串可能会与最终匹配结果所找到字符串有些不同. 这个工具并不是核心Linux发行版的一部分.
为了搜索压缩文件, 应使用zgrep, zegrep, 或zfgrep. 这些命令也可以对未压缩的文件进行搜索, 只不过会比一般的grep, egrep, 和fgrep慢上一些. 当然, 在你要搜索的文件中如果混合了压缩和未压缩的文件的话, 那么使用这些命令是非常方便的.
如果要搜索bzipped类型的文件, 使用bzgrep.
4.12 look命令与grep命令很相似, 但是这个命令只能做"字典查询", 也就是它所搜索的文件必须是已经排过序的单词列表. 默认情况下, 如果没有指定搜索哪个文件, look命令就默认搜索/usr/dict/words(译者: 感觉好像应该是/usr/share/dict/words), 当然也可以指定其他目录下的文件进行搜索.
4.13 sed, awk
这个两个命令都是独立的脚本语言, 尤其适合分析文本文件和命令输出. 既可以单独使用, 也可以结合管道和在shell脚本中使用.
4.14 sed 非交互式的"流编辑器", 在批处理模式下, 允许使用多个ex命令. 你会发现它在shell脚本中非常有用.
4.15 awk 可编程的文件提取器和文件格式化工具, 在结构化的文本文件中, 处理或提取特定域(特定列)具有非常好的表现. 它的语法与C语言很类似.
4.16 wc
wc可以统计文件或I/O流中的"单词数量": bash $ wc /usr/share/doc/sed-4.1.2/README
13 70 447 README
[13 lines 70 words 447 characters]
wc -w 统计单词数量.
wc -l 统计行数量.
wc -c 统计字节数量.
wc -m 统计字符数量.
wc -L 给出文件中最长行的长度.
wc命令来统计所有以 d - h 开头的文件的大小. bash$ wc [d-h]* | grep total | awk '{print $3}'
使用wc命令来查看指定文件中包含"Linux"的行一共有多少. bash$ grep Linux abs-book.sgml | wc -l
4.17tr字符转换过滤器.
必须使用引用或中括号, 这样做才是合理的. 引用可以阻止shell重新解释出现在tr命令序列中的特殊字符. 中括号应该被引用起来防止被shell扩展.
无论tr "A-Z" "*"
-d选项删除指定范围的字符. 1 echo "abcdef" # abcdef
2 echo "abcdef" | tr -d b-d # aef
tr的不同版本
tr工具在历史上有2个重要版本. BSD版本不需要使用中括号(tr a-z A-Z), 但是SysV版本则需要中括号(tr '[a-z]' '[A-Z]'). GNU版本的tr命令与BSD版本比较象, 所以最好使用中括号来引用字符范围.
4.18 fold将输入按照指定宽度进行折行. 这里有一个非常有用的选项-s, 这个选项可以使用空格进行断行(译者: 事实上只有外文才需要使用空格断行, 中文是不需要的)(请参考例子 12-23和例子 A-1).
4.19 fmt
一个简单的文件格式器, 通常用在管道中, 将一个比较长的文本行输出进行"折行".
4.20 col
这个命令用来滤除标准输入的反向换行符号. 这个工具还可以将空白用等价的tab来替换. col工具最主要的应用还是从特定的文本处理工具中过滤输出, 比如groff和tbl. (译者: 主要用来将man页转化为文本.)
4.21 column列格式化工具. 通过在合适的位置插入tab, 这个过滤工具会将列类型的文本转化为"易于打印"的表格式进行输出.
4.22 colrm列删除过滤器. 这个工具将会从文件中删除指定的列(列中的字符串)并且写到文件中, 如果指定的列不存在, 那么就回到stdout. colrm 2 4
4.23 nl计算行号过滤器. nl filename将会把filename文件的所有内容都输出到stdout上, 但是会在每个非空行的前面加上连续的行号. 如果没有filename参数, 那么就操作stdin.
nl命令的输出与cat -n非常相似, 然而, 默认情况下nl不会列出空行.
4.24 pr格式化打印过滤器. 这个命令会将文件(或stdout)分页, 将它们分成合适的小块以便于硬拷贝打印或者在屏幕上浏览. 使用这个命令的不同的参数可以完成好多任务, 比如对行和列的操作, 加入行, 设置页边, 计算行号, 添加页眉, 合并文件等等. pr命令集合了许多命令的功能, 比如nl, paste, fold, column, 和expand.
pr -o 5 --width=65 fileZZZ | more 这个命令对fileZZZ进行了比较好的分页, 并且打印到屏幕上. 文件的缩进被设置为5, 总宽度设置为65.
一个非常有用的选项-d, 强制隔行打印(与sed -G效果相同).
4.25 gettext
GNU gettext包是专门用来将程序的输出翻译或者本地化为不同国家语言的工具集. 在最开始的时候仅仅支持C语言, 现在已经支持了相当数量的其它程序语言和脚本语言.
想要查看gettext程序如何在shell脚本中使用. 请参考info页.
4.26 msgfmt
一个产生二进制消息目录的程序. 这个命令主要用来本地化.
4.27 iconv
一个可以将文件转化为不同编码格式(字符集)的工具. 这个命令主要用来本地化.
4.28 recode
可以认为这个命令是上边iconv命令的专业版本. 这个非常灵活的并可以把整个文件都转换为不同编码格式的工具并不是Linux标准安装的一部分.
4.29 TeX, gs
TeX和Postscript都是文本标记语言, 用来对打印和格式化的视频显示进行预拷贝.
TeX是Donald Knuth精心制作的排版系统. 通常情况下, 通过编写脚本的手段来把所有的选项和参数封装起来一起传到标记语言中是一件很方便的事情.
Ghostscript (gs) 是一个 遵循GPL的Postscript解释器.
enscript
将纯文本文件转换为PostScript的工具
比如, enscript filename.txt -p filename.ps 产生一个 PostScript 输出文件filename.ps.
groff, tbl, eqn
另一种文本标记和显示格式化语言是groff. 这是一个对传统UNIX roff/troff显示和排版包的GNU增强版本. Man页使用的就是groff.
tbl表处理工具可以认为是groff的一部分, 它的功能就是将表标记转化到groff命令中.
eqn等式处理工具也是groff的一部分, 它的功能是将等式标记转化到groff命令中.
4.30 lex, yacc
lex是用于模式匹配的词汇分析产生程序. 在Linux系统上这个命令已经被flex取代了.
yacc工具基于一系列的语法规范, 产生一个语法分析器. 在Linux系统上这个命令已经被bison取代了.
注意事项
[1] 对于GNU版本的tr命令来说, 这是唯一一处比那些商业UNIX系统上的一般版本更好的地方
阅读(439) | 评论(0) | 转发(0) |