shell中字符串截取命令:cut,printf,awk,sed
文章目录
[隐藏]
- 一、cut
- 1、选项
- 2、使用
- 二、printf
- 1、输出类型
- 2、输出格式
- 三、awk
- 1、命令
- 2、条件(pattern):一般使用关系表达式作为条件
- 3、动作(Action)
- 4、例子
- 5、说明
- 四、sed
- 1、命令
- 2、选项
- 3、动作:(要加双引号)
- 4、例子
一、cut
- cut 命令不能在分割符是空格的字符串中截取列,只能是 制表符 或 具体的分割符。
1、选项
- -b :仅显示行中指定直接范围的内容;
- -c :仅显示行中指定范围的字符;
- -d :指定字段的分隔符,默认的字段分隔符为”TAB”;
- -f :显示指定字段的内容;
- -n :与”-b”选项连用,不分割多字节字符;
- –complement :补足被选择的字节、字符或字段;
- –out-delimiter=<字段分隔符> :指定输出内容是的字段分割符;
- –help :显示指令的帮助信息;
- –version :显示指令的版本信息。
2、使用
- -d :分隔符 ( –delimiter 按照指定分隔符分割列 )
- -b : 表示字节
- -c : 表示字符
- -f : 表示字段(列号) ( –field 提取第几列 )
- N- : 从第N个字节、字符、字段到结尾
- N-M : 从第N个字节、字符、字段到第M个
- -M : 从第一个字节、字符、字段到第M个
$> cat user.txt 01, zhang, M, 18 02, wang, M, 20 03, li, M, 21 # 以","分隔,显示第二列 $> cut -d "," -f 2 user.txt zhang wang li # 以","分隔,显示第1列和第3列 $> cut -d "," -f 1,3 user.txt 01, M, 02, M, 03, M, # 以","分隔,显示第1-3列 $> cut -d "," -f 1-3 user.txt 01, zhang, M, 02, wang, M, 03, li, M, # 以","分隔,显示除第1列以外的其他列 $> cut -d "," -f 1 --complement user.txt zhang, M, 18 wang, M, 20 li, M, 21 ## 注意前面是有空格的! ###### 字符串 $> cut -c1-5 user.txt 01, zh 02, wa 03, li
二、printf
- printf ‘输出类型输出格式’ 内容
1、输出类型
- %ns: 输出字符串。n是数字,指输出几个字符
- %ni: 输出整数。n是数字,指输出几个数字
- %m.nf: 输出浮点数。m和n是数字,分别指输出的整数位数和小数位数。如%8.2f代表共输出8位数,其中2是小数,6是整数。
2、输出格式
- a : 输出警告声音
- b : 输出退格键,也就是Backspace键
- f : 清除屏幕
- n : 换行
- r : 回车,也就是Enter键
- t : 水平输出退格键,也就是Tab键
- v : 垂直输出退格键,也就是Tab键
printf %s 1 2 3 4 5 6 # 把123456当成一个字符串输出,没有格式 printf %s %s %s 1 2 3 4 5 6 # 把%s%s123456当做字符串输出,没有格式 printf '%s ' 1 2 3 4 5 6 # 把1 2 3 4 5 6当做字符串输出,输出格式为空格 printf '%sn' 1 2 3 4 5 6 # 输出格式为1个一行 printf '%s %s %s' 1 2 3 4 5 6 # 把内容当做字符串三个为一组输出,1 2 34 5 6 printf '%s %s %sn' 1 2 3 4 5 6 # 输出格式为3个一行 printf '%s' $(cat user.txt) # 输出文本内容为字符串 printf '%st %st %st %sn' $(cat user.txt)# 把文本内容格式化输出
- 建议 man printf 查看可用的输出格式,和C的 printf 格式一样。
三、awk
1、命令
awk ‘条件1{动作1} 条件2{动作2} …’ 文件名
( 如果条件1,执行动作1;如果条件2,执行动作2 )
2、条件(pattern):一般使用关系表达式作为条件
- x > 10 : 判断变量x是否大于10
- x >= 10 : 大于等于
- x <= 10 : 小于等于
3、动作(Action)
- 格式化输出
- 流程控制语句
4、例子
# 大括号前面没有条件,直接执行命令,这里的printf 是awk的命令,$2 提取文件第二列,$3 提取文件第三列,$0 提取所有列 awk '{printf $2 "t" $3"n"}' user.txt # 打印三列,这里的print是awk的命令,系统并没有print命令,所以只能在awk里使用;与printf的区别是:print会自动在行尾加换行符,而printf不会 df -h | awk '{print $1 "t" $5 "t" $6 "t"}' # 提取系统已使用硬盘空间,可以把结果赋给一个变量,判断是否大于某个值,进行报警 df -h | grep sda3 | awk '{print $5}' | cut -d '%' -f 1 # 查看剩余内存不包含单位M free -h | grep Mem | awk '{print $4}' | cut -d 'M' -f 1
5、说明
- grep 取行,awk 按条件取指定列,cut 按分隔符取指定列。
- BEGIN:先执行一条多余的动作
awk 'BEGIN{print "this is a text"} {print $2 "t" $3}' user.txt
- END:用于在所有命令处理完之后执行
- FS内置变量:用于定义分割符,如果需要手工定义分割符,一定要在分割符前面加BEGIN;
awk 'BEGIN{FS=":"} END{print "this is end text"} {print $1 "t" $3}' /etc/passwd
- BEGIN、END也是条件。
-
关系运算符:
# user.txt中不包含ID这行,提取满足条件为第四列值大于18的第二列 cat user.txt | grep -v ID | awk '$4 > 18 {printf $2 "n"}'
四、sed
sed主要是用来将数据进行选取、替换、删除、新增的命令。可以放在管道符之后处理。
1、命令
- sed [选项] ‘[动作]’ 文件名
- sed命令有两种形式:sed [options] ‘command’ file(s);sed [options] -f scriptfile file(s)
2、选项
- -n : 一般sed命令会把所有数据都输出到屏幕;如果加入此选项,则只会把经过sed命令处理的行输出到屏幕。
- sed -n ‘2p’ user.txt # 输出第二行
- -e : 允许对输入数据应用多条sed命令编辑
- -f : 添加脚本文件的内容到执行的动作
- -i : 用sed的修改结果直接修改读取数据的文件,而不是由屏幕输出
3、动作:(要加双引号)
- `a` : 追加,在当前行后添加一行或多行。添加多行时,除最后一行外,每行末尾需要用””代表数据未完结。
- `c` : 行替换,用c后面的字符串替换原数据行,替换多行时,除最后一行外,每行末尾需要用””代表数据未完结。
- `i` : 插入,在当前行前插入一行或多行。插入多行时,除最后一行外,每行末尾需要用””代表数据未完结。
- d : 删除,删除指定的行。
- p : 打印,输出指定的行。
- s : 字串替换,用一个字符串替换另外一个字符串。格式为“行范围s/旧字串/新字串/g”(和vim中的替换格式类似)
4、例子
sed -n '2p' user.txt # 输出第二行, p一般都要和-n使用,不-n会显示出所有的行 df -h | sed -n '2p' # 管道符结果作为操作内容 sed '2,4d' user.txt # 删除文件的第2行到第4行,显示剩下的行,没有加 i 选项,不会更改文件内容 sed '2a hello' user.txt # 在第二行后追加hello,仅仅修改命令输出 sed '2i hello world' user.txt # 在第二行前插入两行数据,仅仅修改命令输出 sed '2c No person' user.txt # 把第二行替换为No person sed '2s/M/F/g' user.txt # 把第二行的M替换为F后输出 sed -i '2s/M/F/g' user.txt# 把替换后的结果写入文件 sed -e 's/zhang//g ; s/wang//g' user.txt # -e 允许多条命令顺序执行,用分号隔开,s前面不加数字表示所有行
原文出处:简书 -> http://www.jianshu.com/p/1bbdbf1aa1bd
本站所发布的一切资源仅限用于学习和研究目的;不得将上述内容用于商业或者非法用途,否则,一切后果请用户自负。本站信息来自网络,版权争议与本站无关。您必须在下载后的24个小时之内,从您的电脑中彻底删除上述内容。如果您喜欢该程序,请支持正版软件,购买注册,得到更好的正版服务。如果侵犯你的利益,请发送邮箱到 [email protected],我们会很快的为您处理。