1.2.1 cut命令

cut命令可以从一个文本文件或者文本流中提取文本列。

cut语法

[root@www ~]# cut -d'分隔字符' -f fields    ## 用于有特定分隔字符

[root@www ~]# cut -c 字符区间            ## 用于排列整齐的信息

选项与参数:

-d:后面接分隔字符。与 -f 一起使用;

-f:依据 -d 的分隔字符将一段信息分割成为数段,用 -f 取出第几段的意思;

-c:以字符 (characters) 的单位取出固定字符区间;

PATH 变量如下

[root@www ~]#echo $PATH

 /bin:/usr/bin:/sbin:/usr/sbin:/usr/local/bin:/usr/X11R6/bin:/usr/games

# 1 | 2       | 3  | 4       | 5            | 6            | 7

将 PATH 变量取出,找出第五个路径。

# echo $PATH |cut -d':' -f 5

/usr/local/bin

将 PATH 变量取出,找出第三和第五个路径。

#echo $PATH |cut -d ':' -f 3,5

/sbin:/usr/local/bin

将 PATH 变量取出,找出第三到最后一个路径。

echo $PATH | cut-d ':' -f 3-

/sbin:/usr/sbin:/usr/local/bin:/usr/X11R6/bin:/usr/games

将 PATH 变量取出,找出第一到第三个路径。

#echo $PATH |cut -d ':' -f 1-3

/bin:/usr/bin:/sbin:

将 PATH 变量取出,找出第一到第三,还有第五个路径。

#echo $PATH |cut -d ':' -f 1-3,5

/bin:/usr/bin:/sbin:/usr/local/bin

实用例子:只显示/etc/passwd的用户和shell

#cat /etc/passwd| cut -d ':' -f 1,7

root:/bin/bash

daemon:/bin/sh

bin:/bin/sh

1.2.2 sed命令

注意测试下面的命令的时候不要用系统的文件,不要用/etc/passwd等

准备的文件名是:test.txt文件,文件内容如下:

1    zhangsan    test    http://www.baidu.com    2015-12-31

2    lisi    add    https://www.jd.com    2016-03-20

3    wangwu    test    http://v.hao123.com/dianshi    2017-01-01

4    zhaoliu    goshopping10    http://v.hao123.com/dianshi    2017-01-01

192.168.0.1    zhao10    goshopping    http://v.hao123.com/dianshi    2017-01-01

6    qian   10test    http://v.hao123.com/dianshi    2017-01-01

192.168.0.1    sun    goshopping    http://v.hao123.com/dianshi    2017-01-01

8    li    loveable    http://v.hao123.com/dianshi    2017-01-01

9    zhou    test    http://v.hao123.com/dianshi    2017-01-01

test    wu    goshopping    http://v.hao123.com/dianshi    2017-01-01

12    zheng    10goshopping10    http://v.hao123.com/dianshi    2017-01-01

192.168.0.1    check    gotest    http://v.hao123.com/dianshi    2017-01-01

14    feng    loveable    http://v.hao123.com/dianshi    2017-01-01

15    chen    loveable    http://v.hao123.com/dianshi    2017-01-01

16    chu    loveable    http://v.hao123.com/dianshi    2017-01-01

192.168.0.1    wei    goshopping    http://v.hao123.com/dianshi    2017-01-01

18    jiang    gotestpping    http://v.hao123.com/dianshi    2017-01-01

19    shen    check    http://v.hao123.com/dianshi    2017-01-01

20    han    goshopping    http://v.hao123.com/dianshi    2017-01-01

192.168.0.1    yang    goshopping    http://v.hao123.com/dianshi    2017-01-01

192.168.0.1    zhu    testing    http://v.hao123.com/dianshi    2017-01-01

23    qin    goshopping    http://v.hao123.com/dianshi    2017-01-01

24    you    test    http://v.hao123.com/dianshi    2017-01-01

test    xu    goshopping    http://v.hao123.com/dianshi    2017-01-01

26    he    goshopping    http://v.hao123.com/dianshi    2017-01-01

1/ 删除:d命令

$ sed '2d' test.txt                  -----删除example文件的第二行。

$ sed '2,$d' test.txt               -----删除example文件的第二行到末尾所有行。

$ sed '$d' test.txt                       -----删除example文件的最后一行。

$ sed '/test/'d test.txt         -----删除example文件所有包含test的行。

2/ 替换:s命令

$ sed's/test/mytest/g' test.txt

