linux命令之 cut awk sed grep 篇

AI权益加码!Claude Code、Cursor等20+工具免费用! 购周边限时加赠Coding Plan Lite,畅享主流AI工具!学习进阶更高效! 阅读详情

linux命令之sed, awk, grep, cut篇

用下来感觉这4个命令比较常用,功能也比较强大,等我有时间了要好好整理一下。

首先介绍一下cut,之前有文章已经讲过它的用法了,这次连带cut的死对头paste,一起拎出来讲讲。

第一篇 cut

常用参数:
-c 根据字符,用法:cut -cnum1-num2 filename 截取num1~num2之间的字符,字符从1开始记。
-f 根据域,默认为tab分隔
-d 定义域分隔符

范例:

shell> cat example 
test2 
this is test1 
shell> cut -c1-6 example ## print 开头算起前 6 个字元 
test2 
this i

-c m-n 表示显示每一行的第m个字元到第n个字元。例如:

---------file----------- 
liubi 23 14000 
---------file----------- 
# cut -c 1-5,10-14 file 
liubi 14000

-f m-n 表示显示第m栏到第n栏(使用tab分隔)。例如: 
---------file----------- 
liubi 23 14000 
---------file----------- 
# cut -f 1,3 file 
liubi 14000

-c 和 -f 参数可以跟以下子参数:
m 第m个字符或字段
m- 从第m个字符或字段到文件结束
m-n 从第m个到第n个字符或字段
-n 从第1个到第n个字符或字段

我们经常会遇到需要取出分字段的文件的某些特定字段,例如 /etc/password就是通过":"分隔各个字段的。可以通过cut命令来实现。例如,我们希望将系统账号名保存到

特定的文件,就可以:
cut -d: -f 1 /etc/passwd > /tmp/users
-d用来定义分隔符,默认为tab键,-f表示需要取得哪个字段
如:
使用|分隔 
cut -d'|' -f2 1.test>2.test 
使用:分隔 
cut -d':' -f2 1.test>2.test
这里使用单引号或双引号皆可。

对于特殊字符用\来转义(以“-”为分隔符切割后,要第一个字段):
BGIOSGA005099-TA
BGIOSGA005310-TA
cut -d\- -f 1 file >out
或者:cut -d"-" -f 1 file >out

cut的死对头:paste
paste file1 file2 >file3
把文件1与文件2按列合并(有没有发现跟cut正好相反呢?)
$ less 111
abc ddd eee
$ less 222
123 444 555

$ paste 111 222 >333
$ less 333
abc ddd eee     123 444 555
用-d参数可以自定义分隔符
$ paste -d: 111 222 >444
$ less 444
abc ddd eee:123 444 555

paste命令还有一个很有用的选项"-"。意即对每一个"-",从标准输入中读一次数据。-d参数来定义分隔符。以一个3列格式显示目录列表。方法如下:
$ ls |paste -d: - - -     #注意,"-"和"-"之间有空格
block_info_down_1000:block_info_down_3000:sv_test
block_info_up1000:block_info_up3000:module_indel_sv
module_test:old:regulation_region_down.pl
sample.Q20.down1000:sample.Q20.down3000:sample.Q20.up1000
sample.Q20.up3000:sample_to_9311.snp.Q20.filter.sort:sample_to_test

第二篇 awk
awk 用法:awk ' pattern {action} '

变量名 含义 
ARGC 命令行变元个数 
ARGV 命令行变元数组 
FILENAME 当前输入文件名 
FNR 当前文件中的记录号 
FS 输入域分隔符,默认为一个空格 
RS 输入记录分隔符 
NF 当前记录里域个数 
NR 到目前为止记录数 
OFS 输出域分隔符 
ORS 输出记录分隔符

用法介绍:
1,模式匹配
awk '/zqy/' fileA #寻找出fileA中含有zqy的行 等同于awk '$0~/zqy/' fileA
awk '$1~/88/' fileA #找出第一个域里面包含88的行
awk '$1~/88/{print $2}' fileA #找出第一个域里面包含88的行后,只打印该行的第二个域

2,对不同的域进行操作
awk '$2 >25 && $2<=55' fileA #找出第二个域里面满足条件的行,可以加上{print $n}来打印任意域
############### fileB #################
884     46      1       8       5       944
734     41      0       10      2       787
647     29      1       8       1       686
536     26      1       9       0       572
############### fileB #################
$ less fileB
884     46      1       8       5       944
734     41      0       10      2       787
647     29      1       8       1       686
536     26      1       9       0       572
$awk '{print NR,NF,$NF}' fileB # NR:文件当前记录号(在这里可以理解为行数); NF:总的域的个数(可以理解为列数); $NF:想一想是什么东西吧?再不知道就撞墙去吧。
1 6 944
2 6 787
3 6 686
4 6 572

