在linux上操作时,熟悉几个shell命令是必不可少的技能,比如grep,sed,sort等。下面以几个例子来说明几种常见的用法 #### grep
grep是Linux中强大的文本搜索工具,用其来查找文本是相当方便的
grep命令格式为:
grep [OPTION] PATTERN [FILE]
常用选项:
-A : 除了显示匹配上的行外,并显示该行之后的内容,可以理解为after
-B : 除了显示匹配上的行外,并显示该行之前的内容,可以理解为before
-c : 输出时显示匹配上的行的计数
-E : 可使用扩展正则表达式来匹配
-F : 用于查找固定字符串
-i : 忽视大小写的匹配
-n : 标示出匹配上的行数的行编号
-v : 只输出那些没有匹配上的行
-o : 只输出匹配上的那部分内容
-w : 只匹配整个单词
-a : 对二进制文件以text形式匹配
常见用法:
匹配固定字符串
grep -F pattern abc.txt
输出没有匹配上pattern的行
grep -v pattern abc.txt
输出匹配上pattern行的行数
grep -n pattern abc.txt
搜索目录,并且是递归搜索,比如递归搜索当前目录
grep -r pattern .
使用扩展正则匹配来搜索能匹配上pattern连续重复的行
grep -E '(pattern)+' abc.txt
匹配多个字符串
grep -e "aaa" -e "bbb"
只在目录中所有的.php和.html文件中递归搜索字符"main()",这个非常棒
grep "main()" . -r --include *.{php,html}
sed
sed 是一个精简的、非交互式的编辑器,它能执行与编辑vi相同的编辑任务。比如在一个流程中,我只想出去一个文件中所有的星号,这时一般不可能写脚本,这时sed就是个非常有效的方法
sed命令行格式为:
sed [-nefri] ‘command’ 输入文本/文件
常用选项:
-n : 取消默认的输出,使用安静(silent)模式。在一般 sed 的用法中,所有来自 STDIN的资料一般都会被列出到屏幕上。但如果加上 -n 参数后,则只有经过sed 特殊处理的那一行(或者动作)才会被列出来
-e : 进行多项编辑,即对输入行应用多条sed命令时使用. 直接在指令列模式上进行 sed 的动作编辑
-f : 指定sed脚本的文件名. 直接将 sed 的动作写在一个档案内, -f filename 则可以执行 filename 内的sed 动作
-r : sed 的动作支援的是延伸型正则表达式的语法。(预设是基础正则表达式语法)
-i : 直接修改读取的文件内容,而不是由屏幕输出
常用命令:
a : 新增, a 的后面可以接字串,而这些字串会在新的一行出现(目前的下一行)
c : 取代, c 的后面可以接字串,这些字串可以取代 n1,n2 之间的行
d : 删除,因为是删除,所以 d 后面通常不接任何内容
i : 插入, i 的后面可以接字串,而这些字串会在新的一行出现(目前的上一行)
p : 列印,亦即将某个选择的资料印出。通常 p 会与参数 sed -n 一起用
s : 取代,可以直接进行替换的工作。通常这个 s 的动作可以搭配正则表达式。
常见用法:
替换文本中所有的星号为空,并不在屏幕输出
sed -i 's//\*/g' abc.txt
替换文本中第3个匹配上的pattern为other
sed 's/pattern/other/3' abc.txt
打印发生替换的行
sed -n 's/pattern/pattern/p' abc.txt
打印文本的10-20行
sed -n '10,20p' abc.txt
替换能匹配到for的行中的pattern字符串为空
sed '/for/ s//pattern/g' abc.txt
替换能匹配for到end的所有行中的pattern字符串为空
sed '/for/,/end/ s//pattern/g' abc.txt
删除空白行
sed '/^$/d' abc.txt
删除第2-10行
sed '2,10d' abc.txt
删除已The开头的的行
sed '/^The/'d abc.txt
直接修改在匹配到end的行的后面追加This is end
sed -i '/end/a\this is end' abc.txt
sort
sort将文件的每一行作为一个单位,相互比较,比较原则是从首字符向后,依次按ASCII码值进行比较,最后将他们按升序输出。
sort命令格式:
sort 选项 参数
常用选项:
-u 它的作用很简单,就是在输出行中去除重复行,只保留其中的第一条。
-r sort默认的排序方式是升序,如果想改成降序,就加个-r就搞定了。
-o 将排序后的结果写入原文件
-n 使用-n选项,来告诉sort,“要以数值来排序”!
-t和-k sort提供了-t选项,后面可以设定间隔符,指定了间隔符之后,就可以用-k来指定列数了
-c 检查文件是否已经排序
-b 忽略每行开头的空格字符,从第一个可见字符开始比较
-f 忽视大小写进行排序
常见用法:
简单的排序
sort abc.txt
对文本进行冒号分割后的第2列进行排序
sort -t: -k2 abc.txt
对文本进行冒号分割,然后先对第2列进行数值排序,如果相同在根据第3列进行数值排序
sort -t: -k2n -k3n abc.txt
如需排序后去重复,可以搭配uniq一起使用,如排序去重后并计数
sort abc.txt |uniq -c
排序后去重并显示重复项
sort abc.txt |uniq -d
排序后去重并显示不重复项
sort abc.txt |uniq -u
补充:shuf命令:随机排序文件
-n 最多显示多少行
-o 将随机排序后的输出写到一个文件中
例子:
shuf test.txt | head -n 20