## 在整行范围内把test替换为mytest。如果没有g标记,则只有每行第一个匹配的test被替换成mytest。

$ sed-n 's/^test/mytest/p' test.txt

## (-n)选项和p标志一起使用表示只打印那些发生替换的行。也就是说,如果某一行开头的test被替换成mytest,就打印它。

$ sed's/^192.168.0.1/&localhost/' test.txt

## &符号表示追加一个串到找到的串后。所有以192.168.0.1开头的行都会被替换成它自已加 localhost,变成192.168.0.1localhost。

$ sed -n's/\(love\)able/\1rs/p' test.txt

## love被标记为1,所有loveable会被替换成lovers,而且替换的行会被打印出来。

$ sed's#10#100#g' test.txt

## 不论什么字符,紧跟着s命令的都被认为是新的分隔符,所以,“#”在这里是分隔符,代替了默认的“/”分隔符。表示把所有10替换成100。

选定行的范围:逗号

$ sed -n'/test/,/check/p' test.txt

## 所有在模板test和check所确定的范围内的行都被打印。

$ sed -n'5,/^test/p' test.txt

## 打印从第五行开始到第一个包含以test开始的行之间的所有行。

$ sed'/test/,/check/s/$/sed test/' test.txt

## 对于模板test和west之间的行,每行的末尾用字符串sed test替换。

多点编辑:e命令

$ sed -e '15,25d'-e 's/test/check/' test.txt

## (-e)选项允许在同一行里执行多条命令。如例子所示,第一条命令删除15至25行,第二条命令用check替换test。命令的执行顺序对结果有影响。如果两个命令都是替换命令,那么第一个替换命令将影响第二个替换命令的结果。

$ sed--expression='s/test/check/' --expression='/love/d' test.txt

## 一个比-e更好的命令是--expression。它能给sed表达式赋值。(通过上面的命令将所有的test替换成龙check,将所有的带有love的行删除掉了)

3/ 从文件读入:r命令

$ sed '/test/rfile' test.txt

-----file里的内容被读进来,显示在与test匹配的行下面,如果匹配多行,则file的内容将显示在所有匹配行的下面。

4/ 写入文件:w命令

$ sed -n'/test/w file' test.txt

-----在example中所有包含test的行都被写入file里。

5/ 追加命令:a命令

$ sed'/^test/a\\--->this is a example' test.txt

## '--->this is a example'被追加到以test开头的行后面,sed要求命令a后面有一个反斜杠。

6/ 插入:i命令

$ sed '/test/i\\some thing new-------------------------' test.txt

如果test被匹配,则把反斜杠后面的文本插入到匹配行的前面。

7/ 下一个:n命令

$ sed '/test/{ n; s/aa/bb/; }' test.txt

-----如果test被匹配,则移动到匹配行的下一行,替换这一行的aa,变为bb,并打印该行,然后继续。

8/ 退出:q命令

$ sed '10q' test.txt

-----打印完第10行后,退出sed。

1.2.3 awk命令

awk是一个强大的文本分析工具,相对于grep的查找,sed的编辑,awk在其对数据分析并生成报告时,显得尤为强大。简单来说awk就是把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再进行各种分析处理。

假设last -n 5的输出如下

[root@www ~]#last -n 5        ## 仅取出前五行

root    pts/1   192.168.1.100  Tue Feb 10 11:21   still logged in

root    pts/1   192.168.1.100  Tue Feb 10 00:46 - 02:28  (01:41)

root    pts/1   192.168.1.100  Mon Feb 9 11:41 - 18:30  (06:48)

dmtsai  pts/1   192.168.1.100  Mon Feb 9 11:41 - 11:41  (00:00)

root    tty1                   FriSep  5 14:09 - 14:10  (00:01)

如果只是显示最近登录的5个帐号

# last -n 5 |awk  '{print $1}'

root

root

root

dmtsai

root

awk工作流程是这样的:读入有'\n'换行符分割的一条记录,然后将记录按指定的域分隔符划分域,填充域,$0则表示所有域,$1表示第一个域,$n表示第n个域。默认域分隔符是"空白键" 或 "[tab]键",所以$1表示登录用户,$3表示登录用户ip,以此类推。

如果只是显示/etc/passwd的账户

# cat/etc/passwd |awk  -F ':'  '{print $1}'

root

daemon

bin

sys

这种是awk+action的示例,每行都会执行action{print $1}。

-F指定域分隔符为':'

如果只是显示/etc/passwd的账户和账户对应的shell,而账户与shell之间以tab键分割