3,通过-F参数来改变域分隔符,FS设置输入分隔符,OFS设置输出分隔符,awk所有操作都支持管道。如:
df | awk '$4>1000000 '          通过管道符获得输入,如:显示第4个域满足条件的行。 
awk -F "|" '{print $1}' file 按照新的分隔符“|”进行操作。
awk 'BEGIN { FS="[: \t|]"}{print $1,$2,$3}' file 通过设置输入分隔符(FS="[: \t|]")修改输入分隔符。BEGIN 表示在处理任意行之前进行的操作。
awk 'BEGIN { OFS="%"} {print $1,$2,$3}' file 通过设置输出分隔符(OFS="%")修改输出格式。 
Sep="|" 
awk -F $Sep '{print $1}' file 按照环境变量Sep的值做为分隔符。    
awk -F '[ :\t|]' '{print $1}' file 按照正则表达式的值做为分隔符,这里代表空格、:、TAB、|同时做为分隔符。 
awk -F '[][]' '{print $1}' file 按照正则表达式的值做为分隔符,这里代表[、]

4、
awk -f awkfile file 通过文件awkfile的内容依次进行控制。 
cat awkfile 
/101/{print "\047 Hello! \047"} --遇到匹配行以后打印 ' Hello! '.\047代表单引号。 
{print $1,$2}                    --因为没有模式控制,打印每一行的前两个域。

5、
awk 'BEGIN { max=100 ;print "max=" max} {max=($1 >max ?$1:max); print $1,"Now max is "max}' file 取得文件第一个域的最大值。 
awk '{print ($1>4 ? "high "$1: "low "$1)}' file

6、
awk '{$1 == 'Chi' {$3 = 'China'; print}' file 找到匹配行后先将第3个域替换后再显示该行(记录)。 
awk '{$7 %= 3; print $7}' file 将第7域被3除,并将余数赋给第7域再打印。

7、
awk '/tom/ {wage=$2+$3; printf wage}' file 找到匹配行后为变量wage赋值并打印该变量。

8、
awk '/tom/ {count++;} END {print "tom was found "count" times"}' file #END表示在所有输入行处理完后进行处理。

9、awk 'gsub(/\$/,"");gsub(/,/,""); cost+=$4;END {print "The total is $" cost>"filename"}' file   gsub函数用空串替换$和,再将结果输出到filename中。 
     1 2 3 $1,200.00 
     1 2 3 $2,300.00 
     1 2 3 $4,000.00

     awk '{gsub(/\$/,"");gsub(/,/,""); 
     if ($4>1000&&$4<2000) c1+=$4; 
     else if ($4>2000&&$4<3000) c2+=$4; 
     else if ($4>3000&&$4<4000) c3+=$4; 
     else c4+=$4; } 
     END {printf   "c1=[%d];c2=[%d];c3=[%d];c4=[%d]\n",c1,c2,c3,c4}"' file 
     通过if和else if完成条件语句

     awk '{gsub(/\$/,"");gsub(/,/,""); 
     if ($4>3000&&$4<4000) exit; 
     else c4+=$4; } 
     END {printf   "c1=[%d];c2=[%d];c3=[%d];c4=[%d]\n",c1,c2,c3,c4}"' file 
     通过exit在某条件时退出,但是仍执行END操作。 
     awk '{gsub(/\$/,"");gsub(/,/,""); 
     if ($4>3000) next; 
     else c4+=$4; } 
     END {printf   "c4=[%d]\n",c4}"' file 
     通过next在某条件时跳过该行,对下一行执行操作。


10、awk '{ print FILENAME,$0 }' file1 file2 file3>fileall 把file1、file2、file3的文件内容全部写到fileall中,并前置文件名。

11、awk ' $1!=previous { close(previous); previous=$1 } {print substr($0,index($0," ") +1)>$1}' fileall 把合并后的文件重新分拆为3个文件。并与原文件一致。

12、awk 'BEGIN {"date"|getline d; print d}'          通过管道把date的执行结果送给getline,并赋给变量d,然后打印。

