shell 脚本之 cut awk sed 命令详解
2017-05-19 12:24
706 查看
【cut命令】
cut [选项] 文件
2
3
vi user.txt
( 行间分隔符为制表符Tab,cut的默认分割符是制表符 )
提取系统的用户名和uid:
与grep组合使用:( 假设批量添加100个普通用户,或需要批量删除,那么需要提取普通用户的名字 )
useradd user1
useradd user2
useradd user3
( 所有系统用户登录目录都是/sbin/nologin , 通过匹配/bin/bash 提取所有能登录的用户 , -v 取反选择不匹配root的行,再用cut匹配列提取用户名;把结果赋给变量,通过循环删除 )
cut命令的局限:
( 提取系统盘使用率 )
2
3
4
5
【printf】
printf ‘输出类型输出格式’ 内容
输出类型:
输出格式:
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
【awk】
awk的标准输出命令是printf,默认分割符是空格或制表符。cut命令不能在风格符是空格的字符串中截取列,只能是制表符或具体的分割符。
1. awk ‘条件1{动作1} 条件2{动作2}…’ 文件名
( 如果条件1,执行动作1;如果条件2,执行动作2 )
条件(pattern):
动作(Action)
格式化输出
( 大括号前面没有条件,直接执行命令,这里的printf 是awk的命令,2提取文件第二列,3
提取文件第三列,$0 提取所有列 )
( 打印三列,这里的print是awk的命令,系统并没有print命令,所以只能在awk里使用;与printf的区别是:print会自动在行尾加换行符,而printf不会 )
( 提取系统已使用硬盘空间,可以把结果赋给一个变量,判断是否大于某个值,进行报警 )
2. BEGIN:先执行一条多余的动作
3. END:用于在所有命令处理完之后执行
4. FS内置变量:用于定义分割符,如果需要手工定义分割符,一定要在分割符前面加BEGIN;
5. 关系运算符:
( user.txt中不包含ID这行,提取满足条件为第四列值大于18的第二列 )
【sed】
sed是一种几乎包括在所有Unix平台的轻量级流编辑器。sed主要是用来将数据进行选取、替换、删除、新增的命令。(可以放在管道符之后处理)
sed [选项] ‘[动作]’ 文件名
sed命令有两种形式:sed [options] ‘command’ file(s);sed [options] -f scriptfile file(s)
选项:
-f : 添加脚本文件的内容到执行的动作
动作:(要加双引号)
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前面不加数字表示所有行
cut [选项] 文件
-f 列号 ( --field 提取第几列 ) -d 分隔符 ( --delimiter 按照指定分隔符分割列 )1
2
3
vi user.txt
( 行间分隔符为制表符Tab,cut的默认分割符是制表符 )
提取系统的用户名和uid:
cut -d ":" -f 1,3 /etc/passwd1
与grep组合使用:( 假设批量添加100个普通用户,或需要批量删除,那么需要提取普通用户的名字 )
useradd user1
useradd user2
useradd user3
( 所有系统用户登录目录都是/sbin/nologin , 通过匹配/bin/bash 提取所有能登录的用户 , -v 取反选择不匹配root的行,再用cut匹配列提取用户名;把结果赋给变量,通过循环删除 )
cat /etc/passwd | grep "/bin/bash" | grep -v "root" | cut -d ":" -f 11
cut命令的局限:
( 提取系统盘使用率 )
df -h df -h | grep "sda3" | cut -f 5 # 只能匹配出行所有内容,因为分隔符是空格,不是Tab df -h | grep "sda3" | cut -d " " -f 5 # 无法匹配出想要的结果,因为分割符是严格匹配,如果实际内容分割符有两个空格,无法得出正确结果1
2
3
4
5
【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 # 把123456当成一个字符串输出,没有格式 printf %s %s %s 1 2 3 4 5 6 # 把%s%s123456当做字符串输出,没有格式< 4000 /span> printf '%s ' 1 2 3 4 5 6 # 把1 2 3 4 5 6当做字符串输出,输出格式为空格 printf '%s\n' 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 %s\n' 1 2 3 4 5 6 # 输出格式为3个一行 printf '%s' $(cat user.txt) # 输出文本内容为字符串 printf '%s\t %s\t %s\t %s\n' $(cat user.txt) # 把文本内容格式化输出1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
【awk】
awk的标准输出命令是printf,默认分割符是空格或制表符。cut命令不能在风格符是空格的字符串中截取列,只能是制表符或具体的分割符。
1. awk ‘条件1{动作1} 条件2{动作2}…’ 文件名
( 如果条件1,执行动作1;如果条件2,执行动作2 )
条件(pattern):
一般使用关系表达式作为条件 x > 10 判断变量x是否大于10 x>=10 大于等于 x<=10 小于等于
动作(Action)
格式化输出
流程控制语句
awk '{printf $2 "\t" $3"\n"}' user.txt1
( 大括号前面没有条件,直接执行命令,这里的printf 是awk的命令,2提取文件第二列,3
提取文件第三列,$0 提取所有列 )
df -h | awk '{print $1 "\t" $5 "\t" $6 "\t"}'1
( 打印三列,这里的print是awk的命令,系统并没有print命令,所以只能在awk里使用;与printf的区别是:print会自动在行尾加换行符,而printf不会 )
df -h | grep sda3 | awk '{print $5}' | cut -d '%' -f 11
( 提取系统已使用硬盘空间,可以把结果赋给一个变量,判断是否大于某个值,进行报警 )
2. BEGIN:先执行一条多余的动作
awk 'BEGIN{print "this is a text"} {print $2 "\t" $3}' user.txt1
3. END:用于在所有命令处理完之后执行
4. FS内置变量:用于定义分割符,如果需要手工定义分割符,一定要在分割符前面加BEGIN;
awk 'BEGIN{FS=":"} END{print "this is end text"} {print $1 "\t" $3}' /etc/passwd1
5. 关系运算符:
cat user.txt | grep -v ID | awk '$4 > 18 {printf $2 "\n"}'1
( user.txt中不包含ID这行,提取满足条件为第四列值大于18的第二列 )
【sed】
sed是一种几乎包括在所有Unix平台的轻量级流编辑器。sed主要是用来将数据进行选取、替换、删除、新增的命令。(可以放在管道符之后处理)
sed [选项] ‘[动作]’ 文件名
sed命令有两种形式:sed [options] ‘command’ file(s);sed [options] -f scriptfile file(s)
选项:
-n : 一般sed命令会把所有数据都输出到屏幕;如果加入此选项,则只会把经过sed命令处理的行输出到屏幕。 sed -n '2p' user.txt # 输出第二行 -e : 允许对输入数据应用多条sed命令编辑
-f : 添加脚本文件的内容到执行的动作
-i : 用sed的修改结果直接修改读取数据的文件,而不是由屏幕输出
动作:(要加双引号)
a\ : 追加,在当前行后添加一行或多行。添加多行时,除最后一行外,每行末尾需要用"\"代表数据未完结。 c\ : 行替换,用c后面的字符串替换原数据行,替换多行时,除最后一行外,每行末尾需要用"\"代表数据未完结。 i\ : 插入,在当前行前插入一行或多行。插入多行时,除最后一行外,每行末尾需要用"\"代表数据未完结。 d : 删除,删除指定的行。 p : 打印,输出指定的行。 s : 字串替换,用一个字符串替换另外一个字符串。格式为“行范围s/旧字串/新字串/g”(和vim中的替换格式类似)
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前面不加数字表示所有行
相关文章推荐
- 详解Shell脚本:sed命令工具 ,awk命令工具
- shell脚本之正则表达式、函数、grep、sed、awk、printf等基本命令配置详解
- cut\grep\awk\sed命令详解
- shell脚本--cut命令与awk简单使用
- shell脚本awk, sed, cut的妙用
- Linux的shell脚本grep、sed、awk练习和diff、patch、cut、sort介绍
- Linux grep sed nl awk sort,uniq,cut,wc rsync命令详解
- [Shell]字符截取命令:cut, printf, awk, sed
- shell脚本抽取制定字符串、grep+awk+cut+sed
- 【shell脚本】常用工具的学习grep、sed、awk、cut
- shell脚本--检查文件是否存 cut命令详解
- Shell 字符截取命令:cut, printf, awk, sed
- 几个常用的文本处理shell 命令:find、grep、xargs、sort、uniq、tr、cut、paste、wc、sed、awk
- 详解shell脚本(九)——awk命令编程
- Shell基础(四):正则表达式、cut、awk、sed命令
- awk命令简介,linux tee 命令详解,Sed 命令 linux shell 脚本 awk 命令详解
- [Shell]字符截取命令:cut, printf, awk, sed
- shell工具——cut、tr、grep、sort、uniq、re、sed、awk
- Shell中的grep、awk和sed的常用命令和语法
- shell Sed命令详解