- 论坛徽章:
- 3
|
Linux Shell 命令行编辑
前言
快速编辑 *nux 的初学者说最烦就是 Shell 的快捷键,也许这样再看全文会更有趣。
其实,命令行适应了,可能比图形界面更有效率。至少对我来说是这样,我现在一看见那些所谓的“慢 Linux /Unix 这类从内核得到整体架构,再到哪怕是最小的一个应用小软件都以文本来支撑的系统,没有娴熟的命令行技巧确实是玩不转的。希望本文能对你提高命令行使用效率有帮助。
但是由于Shell 的主流版本也有好几个,所以,本文所说的内容,可能和你的系统有出入,但是思想是一样的,在你自己的平台上摸索一下,你也会找到你的平台太下编辑命令行的技巧和规律。
另外, VIM, Emacs 的快捷键是相通的,所以,熟练使用 *nux 下的其他软件有很好的启示作用。
命令行的技巧除了本文提到的,还有很多,你可以自己慢慢积累,收集和体会。当然如果你经常需要输入很繁琐的命令,那么建议你自己写 function, alias 等技巧来实现。
我目前使用的系统配置
内核: Gentoo Linux -- 2005.1;
Shell 版本: Gnome -- 2.10.1; gnome-terminal -- 2.10.0;
现在就开始吧
一、自动补齐:
这个技巧很多人都应该会了,就是当输入命令,目录或者是文件名的时候按 charactor ,再按
按[Ctrl + r], [Ctrl + p], [Ctrl + n]
[Ctrl] 键的同时(reverse-i-search), 此时你尝试一下输入你以前输入过的命令,当你每输入一个字符的时候,终端都会滚动显示你的历史命令。当显示到你想找的合适的历史命令的时候,直接 [Ctrl + p] 或[Ctrl + r ] (接着输入[Ctrl + c]
Unix 初学者会习惯性地按
四、光标跳转快捷键:
为了方便大家记忆,加点英语助记语在后面
[Ctrl+ w] 向后删除一个字,用来对付刚刚输入的错误字很有用
[Ctrl+ l] 刷新屏幕(stty:终端相关命令)
[Ctrl+ u] 从光标当前位置删除所有字符至行首
[Ctrl+ k] 从光标当前位置删除所有字符至行尾
[Ctrl+ d] 删除光标当前位置的字符
[Ctrl+ y] 粘贴最后一个被删除的字
[Alt + l] lower case (current word)
[Alt+ u] upper case (current word)
[Alt+ d] 删除从光标当前位置,到当前字的结尾字符
六、配置提示;
如果你是用 gnome-teminal ,上面的 Gnome 的窗口快捷键有冲突。
那么你需要做如下配置:
在 "Edit" -] "Keyboard Shortcuts ..."打开 KDE 下应该怎么配 KDE 的朋友补充一下,我很久没用
2~echo
$echo "hello, world." [Enter]
我们先输入 [Ctrl + r]
我们试试找出历史命令[e],[c],[h]这三个键,这个历史命令大概已经找到了,[Enter]就会再一次执行这个命令,但我们现在来练习一下命令行的编辑。[Ctrl+ a]
echo "hello,world.",并且将光标定位到行首,此时,光标应该在 e 字符上高亮。
第四步: echo, 并且光标仍然在行首,终端显示为:
$ "hello,world."
"printf"
我们尝试一下用 printf 来替代 echo,输入 f 字符后面高亮。[Ctrl+ e]
光标跳转到命令行尾部。[Ctrl+ b]
光标后退一个字符,此时光标应处于后双引号 "\n"
[\][n] ,此时的终端显示应该为:
$ printf"hello, world.\n"
可以
KeyFunction
Ctrl-c Kill foreground process
Ctrl-z Suspend foreground process
Ctrl-d Terminate input, or exitshell
Ctrl-s Suspend output
Ctrl-q Resume output
Ctrl-o Discard output
Ctrl-l Clearscreen
控制字符都是可以用(stty命令)更改的。
可以用stty -a看看终端配置。
每个程序员都应该知道的8个Linux命令
每个程序员,在职业生涯的某个时刻,总会发现自己需要知道一些Linux方面的知识。我并不是说你应该成为一个Linux专家,我的意思是,当面对linux命令行任务时,你应该能很熟练的完成。事实上,学会了下面8个命令,我基本上能完成任何需要完成的任务。
注意:下面的每个命令都有十分丰富的文档说明。这篇文章并不是来详尽的展示每个命令的各种功用的。我在这里要讲的是这几个最常用的命令的最常见用法。如果你对linux命令并不是很了解,你想找一些这方面的资料学习,那这篇文章将会给你一个基本的指导。
让我们从处理一些数据开始。假设我们有两个文件,分别记录的订单清单和订单处理结果。
123456789 order.out.log 8:22:19 111, 1, Patterns of Enterprise Architecture, Kindle edition, 39.99 8:23:45 112, 1, Joy of Clojure, Hardcover, 29.99 8:24:19 113, -1, Patterns of Enterprise Architecture, Kindle edition, 39.99 order.in.log 8:22:20 111, Order Complete 8:23:50 112, Order sent to fulfillment 8:24:20 113, Refund sent to processing
cat
cat – 连接文件,并输出结果
cat 命令非常的简单,你从下面的例子可以看到。
1234 jfields$ cat order.out.log 8:22:19 111, 1, Patterns of Enterprise Architecture, Kindle edition, 39.998:23:45 112, 1, Joy of Clojure, Hardcover, 29.998:24:19 113, -1, Patterns of Enterprise Architecture, Kindle edition, 39.99
就像它的说明描述的,你可以用它来连接多个文件。
1234567 jfields$ cat order.* 8:22:20 111, Order Complete8:23:50 112, Order sent to fulfillment8:24:20 113, Refund sent to processing8:22:19 111, 1, Patterns of Enterprise Architecture, Kindle edition, 39.998:23:45 112, 1, Joy of Clojure, Hardcover, 29.998:24:19 113, -1, Patterns of Enterprise Architecture, Kindle edition, 39.99
如果你想看这些log文件的内容,你可以把它们连接起来并输出到标准输出上,就是上面的例子展示的。这很有用,但输出的内容可以更有逻辑些。
sort
sort – 文件里的文字按行排序
此时sort命令显然是你最佳的选择。
1234567 jfields$ cat order.* | sort8:22:19 111, 1, Patterns of Enterprise Architecture, Kindle edition, 39.998:22:20 111, Order Complete8:23:45 112, 1, Joy of Clojure, Hardcover, 29.998:23:50 112, Order sent to fulfillment8:24:19 113, -1, Patterns of Enterprise Architecture, Kindle edition, 39.998:24:20 113, Refund sent to processing
就像上面例子显示的,文件里的数据已经经过排序。对于一些小文件,你可以读取整个文件来处理它们,然而,真正的log文件通常有大量的内容,你不能不考虑这个情况。此时你应该考虑过滤出某些内容,把cat、sort后的内容通过管道传递给过滤工具。
grep
grep, egrep, fgrep – 打印出匹配条件的文字行
假设我们只对Patterns of Enterprise Architecture这本书的订单感兴趣。使用grep,我们能限制只输出含有Patterns字符的订单。
123 jfields$ cat order.* | sort | grep Patterns8:22:19 111, 1, Patterns of Enterprise Architecture, Kindle edition, 39.998:24:19 113, -1, Patterns of Enterprise Architecture, Kindle edition, 39.99
假设退款订单113出了一些问题,你希望查看所有相关订单——你又需要使用grep了。
123 jfields$ cat order.* | sort | grep ":\d\d 113, "8:24:19 113, -1, Patterns of Enterprise Architecture, Kindle edition, 39.998:24:20 113, Refund sent to processing
你会发现在grep上的匹配模式除了“113”外还有一些其它的东西。这是因为113还可以匹配上书目或价格,加上额外的字符后,我们可以精确的搜索到我们想要的东西。
现在我们已经知道了退货的详细信息,我们还想知道日销售和退款总额。但我们只关心Patterns of Enterprise Architecture这本书的信息,而且只关心数量和价格。我现在要做到是切除我们不关心的任何信息。
cut
cut – 删除文件中字符行上的某些区域
又要使用grep,我们用grep过滤出我们想要的行。有了我们想要的行信息,我们就可以把它们切成小段,删除不需要的部分数据。
1234567 jfields$ cat order.* | sort | grep Patterns8:22:19 111, 1, Patterns of Enterprise Architecture, Kindle edition, 39.998:24:19 113, -1, Patterns of Enterprise Architecture, Kindle edition, 39.99 jfields$ cat order.* | sort | grep Patterns | cut -d"," -f2,5 1, 39.99 -1, 39.99
现在,我们把数据缩减为我们计算想要的形式,把这些数据粘贴到Excel里立刻就能得到结果了。
cut是用来消减信息、简化任务的,但对于输出内容,我们通常会有更复杂的形式。假设我们还需要知道订单的ID,这样可以用来关联相关的其他信息。我们用cut可以获得ID信息,但我们希望把ID放到行的最后,用单引号包上。
sed
sed – 一个流编辑器。它是用来在输入流上执行基本的文本变换。
下面的例子展示了如何用sed命令变换我们的文件行,之后我们在再用cut移除无用的信息。
123456789 jfields$ cat order.* | sort | grep Patterns \>| sed s/"[0-9\:]* \([0-9]*\)\, \(.*\)"/"\2, '\1'"/1, Patterns of Enterprise Architecture, Kindle edition, 39.99, '111'-1, Patterns of Enterprise Architecture, Kindle edition, 39.99, '113' lmp-jfields01:~ jfields$ cat order.* | sort | grep Patterns \>| sed s/"[0-9\:]* \([0-9]*\)\, \(.*\)"/"\2, '\1'"/ | cut -d"," -f1,4,51, 39.99, '111'-1, 39.99, '113'
我们对例子中使用的正则表达式多说几句,不过也没有什么复杂的。正则表达式做了下面几种事情
1、 删除时间戳
2、 捕捉订单号
3、 删除订单号后的逗号和空格
4、 捕捉余下的行信息
里面的引号和反斜杠有点乱,但使用命令行时必须要用到这些。
一旦捕捉到了我们想要的数据,我们可以使用 \1 & \2 来存储它们,并把它们输出成我们想要的格式。我们还在其中加入了要求的单引号,为了保持格式统一,我们还加入了逗号。最后,用cut命令把不必要的数据删除。
现在我们有麻烦了。我们上面已经演示了如何把log文件消减成更简洁的订单形式,但我们的财务部门需要知道订单里一共有哪些书。
uniq
uniq – 删除重复的行
下面的例子展示了如何过滤出跟书相关的交易,删除不需要的信息,获得一个不重复的信息。
123 jfields$ cat order.out.log | grep "\(Kindle\|Hardcover\)" | cut -d"," -f3 | sort | uniq -c 1 Joy of Clojure 2 Patterns of Enterprise Architecture
看起来这是一个很简单的任务。
这都是很好用的命令,但前提是你要能找到你想要的文件。有时候你会发现一些文件藏在很深的文件夹里,你根本不知道它们在哪。但如果你是知道你要寻找的文件的名字的话,这对你就不是个问题了。
find
find – 在文件目录中搜索文件
在上面的例子中我们处理了order.in.log和order.out.log这两个文件。这两个文件放在我的home目录里的。下面了例子将向大家展示如何在一个很深的目录结构里找到这样的文件。
123 jfields$ find /Users -name "order*"Users/jfields/order.in.logUsers/jfields/order.out.log
find命令有很多其它的参数,但99%的时间里我只需要这一个就够了。
简单的一行,你就能找到你想要的文件,然后你可以用cat查看它,用cut修剪它。但文件很小时,你用管道把它们输出到屏幕上是可以的,但当文件大到超出屏幕时,你也许应该用管道把它们输出给less命令。
less
less – 在文件里向前或向后移动
让我们再回到简单的 cat | sort 例子中来,下面的命令就是将经过合并、排序后的内容输出到less命令里。在 less 命令,使用“/”来执行向前搜索,使用“?”命令执行向后搜索。搜索条件是一个正则表达式。
1 jfields$ cat order* | sort | less
如果你在 less 命令里使用 /113.*,所有113订单的信息都会高亮。你也可以试试?.*112,所有跟订单112相关的时间戳都会高亮。最后你可以用 ‘q’ 来退出less命令。
linux里有很丰富的各种命令,有些是很难用的。然而,学会了前面说的这8个命令,你已经能处理大量的log分析任务了,完全不需要用脚本语言写程序来处理它们。
|
|