13、awk 'BEGIN {system("echo \"Input your name:\\c\""); getline d;print "\nYour name is",d,"\b!\n"}' 
     通过getline命令交互输入name,并显示出来。 
     awk 'BEGIN {FS=":"; while(getline< "/etc/passwd" >0) { if($1~"050[0-9]_") print $1}}' 
     打印/etc/passwd文件中用户名包含050x_的用户名。

14、awk '{ i=1;while(i<NF) {print NF,$i;i++}}' file 通过while语句实现循环。 
     awk '{ for(i=1;i<NF;i++) {print NF,$i}}'    file 通过for语句实现循环。     
     type file|awk -F "/" ' 
     { for(i=1;i<NF;i++) 
     { if(i==NF-1) { printf "%s",$i } 
     else { printf "%s/",$i } }}'                显示一个文件的全路径。 
     用for和if显示日期 
     awk   'BEGIN { 
for(j=1;j<=12;j++) 
{ flag=0; 
   printf "\n%d月份\n",j; 
         for(i=1;i<=31;i++) 
         { 
         if (j==2&&i>28) flag=1; 
         if ((j==4||j==6||j==9||j==11)&&i>30) flag=1; 
         if (flag==0) {printf "%02d%02d ",j,i} 
         } 

}'

15、在awk中调用系统变量必须用单引号,如果是双引号,则表示字符串 
Flag=abcd 
awk '{print '$Flag'}'    结果为abcd 
awk '{print   "$Flag"}'    结果为$Flag

Linux_Shell脚本学习第四章-让文本飞(上) 一、使用正则表达式 1.1 正则表达式的规则 1.1.1 位置标记 **位置标记锚点(position marker anchor)是标识字符串位置的正则表达式。**默认情况下,正 则表达式所匹配的字符可以出现在字符串中任何位置,如下图。 1.1.2 标识符 标识符是正则表达式的基础组成部分。它定义了那些为了匹配正则表达式,必须存在(或不 存在)的字符,如下图。 1.1.3 数量修饰符 一个标... 阅读详情

相关推荐

LinuxLinux Shell 编程一些笔记

本章是整理我2017年的笔记,很久了,现在都2024年了,想把笔记整理一下,然后删除老的文档。

九师兄 166

linux利器 sed, awk, grep, cut,pstree、ps、pstack

来源:http://blog.csdn.net/lilib/archive/2010/04/15/5487165.aspx 第一 cut常用参数:-c 根据字符,用法:cut -cnum1-num2 filename 截取num1~num2之间的字符,字符从1开始记。-f 根据域,默认为tab分隔-d 定义域分隔符范例:shell> cat exa

xymyeah 1544

Shell编程-字符截取命令-cut printf awk sed 命令

详细介绍了Shell编程中字符截取命令-cut printf awk sed。每一步都有详细操作演示,并附有截图。适合初学者。

LinuxTips-cutawk的比较

例如获取所有包含python的进程的命令行 多的所有进程的详细列表: ps -ef 使用grep查找包含的行且去除grep进程本身: grep -v grep | grep python 1) 使用cut ps -ef | cut -f8 上面的命令不能正常的工作,因为cut默认是以TAB来分隔多个列的,但是ps的输出是以多个空格分隔的,并不是以TAB来分隔的,所以需要使用...

weixin_30588827的博客 130

linux命令---cutawk的用法

问题:获取ip地址的命令,只输出ip地址 ip addr|grep 'inet'|awk '{print $2}'|cut -d/ -f1

limenghao2002的博客 678

linuxcut -c命令,Linuxcut命令的使用

CUT可以对file(或stdin或pipe)的每行抽取出希望抽取的部分extract(cut out) selected fields of each line of a file.【用法】cut -bLIST [-n] [file]cut -cLIST [file]cut -fLIST [-dDELIM] [-s] [--output-delimiter=STRING] [file]LISTL...

weixin_33427476的博客 6425

linux ps cut,linux按列分割cut

linux按列分割cut按列获取数据,例如ps命令中,我想获取UID这一列。使用ps | cut -c 44-47便可以。Shell代码$ psPID PPID PGID WINPID TTY UID STIME COMMAND5204 1 5204 5204 con 500 11:53:47 /bin/sh4716 5204 ...

weixin_39942335的博客 964

linuxcut函数,linux命令sedawkgrepcut

linux命令sed, awk, grep, cut用下来感觉这4个命令比较常用,功能也比较强大,等我有时间了要好好整理一下。首先介绍一下cut,之前有文章已经讲过它的用法了,这次连带cut的死对头paste,一起拎出来讲讲。第一 cut常用参数:-c 根据字符,用法:cut -cnum1-num2 filename 截取num1~num2之间的字符,字符从1开始记。-f 根据域,默认为ta...