#cat /etc/passwd|awk  -F ':'  '{print $1"\t"$7}'

root   /bin/bash

daemon /bin/sh

bin    /bin/sh

sys    /bin/sh

如果只是显示/etc/passwd的账户和账户对应的shell,而账户与shell之间以逗号分割,而且在所有行添加列名name,shell,在最后一行添加"blue,/bin/nosh"。

cat/etc/passwd |awk  -F ':'  'BEGIN {print "name,shell"}  {print $1","$7} END {print "blue,/bin/nosh"}'

name,shell

root,/bin/bash

daemon,/bin/sh

bin,/bin/sh

sys,/bin/sh

....

blue,/bin/nosh

awk工作流程是这样的:先执行BEGING,然后读取文件,读入有/n换行符分割的一条记录,然后将记录按指定的域分隔符划分域,填充域,$0则表示所有域,$1表示第一个域,$n表示第n个域,随后开始执行模式所对应的动作action。接着开始读入第二条记录······直到所有的记录都读完,最后执行END操作。

搜索/etc/passwd有root关键字的所有行

#awk  -F: '/root/'  /etc/passwd

root:x:0:0:root:/root:/bin/bash

这种是pattern的使用示例,匹配了pattern(这里是root)的行才会执行action(没有指定action,默认输出每行的内容)。

搜索支持正则,例如找root开头的: awk -F:  '/^root/'  /etc/passwd

搜索/etc/passwd有root关键字的所有行,并显示对应的shell

# awk  -F':' '/root/{print $7}' /etc/passwd

/bin/bash

这里指定了action{print$7}

统计/etc/passwd:文件名,每行的行号,每行的列数,对应的完整行内容:

#awk  -F ':' '{print "filename:" FILENAME ",linenumber:" NR",columns:" NF ",linecontent:"$0}' /etc/passwd

filename:/etc/passwd,linenumber:1,columns:7,linecontent:root:x:0:0:root:/root:/bin/bash

filename:/etc/passwd,linenumber:2,columns:7,linecontent:daemon:x:1:1:daemon:/usr/sbin:/bin/sh

filename:/etc/passwd,linenumber:3,columns:7,linecontent:bin:x:2:2:bin:/bin:/bin/sh

filename:/etc/passwd,linenumber:4,columns:7,linecontent:sys:x:3:3:sys:/dev:/bin/sh

使用printf替代print,可以让代码更加简洁,易读

awk  -F':' '{printf("filename:%s,linenumber:%s,columns:%s,linecontent:%s\n",FILENAME,NR,NF,$0)}'/etc/passwd

最新文章

  1. Hyper-V3:虚拟机的配置
  2. NOIP水题合集[3/未完待续]
  3. Application MyTest has not been registered. This is either due to a require() error during initialization or failure to call AppRegistry.registerComponent.
  4. NOIP2012普及组 (四年后的)解题报告 -SilverN
  5. 关于基于webrtc的android-apk 和 webrtc-brows
  6. Ubuntu下Code::Blocks无法编译 /bin/sh: 1: g++ not found 解决办法
  7. poj 1228 稳定凸包
  8. sql server导出数据,本地数据库远程连接不上,怎样设置防火墙(自用)
  9. 如何让 KiCad EDA 5.1 不显示铺铜
  10. gradle指定相应JDK编译
  11. spring mvc返回json格式和json字符串
  12. POJ1944 Fiber Communications (USACO 2002 February)
  13. 关于Unity中的特殊文件目录和资源管理(专题四)
  14. 认真研究下HTML之id、name、form、submit
  15. css 相对单位rem详解
  16. aarch64_l3
  17. SupperSocket深入浅出(一)
  18. 让程序运行更加面向用户——电梯V2.1
  19. Hibernate的QBC检索方式
  20. python 实现简单的KNN算法

热门文章

  1. Vue-cropper 图片裁剪的基本原理
  2. [LeetCode] Detect Capital 检测大写格式
  3. PHPCMS v9.5.8-设计缺陷可重置前台任意用户密码
  4. Maven 项目管理工具基础入门系列(二)
  5. Centos常用命令之:VI
  6. 计蒜客NOIP模拟赛4 D1T1 小X的质数
  7. [USACO15OPEN]回文的路径Palindromic Paths 2.0版
  8. ●POJ 2983 Is the Information Reliable?
  9. bzoj 1974: [Sdoi2010]代码拍卖会
  10. Linux学习之CentOS(十五)----磁盘管理之 启动挂载(转)