Linux命令:管线命令
来源:互联网 发布:网络专科 编辑:程序博客网 时间:2024/05/18 00:08
http://blog.csdn.net/pipisorry/article/details/39760961
当Linux执行一个程序的时候,会自动打开三个流,标准输入(standard input),标准输出(standard output),标准错误(standard error)。比如说你打开命令行的时候,默认情况下,命令行的标准输入连接到键盘,标准输出和标准错误都连接到屏幕。
<符号改变标准输入
比如cat命令,它可以从标准输入读入文本流,并输出到标准输出:
$cat < a.txt
我们将cat标准输入指向a.txt,文本会从文件流到cat,然后再输出到屏幕上。
同时重新定向标准输出
$cat < a.txt > b.txt
使用>&来同时重新定向标准输出和标准错误。
如果只想重新定向标准错误,可以使用2>。
管线命令 (pipe)
管线命令在 bash 的连续的处理程序中是相当重要的,在 log file 的分析当中也是相当重要的一环。
Note: 管线命令前面命令的输出可以使用{}收集。
撷取命令: cut, grep
排序命令: sort, uniq, wc
双向重导向: tee
字符转换命令: tr, col, join, paste, expand
分割命令: split
参数代换: xargs
关于减号 - 的用途
皮皮blog
撷取命令: cut, grep
linux cut命令
$ cut -d'分隔字符' -f fields <==用于有特定分隔字符
$ cut -c 字符区间 <==用于排列整齐的讯息
选项与参数:-d :后面接分隔字符。与 -f 一起使用;-f :依据 -d 的分隔字符将一段讯息分区成为数段,用 -f 取出第几段的意思;-c :以字符 (characters) 的单位取出固定字符区间;这样不就是对字符串取子串操作么
去除字符串前两位字符
find . -size +100M ! -path *git* | cut -c 3-
linux grep命令
作用
Linux系统中grep命令是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹 配的行打印出来。grep全称是Global Regular Expression Print,表示全局正则表达式版本,它的使用权限是所有用户。
有一点要注意,您必需提供一个文件过滤方式(搜索全部文件的话用 *)。如果您忘了,’grep’会一直等着,直到该程序被中断。如果您遇到了这样的情况,按 <CTRL c> ,然后再试。
grep 则是分析一行讯息, 若当中有我们所需要的信息,就将该行拿出来~
格式
$ grep [-acinv] [--color=auto] '搜寻字串' filename选项与参数:-a :将 binary 文件以 text 文件的方式搜寻数据-c :计算找到 '搜寻字串' 的次数,只输出匹配行的计数-i :忽略大小写的不同,所以大小写视为相同(只适用于单字符)-n :顺便输出行号,显示匹配行及行号。-v :反向选择,亦即显示出没有 '搜寻字串' 内容的那一行!--color=auto :可以将找到的关键字部分加上颜色的显示喔!
-h:查询多文件时不显示文件名。-l:查询多文件时只输出包含匹配字符的文件名。-s:不显示不存在或无匹配文本的错误信息。
pattern正则表达式主要参数:
\: 忽略正则表达式中特殊字符的原有含义。
^:匹配正则表达式的开始行。
$: 匹配正则表达式的结束行。
\<:从匹配正则表达式的行开始。
\>:到匹配正则表达式的行结束。
\< 和 \> 分别标注单词的开始与结尾。例如:
grep man * 会匹配 ‘Batman’、’manic’、’man’等,
grep ‘\<man’ * 匹配’manic’和’man’,但不是’Batman’,
grep ‘\<man\>’ 只匹配’man’,而不是’Batman’或’manic’等其他的字符串。[ ]:单个字符,如[A]即A符合要求 。
[ - ]:范围,如[A-Z],即A、B、C一直到Z都符合要求 。
。:所有的单个字符。应该是英文句号?
* :有字符,长度可以为0。
下面还有一些有意思的命令行参数:
grep -l pattern files :只列出匹配的文件名,
grep -L pattern files :列出不匹配的文件名,
grep -w pattern files :只匹配整个单词,而不是字符串的一部分(如匹配’magic’,而不是’magical’),
grep -C number pattern files :匹配的上下文分别显示[number]行,
grep pattern1 | pattern2 files :显示匹配 pattern1 或 pattern2 的行,
grep pattern1 files | grep pattern2 :显示既匹配 pattern1 又匹配 pattern2 的行。
4.grep命令使用简单实例
$ grep ‘test’ d*
显示所有以d开头的文件中包含 test的行。
$ grep ‘test’ aa bb cc
显示在aa,bb,cc文件中匹配test的行。
$ grep ‘[a-z]\{5\}’ aa
显示所有包含每个字符串至少有5个连续小写字符的字符串的行。
$ grep ‘w\(es\)t.*\1′ aa
如果west被匹配,则es就被存储到内存中,并标记为1,然后搜索任意个字符(.*),这些字符后面紧跟着 另外一个es(\1),找到就显示该行。如果用egrep或grep -E,就不用”\”号进行转义,直接写成’w(es)t.*\1′就可以了。
5.grep命令使用复杂实例
假设您正在’/usr/src/Linux/Doc’目录下搜索带字符 串’magic’的文件:
$ grep magic /usr/src/Linux/Doc/*
sysrq.txt:* How do I enable the magic SysRQ key?
sysrq.txt:* How do I use the magic SysRQ key?
其中文件’sysrp.txt’包含该字符串,讨论的是 SysRQ 的功能。
默认情况下,’grep’只搜索当前目录。如果 此目录下有许多子目录,’grep’会以如下形式列出:
grep: sound: Is a directory
这可能会使’grep’ 的输出难于阅读。这里有两种解决的办法:
明确要求搜索子目录:grep -r
或忽略子目录:grep -d skip
如果有很多 输出时,您可以通过管道将其转到’less’上阅读:
$ grep magic /usr/src/Linux/Documentation/* | less
这样,您就可以更方便地阅读。
grep字符串搜索算法
grep速度快的一个重要原因是使用了Boyer-Moore算法作为字符串搜索算法
[为什么GNU grep如此之快?]
grep之字符串搜索算法Boyer-Moore由浅入深(比KMP快3-5倍)
[grep之字符串搜索算法Boyer-Moore由浅入深]
皮皮Blog排序命令: sort, uniq, wc
linux sort命令
排序的字符与语系的编码有关,因此, 如果您需要排序时,建议使用 LANG=C 来让语系统一,数据排序比较好一些。
$ sort [-fbMnrtuk] [file or stdin]选项与参数:-f :忽略大小写的差异,例如 A 与 a 视为编码相同;-b :忽略最前面的空白字符部分;-M :以月份的名字来排序,例如 JAN, DEC 等等的排序方法;-n :使用“纯数字”进行排序(默认是以文字体态来排序的);-r :反向排序;-u :就是 uniq ,相同的数据中,仅出现一行代表;-t :分隔符号,默认是用 [tab] 键来分隔;-k :以那个区间 (field) 来进行排序的意思
linux uniq命令
将重复的数据仅列出一个显示
[dmtsai@study ~]$ uniq [-ic]选项与参数:-i :忽略大小写字符的不同;-c :进行计数
Note: 特别要注意的地方: 'uniq' does not detect repeated lines unless they are adjacent. You may want to sort the input first, or use 'sort -u' without 'uniq'. Also, comparisons honor the rules specified by 'LC_COLLATE'.
也就是在使用uniq之前要进行排序,否则相隔的相同字符不会去重。这样的话,直接使用sort -nu最好了。
pipi@pipicmp:~/files/DATASETS/tianchi/ccf_data_revised$ cat ccf_online_stage1_train.csv | cut -d ',' -f 2 | uniq | sort -n | head
10001
10001
10001...
10001
pipi@pipicmp:~/files/DATASETS/tianchi/ccf_data_revised$ cat ccf_online_stage1_train.csv | cut -d ',' -f 2 | sort -n | uniq | head
10001
10002
10003
10004...
10009
10010
linux wc命令
要知道文件里面有多少字?多少行?多少字符?
$ wc [-lwm]选项与参数:-l :仅列出行;-w :仅列出多少字(英文单字);-m :多少字符;
统计项目中的代码行数cloc
cloc能够统计包括:代码行数、注释、空行、文件大小等数据。另外,还支持对软件开发项目的各个开发阶段的工数、成本、质量指标等进行分析和预测。
$ sudo apt-get install cloc
SocialNetworks$ cloc .
[cloc网站]
直接写简单的可以这样:
find . \( -path ./tmp_data -o -path ./gowalla-exp \) -prune -o \( -name '*.pyc' -o -name '*.py' -type f \) -print | xargs -0 cat | grep -v -e ^$ -e ^\s*\#.*$ | wc -l | more
[怎么统计一个工程的代码行数]
[一句shell命令搞定代码行数统计]
皮皮blog
字符转换命令: tr, col, join, paste, expand
tr
tr 可以用来删除一段讯息当中的文字,或者是进行文字讯息的替换!
$ tr [-ds] SET1 ...
选项与参数:
-d :删除讯息当中的 SET1 这个字串;
-s :取代掉重复的字符!
范例一:将 last 输出的讯息中,所有的小写变成大写字符:
$ last tr '[a-z]' '[A-Z]'
# 事实上,没有加上单引号也是可以执行的,如:“ last | tr [a-z] [A-Z] ”
范例二:将 /etc/passwd 输出的讯息中,将冒号 (:) 删除
$ cat /etc/passwd | tr -d ':'
范例三:将 /etc/passwd 转存成 dos 断行到 /root/passwd 中,再将 ^M 符号删除
$ cp /etc/passwd ~/passwd && unix2dos ~/passwd
$ file /etc/passwd ~/passwd
/etc/passwd: ASCII text
/home/dmtsai/passwd: ASCII text, with CRLF line terminators <==就是 DOS 断行
$ cat ~/passwd | tr -d '\r' > ~/passwd.linux
# 那个 \r 指的是 DOS 的断行字符,关于更多的字符,请参考 man tr
$ ll /etc/passwd ~/passwd*
-rw-r--r--. 1 root root 2092 Jun 17 00:20 /etc/passwd
-rw-r--r--. 1 dmtsai dmtsai 2133 Jul 9 22:13 /home/dmtsai/passwd
-rw-rw-r--. 1 dmtsai dmtsai 2092 Jul 9 22:13 /home/dmtsai/passwd.linux
# 处理过后,发现文件大小与原本的 /etc/passwd 就一致了!
其实这个指令也可以写在“正则表达式”里头!因为他也是由正则表达式的方式来取代数据的! 以上面的例子来说,使用 [] 可以设置一串字呢!也常常用来取代文件中的怪异符号! 例如上面第三个例子当中,可以去除 DOS 文件留下来的 ^M 这个断行的符号!这东西相当的有用!相信处理 Linux & Windows 系统中的人们最麻烦的一件事就是这个事情啦!亦即是 DOS 下面会自动的在每行行尾加入 ^M 这个断行符号!这个时候除了以前讲过的 dos2unix 之外,我们也可以使用这个 tr 来将 ^M 去除! ^M 可以使用 \r 来代替之!
join
join 看字面上的意义 (加入/参加) 就可以知道,他是在处理两个文件之间的数据, 而且,主要是在处理“两个文件当中,有 "相同数据" 的那一行,才将他加在一起”的意思。
paste
linux中按列合并文件的命令。相对于 join 必须要比对两个文件的数据相关性, paste 就直接“将两行贴在一起,且中间以 [tab] 键隔开”而已!简单的使用方法:
$ paste [-d] file1 file2选项与参数:-d :后面可以接分隔字符。默认是以 [tab] 来分隔的!- :如果 file 部分写成 - ,表示来自 standard input 的数据的意思。
expand
将 [tab] 按键转成空白键$ expand [-t] file
选项与参数:-t :后面可以接数字。一般来说,一个 tab 按键可以用 8 个空白键取代。也可以自行定义一个 [tab] 按键代表多少个字符呢!
皮皮blog
参数代换: xargs
以字面上的意义来看, x 是加减乘除的乘号,args 则是 arguments (参数) 的意思,所以就是在产生某个指令的参数的意思! xargs 可以读入 stdin 的数据,并且以空白字符或断行字符作为分辨,将 stdin 的数据分隔成为 arguments 。 因为是以空白字符作为分隔,所以,如果有一些文件名或者是其他意义的名词内含有空白字符的时候, xargs 可能就会误判了~
$ xargs [-0epn] command选项与参数:
-0 :如果输入的 stdin 含有特殊字符,例如 `, \, 空白键等等字符时,这个 -0 参数可以将他还原成一般字符。这个参数可以用于特殊状态喔!If there are blank spaces or characters (including newlines) many commands will not work. This option take cares of file names with blank space.-e :这个是 EOF (end of file) 的意思。后面可以接一个字串,当 xargs 分析到这个字串时,就会停止继续工作!-p :在执行每个指令的 argument 时,都会询问使用者的意思;-n :后面接次数,每次 command 指令执行时,要使用几个参数的意思。
-I Replace occurrences of replace-str in the initial-arguments with names read from standard input. Also, unquoted blanks do not terminate input items; instead the separator is the newline character.当 xargs 后面没有接任何的指令时,默认是以 echo 来进行输出!
示例
find /usr/sbin -perm /7000 | xargs ls -l
$ find . -name "*.bak" -print0 | xargs -0 -I {} mv {} ~/old.files
出错:xargs: cat: terminated by signal 13
find . \( -name '*.pyc' -o -name '*.py' -type f \) -print | xargs cat
原因:
[[Linux]如果管道被接受方关闭]
可能的解决:
修改成find . -type f -exec grep "something" {} \; -quit
This is how it works:The -exec will work when the -type f will be true. And because grep returns 0 (success/true) when the -exec grep "something" has a match, the -quit will be triggered.
[bash find xargs grep only single occurence]
皮皮blog
减号 - 的用途
在管线命令当中,常常会使用到前一个指令的 stdout 作为这次的 stdin , 某些指令需要用到文件名称 (例如 tar) 来进行处理时,该 stdin 与 stdout 可以利用减号 "-" 来替代, 举例来说:
mkdir /tmp/homebacktar -cvf - /home | tar -xvf - -C /tmp/homeback
上面这个例子是说:“我将 /home 里面的文件给他打包,但打包的数据不是纪录到文件,而是传送到 stdout; 经过管线后,将 tar -cvf - /home 传送给后面的 tar -xvf - ”。后面的这个 - 则是取用前一个指令的 stdout, 因此,我们就不需要使用 filename 了!
皮皮blogfrom:http://blog.csdn.net/pipisorry/article/details/39760961
ref: 鸟哥的linux私房菜
- Linux命令:管线命令
- linux--管线命令
- Linux管线命令
- 管线命令
- Linux学习之十四、管线命令
- Linux笔记(8)--管线命令
- Linux基础--管道(管线命令)
- Linux管线命令之截取命令(cut,grep)
- Linux管线命令之排序命令(sort, wc, uniq)
- 管线命令 (pipe)
- Linux命令4(Linux命令重定向与管线命令)
- Linux基础07_管线命令与命名历史
- 【linux学习笔记】命令执行判断依据(';'、'&&'、'||')管线命令('|')以及cut、grep命令
- 第十一章 管线命令 (pipe)
- bash命令重定向和管线命令
- HWSoft命令使用说明(二)---管线绘制
- linux学习篇8--- shell,bash讲解 3 数据流重导向 与 管线命令
- linux鸟哥的私房菜读书笔记【管线命令(pipe)】
- 大端模式和小端模式
- 单词接龙(dfs)
- IDL编程小技巧
- ★★ZOJ 2342 KM算法+不等式
- MapReduce 编程 系列十一 Map阶段内部细节和调节参数
- Linux命令:管线命令
- Hunk FAILED ERROR when patch files
- 黑马程序员——oc核心语法1
- HDU 1005 Number Sequence
- 【Java.Web】Servlet —— 其他
- 树莓派使用WiringPi实现LED灯闪烁
- js 原型链
- WebCollector爬虫使用内置的Jsoup进行网页抽取
- 用css美化博客内容