weixin_39636411的博客 481

linuxcut函数,linux命令sed,?awk,?grep,?cut

linux命令sed, awk, grep, cut用下来感觉这4个命令比较常用,功能也比较强大,等我有时间了要好好整理一下。首先介绍一下cut,之前有文章已经讲过它的用法了,这次连带cut的死对头paste,一起拎出来讲讲。第一 cut常用参数:-c 根据字符,用法:cut -cnum1-num2 filename 截取num1~num2之间的字符,字符从1开始记。-f 根据域,默认为ta...

weixin_31699893的博客 471

linux命令sed,awk,grep,cut

linux命令sed,awk,grep,cut 懒得贴了,

u012327100的专栏 530

linux命令sed, awk, grep, cut

linux命令sed, awk, grep, cut用下来感觉这4个命令比较常用,功能也比较强大,等我有时间了要好好整理一下。首先介绍一下cut,之前有文章已经讲过它的用法了,这次连带cut的死对头paste,一起拎出来讲讲。第一 cut常用参数: -c 根据字符,用法:cut -cnum1-num2 filename 截取num1~num2之间的字符,字符从1开始记。 -f 根据域

qq_21193587的博客 591

再转一linux命令sed, awk, grep, cut

linux命令sed, awk, grep, cut 用下来感觉这4个命令比较常用,功能也比较强大,等我有时间了要好好整理一下。 首先介绍一下cut,之前有文章已经讲过它的用法了,这次连带cut的死对头paste,一起拎出来讲讲。 第一 cut 常用参数: -c 根据字符,用法:cut -cnum1-num2 filename 截取num1~num2之间的字符,字符

651

Linux 常见的文本输出命令

博客将介绍egrepawksed等文本编辑命令。 nl:类似于cat命令,但是自带行号,并且空行不在会计算到行中 命令选项 介绍 nl -b 指定行号指定的方式,主要有两种 nl -b a 表示无论是否为空行,也同样列出行号(类似 cat -n) nl -b t 表示有空行,空的那一行不要列出行号(默认值) nl -n 列出行号表示的方法,主要有三种 nl -n ln 行号在萤幕的最左方显示 nl -n rn 行号在自己栏位的最右方显示,且不加 0 nl -n

MrChen666的博客 3513

Linux】常用的命令

一 系统相关 1. 查看并发数 2. ping 3. telnet 4. netstat查询网络状态 5. nslookup域名解析命令 四 网络相关 1. grep 2. awk文本处理和报表生成 3. sed ⑴新增 ⑵删除 ⑶修改 ⑷查询 ⑸操作多行 ⑹修改源文件 4. cut提取列 5. cat 6. more 7. less 7. vim相关

望舒的博客 382

Linux 的 shell 编程

Linux 的shell 编程 -记住三个命令的运用形式 grep ‘字符’ 文件 sed命令’ 文件 awk ‘条件{命令}’ 文件 -死记一点,单引号内就是正则表达式的用法 1.grep 及正则查询 2.cut 操作 2.1 cut 查看 2.2 cut [选项] 文件名 选项: -f 列号 :提取第几列 -d 分隔符 :按照指定分隔符分...

weixin_43646034的博客 403

Linux学习笔记----基础部分-----3,文本处理(find、grep、xargs、sort、uniq、tr、cut、paste、wc、sedawk)

自我总结 + 优秀摘录 本节将介绍Linux下使用Shell处理文本时最常用的工具: find、grep、xargs、sort、uniq、tr、cut、paste、wc、sedawk。 1,find文件查找 查找txt和pdf文件 find .\(-name ".txt" -o -name "*.pdf"\) -print 正则方式 find . -regex ".*\(\...

SmallBottle-CGWLMX的博客 291

linux+top写日志,Linux:日志那些命令

这里都是Linux那些命令1、sed:2、awk:3、printf:4、sort5、cut:# linux 下 取进程占用 cpu 最高的前10个进程ps aux|head -1;ps aux|grep -v PID|sort -rn -k +3|head# linux 下 取进程占用内存(MEM)最高的前10个进程ps aux|head -1;ps aux|grep -v PID|sort -r...

weixin_29323049的博客 666
上一篇: char*,const char*和string的相互转换
下一篇: Linux expect
zhoucy163
博客等级 码龄16年 67粉丝 78原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值