字符截取命令

一、cut

格式:
cut [选项] 文件名
参数:
-f 列号: 提取第几列
-d 分隔符: 按照指定分隔符分割列

我们来演示一下,我们先建立一个文件,student.txt:

ID   NAME        GENDER  MARK
1   liuwejia    M       61
2   lilingjie   W       96
3   zhangsan    M       88

注意,中间是tab制表符,而不是空格,否则cut命令是没法正确截取的。

  • cut -f 2 student.txt:提取第二列。
  • cut -f 2,3 student.txt:提取第二列和第三列。
  • 我们还可以使用-d指定分隔符,例如我们的passwd文件是用“:”作为分隔符,我们就可以这样使用,cut -d ":" -f 1,3 etc/passwd

但是cut命令还是有它的局限性,我们有些时候是用空格进行格式对齐的,这个时候cut就无能为力了,所以这个时候我们需要学习下面更强大也更繁琐的awk命令。

二、printf命令

在学习awk命令之前,我们先学习printf,格式化输出命令。
格式:
printf '输出类型输出格式' 输出内容
输出类型:
%ns:输出字符串。n是数字指代输出几个字符。
%ni:输出整数。n是数字指代输出几个数字。
%m.nf:输出浮点数。m和n是数字,指代输出的整数 位数和小数位数。如%8.2f代表共输出8位数, 其中2位是小数,6位是整数。
输出格式:
\a: 输出警告声音
\b: 输出退格键,也就是Backspace键
\f: 清除屏幕
\n: 换行
\r: 回车,也就是Enter键
\t: 水平输出退格键,也就是Tab键
\v: 垂直输出退格键,也就是Tab键

我们演示一下:

  • printf %s 1 2 3 4 5 6
  • printf %s %s %s 1 2 3 4 5 6
  • printf '%s %s %s' 1 2 3 4 5 6
  • printf '%s %s %s\n' 1 2 3 4 5 6

我们先新建一个文件,student.txt:

ID   Name    PHP Linux   MySql   Average
1   lwj     82  95      86      87.66
2   llj     99  99      99      99.00
3   zs      95  97      96      96.00
  • printf '%s' $(cat student.txt):不调整输出格式
  • printf '%s\t %s\t %s\t %s\t %s\t %s\t \n' $(cat student.txt):调整格式输出

在awk命令的输出中支持printprintf命令

  • print:print会在每个输出之后自动加入一个换行符(Linux默认没有print命令)
  • printf:printf是标准格式输出命令,并不会自动加入换行符,如果需要换行,需要手工加入换行符

三、awk命令

格式:
awk ‘条件1{动作1} 条件2{动作2}…’ 文件名

条件(pattern):
一般使用关系表达式作为条件。
x > 10 :判断变量 x是否大于10
x>=10 :大于等于
x<=10 :小于等于

动作(action):
格式化输出;
流程控制语句。

示例:

1.

首先我们还是用上面的文件为例,我们提取第二列的姓名和第六列的成绩平均值。
awk '{printf $2"\t"$6"\n"}' student.txt
其中$2表示第二列,$6表示第六列。

2.

我们再举一个例子,我们知道df -h命令是查看当前系统的磁盘文件占用状况的:

我们可以看到根分区的占用情况是32%,我们假设一种场景,我们写一个程序,它会两个小时执行一次,判断根分区的占用情况,如果占用大于80%,我们就报警。所以现在我们需要得到32这个数字,为了这个目的,我们可以进行下面的操作:

  1. 首先是df -h,获取磁盘文件系统的信息。
  2. 我们可以自己判断出来根分区是挂载在sda3上的,我们可以获取这一行:grep sda3
  3. 然后这个时候我们要用awk命令来获取第五列,也就是上面的百分比数字:awk '{print $5}'
  4. 最后我们可以用分隔符的方式巧妙的去掉百分号:cut -d "%" -f 1

我们把上面的操作用管道符连接起来,得到:

df -h | grep sda3 |awk '{print $5}' | cut -d "%" -f 1

试一下:

我们成功得到了这个数字。

3.

awk 'BEGIN{print "gender!"}  {printf $2"\t"$6"\n"}' student.txt

