4、linux-grep awk sed and cuf sort uniq join
1、grep
1、1 grep [-invc] [--color=auto] '搜寻字符串' filename
选项与参数:
-i :忽略大小写的不同
-n :顺便输出行号
-v :显示没有 '搜寻字符串' 的行
--color=auto :将找到的部分加上颜
-c :统计比配的行数
-w : 仅完全匹配字词
-o : 只输出匹配的内容
-A2:匹配的行以及其下面的2行
-B2:匹配的行以及其上面的2行
-C2:匹配的行以及其上下面的2行
例1:less file1 |cut -f 1 |xargs -i echo grep -v -A1 -w {} file2|sh ##剔除不要的fa文件的ID和序列
例2:grep -P -o 'ID=id(\d);' GCF_000151425.1_ASM15142v1_genomic.gff|le ##提取基因ID
例3:grep
-F -f
grep
-F -f A B |
tee
both.txt |
wc
-l
grep
-F -f A -
v
B |
tee
onlyB.txt |
wc
-l
grep
-F -f B -
v
A |
tee
onlyA.txt |
wc
-l
grep -n '^$' file #空白行grep [^ \\t\\n]
特殊字符
符号 含义 举例
^ 开始标记 "^abc"满足的例子abc、abcd
^ 非(在[]内) "[^abc]"满足的例子:ddd、mpd
$ 结束标记 ”abc$”满足的例子abc、mmabc
. 任意字符 "a.c"满足的例子abc、fapcc
\< 匹配单词开始 "\<abc"满足的例子abc、abcd
\> 匹配单词结束 "abc\>"满足的例子abc、pmrabc
| 或 "AAA|BBB"满足的例子AAA、BBBpp
范围字符
符号 含义 举例
? 匹配前一个字符0或1次 "abc?"满足的例子ab、mabcd
* 匹配前一个字符≥0次 "abc*"满足的例子abbb、abcdk
+ 匹配前一个字符≥1次 "abc+"满足的例子abcd、abcccdd
{} {m}、{m,n}、{m,}、{,n}分别为匹配前一个字符m次、m到n次、≥m次、≤n次 "abc\{3,5\} "满足的例子abcccc、abcccccc
[] []内如果不是范围,选其一;是范围的话,范围内选其一 "m[abc]p"满足的例子acpd;m[1-9]p满足的例子m8pp
() 将候选的所有元素放在()内,用|隔开 "a(1|2|3)bc"满足的例子a1bc、mba3bcd
注意:{}在正则表达式中需要转义,而[]()不需要。
注意理解{}范围的例子:
在Linux的grep命令中如何使用OR,AND,NOT操作符呢?
Grep OR 操作符
1.使用 \| 如果不使用grep命令的任何选项,可以通过使用 '\|' 来分割多个pattern,以此实现OR的操作。
grep 'pattern1\|pattern2' filename
2.使用选项 -E grep -E 选项可以用来扩展选项为正则表达式。 如果使用了grep 命令的选项-E,则应该使用 | 来分割多个pattern,以此实现OR操作。
grep -E 'pattern1|pattern2' filename
3.使用 egrep egrep 命令等同于‘grep -E’。因此,使用egrep (不带任何选项)命令,以此根据分割的多个Pattern来实现OR操作.
egrep 'pattern1|pattern2' filename
4、使用选项 -e 使用grep -e 选项,只能传递一个参数。在单条命令中使用多个 -e 选项,得到多个pattern,以此实现OR操作。
grep -e pattern1 -e pattern2 filename
Grep AND 操作
1.使用 -E 'pattern1.*pattern2' grep命令本身不提供AND功能。使用 -E 选项可以实现AND操作。
grep -E 'pattern1.*pattern2' filename
grep -E 'pattern1.*pattern2|pattern2.*pattern1' filename
2.使用多个grep命令 可以使用多个 grep 命令 ,由管道符分割,以此来实现 AND 语义。
grep -E 'pattern1' filename | grep -E 'pattern2'
Grep NOT操作
1.使用选项 grep -v 使用 grep -v 可以实现 NOT 操作。 -v 选项用来实现反选匹配的( invert match)。如,可匹配得到除下指定pattern外的所有lines。
grep -v 'pattern1' filename
2、awk
awk '{pattern + action}' {filenames}
awk [-F field-separator] 'commands' input-file(s)
[-F 域分隔符] :是可选的;
commands :是真正awk命令;
input-file(s) :是待处理的文件; awk工作流程:读入有'\n'换行符分割的一条记录,然后将记录按指定的域分隔符划分域,填充域,$0则表示所有域,$1表示第一个域,$n表示第n个域,
在不指名-F域分隔符的情况下,默认域分隔符是"空白键" 或 "[tab]键" 例子
cat /etc/passwd |awk -F ':' '{print $1}' #这种是awk+action的示例,每行都会执行action{print $1}。
awk -F: '/root/' /etc/passwd #这种是awk+pattern的示例,匹配了pattern的行才会执行action(没有指定action,默认输出每行的内容)。
awk -F: '$1~/root/' /etc/passwd
cat /etc/passwd |awk -F ':' 'BEGIN {print "name,shell"} {print $1","$7} END {print "blue,/bin/nosh"}'
#先执行BEGING,然后读取文件,读入有/n换行符分割的一条记录,然后将记录按指定的域分隔符划分域,填充域,随后开始执行模式所对应的动作action。读入第二条记录·····,最后执行END操作。
awk内置变量
ARGC 命令行参数个数
ARGV 命令行参数排列
ARGIND 命令行参数的索引 AWK 'ARGIND==1{f1[$1]=$2}ARGIND==2{if($1 in f1){print $0}}' file1 file2 a[$0]=a[$0]""\t
ENVIRON 支持队列中系统环境变量的使用
FILENAME awk浏览的文件名
FNR 浏览文件的记录数 \
F选项 NF 浏览记录的域的个数
NR 行数(记录数)
OFS 输出域分隔符
ORS 输出记录分隔符
RS 控制记录分隔符
awk编程
变量和赋值
除了awk的内置变量,awk还可以自定义变量。
awk '{count++;print $0;} END{print "user count is ", count}' /etc/passwd
count是自定义变量。之前的action{}里都是只有一个print,其实print只是一个语句,而action{}可以有多个语句,以;号隔开。
这里没有初始化count,虽然默认是0,但是妥当的做法还是初始化为0:
awk 'BEGIN {count=0;print "[start]user count is ", count} {count=count+1;print $0;} END{print "[end]user count is ", count}' /etc/passwd
条件语句
ls -l |awk 'BEGIN {size=0;print "[start]size is ", size} {if($5!=4096){size=size+$5;}} END{print "[end]size is ", size/1024/1024,"M"}'
数组
awk -F ':' 'BEGIN {count=0;} {name[count] = $1;count++;}; END{for (i = 0; i < NR; i++) print i, name[i]}' /etc/passwd
awk编程的内容极多,这里只罗列简单常用的用法,更多请参考http://www.gnu.org/software/gawk/manual/gawk.html
3、sed
打印:
sed -n '2p' file #('2,4' '1,$' '/aa/')
删除:
sed '2d' file #('2,4' '1,$' '/aa/')
替换、调换、增加、删除
sed '1,7s/aa/bb/g' file #('s/aa/bb/g')
sed 's/\(abc\)\(ABC\)/\2\1/g' file
sed 's/^.*$/122&/g file
sed 's/aa//g'
4、cut
cut -d'分隔字符' -f fields <==用于有特定分隔字符
cut -c 字符区间 <==用于排列整齐的信息
选项与参数:
-d :后面接分隔字符;默认的分割符是tab键,空格的表示是-d ' '
-f :依据 -d 的分隔字符将一段信息分割成为数段,用 -f 取出第几段的意思;
-c :以字符 (characters) 的单位取出固定字符区间;
cut -d ':' -f 3,5 #提出第3列与第5列 cut -c1-4 #提出第1到第4个字符
cut -d ':' -f 3,5-7 #提出第3列,第5列到第7列 cut -d ':' -f 5- #提出第5列到最后一列
5、sort
sort [-fbMnrtuk] [file or stdin]
选项与参数:
-f :忽略大小写的差异,例如 A 与 a 视为编码相同;
-b :忽略最前面的空格符部分;
-M :以月份的名字来排序,例如 JAN, DEC 等等的排序方法;
-n :使用『纯数字』进行排序(默认是以文字型态来排序的);
-r :反向排序;
-u :就是 uniq ,相同的数据中,仅出现一行代表;
-t :分隔符,默认是用 [tab] 键来分隔;
-k :以那个区间 (field) 来进行排序的意思
cat /etc/passwd | sort -t ':' -k1,1 -k2,2nr #以 : 分隔,第一列字符升序,第二列按照数字降序排列
cat /etc/passwd | sort -t ':' -k 3n #默认以字符串来排序,如果想要使用数字排要加(n);
cat /etc/passwd | sort -t ':' -k 3nr #默认是升序,要倒序排序(r);
cat /etc/passwd | sort -t':' -k 6.2,6.4 -k 1r #以第六个域的第2个字符到第4个字符进行正向排序,再基于第一个域进行反向排序
6、uniq
uniq [-cu]
选项与参数:
-d :只显示重复的行;
-c :进行计数,第一列是计数列,第二列是原始列
-u :只显示唯一的行
cat words | sort |uniq #去除重复
sort testfile | uniq -c #只显示没类重复次数
sort testfile | uniq -uc #只显示没重复的行
sort testfile | uniq -dc #只显示有重复的行(前面显示重复的次数)
整理uniq -c的结果,第二列是计数列,第一列是原始列
例子:sort file | uniq -c | awk 'BEGIN{OFS="\t"}{print $2,$1}' sort file | uniq -c | perl -lane 'print "@F[1]\t@F[0]"'
7、join
join [-i][-a<1或2>][-e<字符串>][-o<格式>][-t<字符>][-v<1或2>][-1<栏位>][-2<栏位>][--help][--version][文件1][文件2]
转载:http://jjuanxi.blog.163.com/blog/static/17527419720121954756361/
功能说明:将两个文件中,指定栏位内容相同的行连接起来。 补充说明:找出两个文件中,指定栏位内容相同的行,并加以合并,再输出到标准输出设备。 -a FILENUM:除了显示匹配好的行另外将指定序号(1或2)文件中部匹配的行显示出来
-e EMPTY:将需要显示但是文件中不存在的域用此选项指定的字符代替
-i :忽略大小写
-j FIELD :等同于 -1 FIELD -2 FIELD,-j指定一个域作为匹配字段
-o FORMAT:以指定格式输出
-t CHAR :以指定字符作为输入输出的分隔符
join 默认以空白字符做分隔符(空格和\t),可以使用 join -t $'\t'来指定使用tab做分隔符
-v FILENUM:与-a相似 但值显示文件中没匹配上的行
-1 FIELD:以file1中FIELD字段进行匹配
-2 FIELD:以file2中FIELD字段进行匹配
--help :打印命令帮助文件
例子:
文件 file1.txt
aa 1 2
bb 2 3
cc 4 6
dd 3 3
文件file2.txt
aa 2 1
bb 8 2
ff 2 4
cc 4 4
dd 5 5
3. join -1 2 -2 3 file1.txt file2.txt
输出: 1 aa 2 aa 2
2 bb 3 bb 8
4 cc 6 ff 2
4 cc 6 cc 4
以第一个文件的第二列和第二个文件的第三列做匹配字段。由于第二个文件中第三列的两个3 都与第一个文件中第三行因此输出
4 cc 6 ff 2
4 cc 6 cc 4
4 join -o 1.1 -o 1.2 -o 1.3 -o 2.1 -o 2.2 -o 2.3 -e 'empty' -a 1 file1.txt file2.txt
输出: aa 1 2 aa 2 1
bb 2 3 bb 8 2
cc 4 6 empty empty empty
dd 3 3 empty empty empty
-o 指定 将file1的1,2,3列,file2的1,2,3 列都输出。-a指定将file1中不匹配的行也输出,但是file2中没有与file1后两行对应的字段,因此使用empty补齐。 6. join 标准输入
有时我们需要将多个格式相同的文件join到一起,而join接受的是两个文件的指令,此时我们可以使用管道和字符“-"来实现
join file1 file2 | join - file3 | join - file4
这样就可以将四个文件 连接到 一起了。
8、paste
paste格式为:
paste -d -s -file1 file2
选项含义如下:
-d 指定不同于空格或tab键的域分隔符。例如用@分隔域,使用- d @。
-s 将每个文件合并成行而不是按行粘贴。
- 使用标准输入。例如ls -l |paste ,意即只在一列上显示输出。(这个参数的解释是网上找来的,但从后面的例子来看,应该是对输出的列进行设置。)
例1 、paste -d: pas2 pas1
P.Jones:ID897
S.Round:ID666
L.Clip:ID982 例2、paste -s pas1 pas2 ##要合并两行,而不是按行粘贴,可以使用-s选项。下面的例子中,第一行粘贴为ID号,第二行是名字。
ID897 ID666 ID982
P.Jones S.Round L.Clip
例3、ls /etc | paste -d" " - - - - - -
paste命令还有一个很有用的选项(-)。意即对每一个(-),从标准输入中读一次数据。使用空格作域分隔符,以一个6列格式显示目录列表。
4、linux-grep awk sed and cuf sort uniq join的更多相关文章
- 【转】如何利用多核CPU来加速你的Linux命令 — awk, sed, bzip2, grep, wc等
如何利用多核CPU来加速你的Linux命令 — awk, sed, bzip2, grep, wc等 你是否曾经有过要计算一个非常大的数据(几百GB)的需求?或在里面搜索,或其它操作——一些无法并 ...
- Linux查找命令:grep,awk,sed
grep grep (global search regular expression(RE) and print out the line,全面搜索正则表达式并把行打印出来)是一种强大的文本搜索工具 ...
- Linux 三剑客 -- awk sed grep
本文由本人收集整理自互联网供自己与网友参考,参考文章均已列出,如有侵权,请告知! 顶配awk,中配sed,标配grep awk 参考 sed 参考 grep 参考 在线查看linux命令速记表 app ...
- <转>如何利用多核CPU来加速你的Linux命令 — awk, sed, bzip2, grep, wc等
原文链接:http://www.vaikan.com/use-multiple-cpu-cores-with-your-linux-commands/ 你是否曾经有过要计算一个非常大的数据(几百GB) ...
- 转摘--如何利用多核CPU来加速你的Linux命令 — awk, sed, bzip2, grep, wc等
http://www.vaikan.com/use-multiple-cpu-cores-with-your-linux-commands/ 你是否曾经有过要计算一个非常大的数据(几百GB)的需求?或 ...
- 如何利用多核CPU来加速你的Linux命令 — awk, sed, bzip2, grep, wc等(转)
你是否曾经有过要计算一个非常大的数据(几百GB)的需求?或在里面搜索,或其它操作——一些无法并行的操作.数据专家们,我是在对你们说.你可能有一个4核或更多核的CPU,但我们合适的工具,例如 grep, ...
- 【Linux】linux中文本操作利器grep,awk,sed
grep命令 grep(global search regular expression)是一种强大的文本搜索工具,它可以使用正则表达式搜索文本,并把匹配的行打印出来.平时搜索文本中内容的时候是非常方 ...
- Linux三剑客-grep || awk || sed
grep是一个强大的文本搜索工具 命令格式: grep [option] pattren file -a 将二进制文档以文本方式处理 -c 计算找到的符合行的次数 -i 忽略大小写 -n 顺便 ...
- [linux] grep awk sort uniq学习
grep的-A-B-选项详解grep能找出带有关键字的行,但是工作中有时需要找出该行前后的行,下面是解释1. grep -A1 keyword filename找出filename中带有keyword ...
随机推荐
- Spring层面的事务管理
事务管理方式 1. 编程式事务管理 2. 声明式事务管理 建立于AOP之上,对指定的方法执行前后进行拦截,即在方法执行前开始或加入一个事务,执行完毕后根据结果提交或回滚事务. 方式: a. 配置文件中 ...
- 动态顺序表(C++实现)
顺序表是在计算机内存中以数组的形式保存的线性表,是指用一组地址连续的存储单元依次存储数据元素的线性结构. 这样的存储方式使得线性表逻辑上相邻的元素,其在物理存储单元中也是相邻的.只要知道了第一个元素的 ...
- 字典树 HDU 1251 统计难题
;} 之前写的#include<iostream> #include<algorithm> #include<stdio.h> using namespace st ...
- redis主从架构及redis集群
https://redis.io/topics/cluster-spec Redis Cluster does not support multiple databases like the stan ...
- min/max优化,count ,group by
min/max优化 在表中,一般都是经过优化的. 如下地区表 id area pid 1 中国 0 2 北京 1 ... 3115 3113 我们查min(id), id是主键,查Min(id)非常快 ...
- Delphi UniDAC 通过http协议连接数据库的设置
Connection through HTTP tunnel(using http protocol) Sometimes client machines are shielded by a fire ...
- 每个程序员都应该了解的 CPU 高速缓存
每个程序员都应该了解的 CPU 高速缓存 英文原文:Memory part 2: CPU caches 来源:oschina [编者按:这是Ulrich Drepper写“程序员都该知道存储器”的第二 ...
- AdobeFlashPlayer.资料
1.chrome 设置 chrome-->设置-->高级-->内容设置-->Flash 2. 3. 4. 5.
- Mysql备份和还原(命令)
1.备份方法一 ①.进入数据库 mysql -uroot -p pwd; ②.查看数据库 show databases; ③.备份数据库 mysqldump -hlocalhost -uroot(用户 ...
- do-while-zero 结构在宏定义中的应用
do while 语句在使用宏定义时是一个有用的技巧,说明如下: 假设有这样一个宏定义 #define macro(condition) / if(condition) dosomething() 现 ...