总结了一部分日常命令和概念
∗ 将 命 令 行 的 所 有 参 数 看 成 一 个 整 体 , 而 *将命令行的所有参数看成一个整体,而 ∗将命令行的所有参数看成一个整体,而@则区分各个参数
============================================================
dirname命令可以取给定路径的目录部分(strip non-directory suffix from file name)。
这个命令很少直接在shell命令行中使用,我一般把它用在shell脚本中,用于取得脚本文件所在目录,然后将当前目录切换过去。
根据手册页上说的“Print NAME with its trailing /component removed; if NAME contains no /’s, output ‘.’ (meaning the current directory).”,
似乎说“取给定路径的目录部分” 并不能很准确的概括dirname命令的用途。Linux下还有一个命令是basename,它与dirname相反,是取得文件名称部分
#!/bin/sh
跳转到脚本所在目录
cd $(dirname “$0”) || exit 1
剩下的部分
============================================================
Missing operand 缺少操作数
xargs常用选项
-n: 指定一次处理的参数个数
-d: 自定义参数界定符
-p: 询问是否运行 later command 参数
-t : 表示先打印命令,然后再执行
-i : 逐项处理
…更多参数查看man xargs
xargs与管道|的区别:
管道“|” 用来将前一个命令的标准输出传递到下一个命令的标准输入。
xargs 将前一个命令的标准输出传递给下一个命令,作为它的参数。
可见,标准输入与命令参数是不同的。个人理解,命令参数就是直接跟在命令后面的,标准输入可以是键盘,文件等。
所以,管道符 | 所传递给程序的不是简单地在程序名后面输入的参数,它们会被程序内部的读取功能如scanf和gets等接收,而xargs则是将内容作为普通的参数传递给程序,相当于直接跟在命令后面。况且,有些命令是不接受标准输入的,比如kill,rm等命令。
总结:管道符后不加xargs相当于先将xargs后面的命令回车执行一下再从键盘里输入管道符前面命令执行的结果内容
加上xargs 相当于执行命令(xargs后面的命令)后,直接从键盘输入管道符前面命令执行的结果内容再回车,即管道前面的结果直接跟在xargs 后面的命令后面
xargs与-exec的区别:
-exec:{}表示命令的参数即为所找到的文件,以;表示comman命令的结束。\是转义符,
因为分号在命令中还有它用途,所以就用一个\来限定表示这是一个分号而不是表示其它意思。
-ok: 和 -exec 的作用相同,格式也一样,只不过以一种更为安全的模式来执行该参数
所给出的shell给出的这个命令之前,都会给出提示,让用户来确定是否执行。
xargs将参数一次传给echo,即执行:echo begin ./xargs.txt ./args.txt
exec一次传递一个参数,即执行:echo begin ./xargs.txt;echo begin ./args.txt
xargs 要结合管道来完成
很明显,exec是对每个找到的文件执行一次命令,除非这单个的文件名超过了几k,否则不会出现命令行超长出报错的问题。
而xargs是把所有找到的文件名一股脑的转给命令。当文件很多时,这些文件名组合成的命令行参数很容易超长,导致命令出错。
另外, find | xargs 这种组合在处理有空格字符的文件名时也会出错,因为这时执行的命令已经不知道哪些是分割符、哪些是文件名中的空格!
而用exec则不会有这个问题。
总结
相比之下,也不难看出各自的缺点
1、exec 每处理一个文件或者目录,它都需要启动一次命令,效率不好;
2、exec 格式麻烦,必须用 {} 做文件的代位符,必须用 ; 作为命令的结束符,书写不便。
3、xargs 不能操作文件名有空格的文件;
4、exec参数是一个一个传递的,传递一个参数执行一次命令;xargs一次将参数传给命令,可以使用-n控制参数个数。
5、exec文件名有空格等特殊字符也能处理;xargs不能处理特殊文件名,如果想处理特殊文件名需要特殊处理
综上,如果要使用的命令支持一次处理多个文件,并且也知道这些文件里没有带空格的文件,那么使用 xargs比较方便; 否则,就要用 exec了。
============================================================================================================
EOF在这里通俗讲就是一个标记,他用来标记一段文字(一般都是多行的,省得编码麻烦,
用"<<"加上一个标记就可以把一大段代码存入到一个变量中去了)
$a=<< “EOF” 的意思就是说:下一行开始,直到遇见“EOF”为止,所有的字符都按照指定的格式存入变量a中。
你可以用EEE,MAMA等等其他的名字都可以,就是一个标记而已。他的作用就是简化输入。
===========================================================================================================
linux下命令行删除上一个字符使用ctrl-h,删除光标到行首使用ctrl-u,删除光标到行尾使用ctrl-k,
跳转到上一个单词使用alt-b,跳转到下一个单词使用alt-f,
跳转到行首使用ctrl-a,跳转到行尾使用ctrl-e,搜索历史命令使用ctrl-r
============================================================================================================
i:在光标所在字符前开始插入
a:在光标所在字符后开始插入
o:在光标所在行的下面另起一新行插入
s:删除光标所在的字符并开始插入
I:在光标所在行的行首开始插入 如果行首有空格则在空格之后插入
A:在光标所在你行的行尾开始插入
O:在光标所在行的上面另起一行开始插入
S:删除光标所在行并开始插入
========
vim 中
e 跳转单词末尾
w 跳转下个单词开头
b 跳转上个单词开头
=================================================================================================================
\t 跳格 \r 回车 \n 换行
=================================================================================
vim退出后文本内容仍旧保留在屏幕上
xterm 关闭vim后会清理窗口 (看不到之前的编辑记录,只能看到屏幕编辑上下的历史命令)
vt100 关闭vim后不会清理(可以看到之前的编辑记录,当然也包含屏幕编辑上下的历史命令)
因此一般是默认xterm ,需要改成vt100 (不排除其他类型,没有测试过)
改变如下:
TERM=vt100; export TERM
===================================================
sed编辑器在实际的文本行出现前打印了行号。如果你要在数据流中查找特定文本模式的话,
等号命令用起来非常方便。
$ sed -n '/number 4/{
=
p
}’ data6.txt
4
This is line number 4.
$
利用-n选项,你就能让sed编辑器只显示包含匹配文本模式的行的行号和文本
-n选项:只显示匹配处理的行(否则会输出所有)(也就是关闭默认的输出)
-p选项:打印
==========================================================
grep
-n 在显示符合范本样式的那一列之前,标示出该列的编号。
-v 反转查找
-o 只输出文件中匹配到的部分。
-i 忽略字符大小写的差别。
-a 不要忽略二进制数据。
-A<显示列数> 除了显示符合范本样式的那一行之外,并显示该行之后的内容。
===========================================================
正则表达式识别的特殊字符包括:
.*[]^${}+?|()
尽管正斜线不是正则表达式的特殊字符,但如果它出现在sed编辑器或gawk程序的正
则表达式中,你就会得到一个错误。
$ echo “3 / 2” | sed -n ‘///p’
要使用正斜线,也需要进行转义。
$ echo “3 / 2” | sed -n ‘///p’
3 / 2
$
现在sed编辑器能正确解释正则表达式模式了,一切都很顺利
=============================================================
sed ‘/^$/d’ 4.txt
定义的正则表达式模式会查找行首和行尾之间什么都没有的那些行。由于空白行在两个换行
符之间没有文本,刚好匹配了正则表达式模式。sed编辑器用删除命令d来删除匹配该正则表达式
模式的行,因此删除了文本中的所有空白行。这是从文档中删除空白行的有效方法。
OSIX ERE模式包括了一些可供Linux应用和工具使用的额外符号。gawk程序能够识别ERE
模式,但sed编辑器不能。
警告 记住,sed编辑器和gawk程序的正则表达式引擎之间是有区别的。gawk程序可以使用大多
数扩展正则表达式模式符号,并且能提供一些额外过滤功能,而这些功能都是sed编辑器
所不具备的。但正因为如此,gawk程序在处理数据流时通常才比较慢。
BRE:
- 在字符后面放置星号表明该字符必须在匹配模式的文本中出现0次或多次。
. 特殊字符点号用来匹配除换行符之外的任意单个字符。它必须匹配一个字符,如果在点号字
符的位置没有字符,那么模式就不成立。
[]
^
$
=====================================================================
本节将介绍可用在gawk程序脚本中的较常见的ERE模式符号,而不适用于sed
? 问号类似于星号,不过有点细微的不同。问号表明前面的字符可以出现0次或1次,但只限于此。它不会匹配多次出现的字符。
- 加号是类似于星号的另一个模式符号,但跟问号也有不同。加号表明前面的字符可以出现1
次或多次,但必须至少出现1次。如果该字符没有出现,那么模式就不会匹配。
{} ERE中的花括号允许你为可重复的正则表达式指定一个上限。这通常称为间隔(interval)。
可以用两种格式来指定区间。
m:正则表达式准确出现m次。
m, n:正则表达式至少出现m次,至多n次。
这个特性可以精确调整字符或字符集在模式中具体出现的次数。
警告 默认情况下,gawk程序不会识别正则表达式间隔。必须指定gawk程序的–re- interval
命令行选项才能识别正则表达式间隔。
| 管道符号允许你在检查数据流时,用逻辑OR方式指定正则表达式引擎要用的两个或多个模
式。如果任何一个模式匹配了数据流文本,文本就通过测试。如果没有模式匹配,则数据流文本
匹配失败。
========================================================================
tac命令会倒序显示一个文本文件。
表21-1 sed编辑器的保持空间命令
命 令 描 述
h 将模式空间复制到保持空间
H 将模式空间附加到保持空间
g 将保持空间复制到模式空间
G 将保持空间附加到模式空间
x 交换模式空间和保持空间的内容