BEGIN的作用是在执行真正的脚本之间,先进行的动作,我们这里就是先输出一句话:

4.

我们先做一个实验,

awk '{FS=":"} {printf $1 "\t" $3 "\n"}' /etc/passwd

其中FS的作用是指定分隔符,我们知道默认是以空格和制表符为分隔符的,而我们可以使用FS来指定分隔符,FS也称之为FS内置变量。也就是我们想提取/etc/passwd文件的第一列和第三列,指定用冒号分割,我们看一下结果:

我们看到大部分都是符合我们的预期的,但是第一行却没有分割,这就是因为命令是先读取了第一行字符,完成操作之后,才读取了FS=":",所以后面的都正确分割,唯独第一行不可以。这个时候,我们就可以使用BEGIN了,我们在读取之前就指定分隔符,我们看一下:awk 'BEGIN{FS=":"} {printf $1 "\t" $3 "\n"}' /etc/passwd

我们看到,这样就没有问题了。

5.

有BEGIN,那么相应的就有END。意思也就是在执行的结束要执行的动作。

awk 'END{print "END!"}  {print $2}' student.txt

结果:

6.

cat student.txt | grep -v Name | awk '$6 >= 90 {printf $2 "\n" }'

这一行命令的意思就是去掉标题行,然后判断平均成绩是否大于90,大于的话就输出第二列,也就是姓名:

四、sed命令

sed 是一种几乎包括在所有 UNIX 平台(包括 Linux)的轻量级流编辑器。sed主要是用来将数据进行选取、替换、删除、新增的命令。

格式:
sed [选项] '[动作]' 文件名
选项:
-n: 一般sed命令会把所有数据都输出到屏幕 , 如果加入此选择,则只会把经过sed命令处 理的行输出到屏幕。
-e: 允许对输入数据应用多条sed命令编辑
-i: 用sed的修改结果直接修改读取数据的文件, 而不是由屏幕输出
动作:
a \: 追加,在当前行后添加一行或多行。添加多行时,除最后 一行 外,每行末尾需要用“\”代表数据未完结。
c \: 行替换,用c后面的字符串替换原数据行,替换多行时,除最 后一行外,每行末尾需用“\”代表数据未完结。
i \: 插入,在当期行前插入一行或多行。插入多行时,除最后 一行 外,每行末尾需要用“\”代表数据未完结。
d: 删除,删除指定的行。
p: 打印,输出指定的行。
s: 字串替换,用一个字符串替换另外一个字符串。格式为“行范围s/旧字串/新字串/g”(和vim中的替换格式类似)。

我们做几个示范:

1. 行数据操作

不加-n参数,我们可以试一下:sed '2p' student.txt

我们看到,他只是把第二行重复打印了一遍,整个文档也打印了一遍。我们只想得到第二行的数据,就可以加上-n参数:sed -n '2p' student.txt

我们也可以删除第二行到第四行的数据,但不修改文件本身:sed '2,4d' student.txt

在第二行后追加hello:sed '2a hello' student.txt

如果想在第二行之前插入两行数据,就需要:

sed '2i hello\
> world' student.txt


我们也可以做数据替换:sed '2c No such person' student.txt

2. 字符替换操作

在第三行中,把99换成100:sed '3s/99/100/g' student.txt

但是以上所有我们尝试的操作都是在修改命令输出的结果,而并没有影响原来的文件本身,我们可以加入-i参数来保存我们的修改:sed -i '3s/99/100/g' student.txt

我们再次尝试使用-e参数来尝试执行多个条件:sed -e 's/llj/LLJ/g ; s/zs/wingman/g' student.txt,分别把llj换成LLJ,把zs换成wingman:


END.

