• 为了保证你在浏览本网站时有着更好的体验,建议使用类似Chrome、Firefox之类的浏览器~~
    • 如果你喜欢本站的内容何不Ctrl+D收藏一下呢,与大家一起分享各种编程知识~
    • 本网站研究机器学习、计算机视觉、模式识别~当然不局限于此,生命在于折腾,何不年轻时多折腾一下

linux shell中使用awk sed等命令

Linux admin 10个月前 (09-03) 691次浏览 0个评论 扫描二维码

cut


  • cut 命令不能在分割符是空格的字符串中截取列,只能是 制表符 或 具体的分割符。

选项

  • -b :仅显示行中指定直接范围的内容;
  • -c :仅显示行中指定范围的字符;
  • -d :指定字段的分隔符,默认的字段分隔符为”TAB”;
  • -f :显示指定字段的内容;
  • -n :与”-b”选项连用,不分割多字节字符;
  • --complement :补足被选择的字节、字符或字段;
  • --out-delimiter=<字段分隔符> :指定输出内容是的字段分割符;
  • --help :显示指令的帮助信息;
  • --version :显示指令的版本信息。

使用

  • -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 ‘输出类型输出格式’ 内容

输出类型:

%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 当做字符串输出,没有格式
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)  # 把文本内容格式化输出
  • 建议 man printf 查看可用的输出格式,和 C 的 printf 格式一样。

awk


命令

awk ‘条件 1{动作 1} 条件 2{动作 2} …’ 文件名
( 如果条件 1,执行动作 1;如果条件 2,执行动作 2 )

条件(pattern):一般使用关系表达式作为条件

  • x > 10 : 判断变量 x 是否大于 10
  • x >= 10 : 大于等于
  • x <= 10 : 小于等于

动作(Action)

  • 格式化输出
  • 流程控制语句

例子

# 大括号前面没有条件,直接执行命令,这里的 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

说明

  • 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 主要是用来将数据进行选取、替换、删除、新增的命令。可以放在管道符之后处理。

命令

  • 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 前面不加数字表示所有行

转载自链接:http://www.jianshu.com/p/1bbdbf1aa1bd


Deeplearn, 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明linux shell 中使用 awk sed 等命令
喜欢 (0)
admin
关于作者:

您必须 登录 才能发表评论!