Shell编程——字符截取命令相关推荐

  1. awk截取字符命令_bash中的字符截取命令cut和awk

    grep也是字符截取命令(本笔记在查找命令中),是从文件中截取符合条件的行,其他常见的字符截取命令还有: 一.cut列提取命令:cut [选项] 文件名 -f m[,n]:指定提取第m列或第m到第n列 ...

  2. 终于要把魔爪伸向shell编程了_命令行参数数量预检测——莫韵乐的小脚印笔记

    终于要把魔爪伸向shell编程了_命令行参数数量预检测 有时候我们在时使用shell的时候都需要传入一些参数,但是有时候我们传入的命令行参数数量不正确就很容易发生错误,因此我们需要在需要传入参数的sh ...

  3. shell编程 之 test命令

    shell编程里的测试test命令基本可以分为3种数据类型,每种都不一样.个人更倾向于理解为条件语句的写法规则,就是test加条件加判断语句. 1 数值类型 基本可以分为6个判断:-eq等于,-ne不 ...

  4. Shell编程~脚本cheo命令

    Shell脚本命令 echo命令解释 echo命令解释 echo命令用于在shell中打印shell变量的值,或者直接输出指定的字符串.linux的echo命令,在shell编程中极为常用,在终端下打 ...

  5. ARM:裸板shell编程完善(匹配命令、修复bug)、G-Sensor重力传感器驱动基础

    <tips> vi中命令模式下: ' :e main.c    // 打开main.c ' :bn            // back next 回到下一个文件 ' :bp        ...

  6. linux下 cut 字符截取命令详解

    目录 一.cut用法 1.cut语法 2.cut语法精简 二.实例 注: 1.以下测试在ubuntu 9.10(32位)上进行,其他平台未测试 2.本文只是我个人的理解,不一定完全正确 3.版权所有, ...

  7. Linux字符截取命令-cut

    概述 cut是一个选取命令,.一般来说,选取信息通常是针对"行"来进行分析的,并不是整篇信息分析的. 语法 cut [-bn] [file] 或 cut [-c] [file] 或 ...

  8. shell编程中declare命令的使用

    众所周知,shell变量是弱类型变量,默认情况下都是字符串型.字符串不能直接进行数学运算,如果想要进行数学运算,便可使用declare声明变量类型. declare命令的用法: declare [+/ ...

  9. Kali与Shell编程 -- 软件包管理命令deb安装

    一.课前声明 1.本分享仅做学习交流,请自觉遵守法律法规! 2.搜索:Kali与编程,学习更多网络攻防干货! 二.知识点详解 离线安装deb文件的方法: 在网上下载到deb文件,并将其保存到kali系 ...

最新文章

  1. R 语言常用操作与函数汇总
  2. python使用方法视频-Python读取视频的两种方法(imageio和cv2)
  3. 尝试jquery插件的开发
  4. MySQL 的各个json 函数说明
  5. Python(set/list/dict/tuple)
  6. jquery库实现iframe自适应内容高度和宽度
  7. mbot编程机器人怎么连接蓝牙_台式机蓝牙怎么连接
  8. 【个人想法】个人关于数据库字段类型选择的想法
  9. 汽车品牌查询及车型大全查询
  10. 按键脚本c语言,按键精灵脚本代码大全 按键精灵命令使用方法
  11. 激光破解太空通信难题
  12. yoga710怎么进入bios_联想笔记本怎么进入BIOS联想手提电脑进BIOS方法汇总
  13. QQ IM架构学习总结
  14. 测试技术 --黑盒测试与白盒测试
  15. win10无法防问其他计算机没有权限,win10系统访问磁盘共享没有权限的解决方案...
  16. 计算机数据库安全研究目的,浅论计算机数据库安全管理
  17. wap pc html,PCWAP手机PC网站信息管理系统 v1.4.3
  18. 守望先锋地图工坊分享合集
  19. 正反斜杠的区别_正斜杠(/)和反斜杠(\)的区别
  20. linux怎么sftp传文件,如何使用Linux SFTP命令传输文件

热门文章

  1. 双网卡实现主机与虚拟机互通,虚拟机上网
  2. 29-2-电容触摸屏控制芯片GT911
  3. android刷机之官方ROM提取rom.zip
  4. vue.config.js详解
  5. 12306自动刷票下单-查票下单(二)
  6. 2019年 -- 只聊感情
  7. 5G边缘计算赋能安防互联网直播行业,青犀视频强力打造云、边、端一体化协同音视频解决方案
  8. java脚本语言是什么_什么是脚本语言
  9. win32 SetCapture 和 ReleaseCapture的使用
  10. 田野调查手记·浮山摩崖石刻(十一)