记录 shell学习过程(11 ) shell 对输出流的处理
语法
awk [options] [BEGIN] {program} [END] [file]
常用命令选项
-F fs 指定描绘一行中数据字段的文件分隔符 默认为空格
-f file 指定读取程序的文件名
-v var=value 定义awk程序中使用的变量和默认值
注意:awk 程序脚本由左大括号和右大括号定义。脚本命令必须放置在两个大括号之间。由于awk命令行假定脚本是单文本字符串,所以必须将脚本包
括在单引号内。
awk程序运行优先级是:
1)BEGIN: 在开始处理数据流之前执行,可选项
2)program: 如何处理数据流,必选项
3)END: 处理完数据流后执行,可选项
awk 基本用法
1.字段提取:提取一个文本中的一列数据并打印输出
字段相关内置变量
$0 表示整行文本
$1 表示文本行中的第一个数据字段
$2 表示文本行中的第二个数据字段
$N 表示文本行中的第N个数据字段
$NF 表示文本行中的最后一个数据字段
# awk '{print $0}' t.txt
1 the quick brown fox jumps over the lazy dog.
2 the quick brown fox jumps over the lazy dog.
3 the quick brown fox jumps over the lazy dog.
4 the quick brown fox jumps over the lazy dog.
# awk '{print $1}' t.txt
1
2
3
4
# awk '{print $2}' t.txt
the
the
the
the
# awk '{print $3}' t.txt
quick
quick
quick
quick
# awk '{print $NF}' t.txt
dog.
dog.
dog.
dog.
2.如何打印某一行以及某一行中的某列呢?使用NR命令
# awk 'NR==3{print $0}' t.txt
3 the quick brown fox jumps over the lazy dog.
# awk 'NR==3{print $1}' t.txt
3
# awk 'NR==3{print $2}' t.txt
the
3.如果文件中的数据并不是以空格分隔的,比如passwd中的就是以:f分隔的,此时如果需要指定分隔符可以使用 -F
awk -F ":" 'NR==1{print $1,$3,$5}' /etc/passwd #打印出passwd文件中的第一列第一行 第三行 第五行的内容
root 0 root
如果想改变上面的输出格式,可以直接修改print后面的部分
# awk -F ":" 'NR==1{print $1"-"$3"-"$5}' /etc/passwd #在$1 $3 $5之间直接增加字符串
root-0-root
4.打印内存使用信息
# head -3 /proc/meminfo
MemTotal: 2035356 kB
MemFree: 1308408 kB
MemAvailable: 1472264 kB
# head -3 /proc/meminfo | awk 'NR==1{print $2}'
2035356
awk 的优先级
BEGIN> print $0 >END
#awk 'BEGIN{print "youxianjizuigao"}{print $0}END{print "youxianjizuidi"}' t.txt
youxianjizuigao
1 the quick brown fox jumps over the lazy dog.
2 the quick brown fox jumps over the lazy dog.
3 the quick brown fox jumps over the lazy dog.
4 the quick brown fox jumps over the lazy dog.
5 the quick brown fox jumps over the lazy dog.
youxianjizuidi
BEGIN不需要数据源就可以执行,但是programe 以及 END就必须有数据源才可以执行
# awk 'BEGIN{print "buxvyaoshujuyuan"}'
buxvyaoshujuyuan
awk 高级用法
直接输出内存使用率,在awk工作时,直接给变量赋值,运算,从而直接结算出结果
# head -2 /proc/meminfo | awk 'NR==1{t=$2}NR==2{f=$2;print (t-f)*100/t "%"}'
31.101%
再来看下面 单引号和双引号要混用,否则可能会没有输出(因为引号会误认段落)
# awk 'BEGIN {name="shuangyinhao";print name}'
shuangyinhao
# awk 'BEGIN {name='danyinhao';print name}'
awk数组的用法
# awk 'BEGIN{array[0]="apple";array[1]=16;print array[0],array[1]}'
apple 16
比较运算
如果比较的是字符串则按照ascii编码顺序比较,如果结果为真返回1,假返回0
# awk 'BEGIN{print "a">="b"}' #不知为何要>= ,>会没有回显
0
逻辑判断
# seq 1 10 > num
# cat num
1
2
3
4
5
6
7
8
9
10
# awk '$1>5{print $1}' num #大于5的信息输出
6
7
8
9
10
数学运算
# awk 'BEGIN{print 1+1}'
2
逻辑运算
# awk 'BEGIN{print 100>=99 && 100>=88}' #奇怪的是只能>= >就报错
1
# awk 'BEGIN{print (100>98 && 100>99)}' #再加一组括号就不报错了
1
匹配运算
精确匹配
# awk -F: '$1=="root"{print $0}' /etc/passwd #打印第一行为root的信息
root:x:0:0:root:/root:/bin/bash
# awk -F: '$1!="root"{print $0}' /etc/passwd #打印第一行不为root的信息
模糊匹配
# awk -F: '$1 ~ "ro"{print $0}' /etc/passwd #第一行包含ro的都会被匹配到
root:x:0:0:root:/root:/bin/bash
chrony:x:997:995::/var/lib/chrony:/sbin/nologin
# awk -F: '$1 !~ "ro"{print $0}' /etc/passwd #第一行不包含ro的都会被匹配到
awk的环境变量
FIELDWIDTHS 指定列的宽度
# awk 'BEGIN{FIELDWIDTHS="5 2 8"}NR==1{print $1,$2,$3}' /etc/passwd
root: x: 0:0:root
# cat /etc/passwd | grep root
root:x:0:0:root:/root:/bin/bash
FS 定义输入字段分隔符 OFS定义输出字段分隔符
# awk 'BEGIN{FS=":";OFS="-"}$1 == "root"{print $1,$3,$5}' /etc/passwd
root-0-root
# awk 'BEGIN{RS=""}{print $1,$2,$3}' num #将num文本中的输入记录分隔符定义为任意,然后输入第1至第3列
1 2 3
# awk 'BEGIN{RS="";OFS="\t"}{print $1,$2,$3}' num #将输出的资源字段分隔符定义为\t得到以下效果
1 2 3
# awk 'BEGIN{RS="";ORS="**********"}{print $1,$2,$3}' num #将输出记录分隔符号定义为***********
1 2 3**********[root@localhost shell_16]#
awk的流程控制
# awk '{if($1>5)print $1}' num #if判断
6
7
8
9
10
# awk '{if ($1<5)print $1*2;else print$1/2}' num
2
4
6
8
2.5
3
3.5
4
4.5
5
# awk -v 'sum=0' '{sum+=$1}END{print sum }' num #-v定义变量 sum只能定义到外面否则循环时,每次都会归0
55
下面的例子 将每一行的数值累加
# cat num2
60 50 100
150 30 10
70 100 40
# awk '{sum=0;for (i=1;i<4;i++){sum+=$i} print sum}' num2 #使用for循环
210
190
210
# awk '{sum=0;i=1;while(i<4){sum+=$i;i++}print sum}' num2 #使用while循环
210
190
210
# awk '{sum=0;i=1;while(i<4){sum+=$i;if(sum>150){break}i++}print sum}' num2 #当sum>150时跳出循环
210
180
170
小技巧
# cat t.txt
1 the quick brown fox jumps over the lazy dog.
2 the quick brown fox jumps over the lazy dog.
3 the quick brown fox jumps over the lazy dog.
4 the quick brown fox jumps over the lazy dog.
5 the quick brown fox jumps over the lazy dog.
# awk 'END{print NR}' t.txt #打印文本行数
5
# awk 'END{print $0}' t.txt #打印文本最后一行内容
5 the quick brown fox jumps over the lazy dog.
# awk 'END{print NF}' t.txt #打印文本列数
10
记录 shell学习过程(11 ) shell 对输出流的处理的更多相关文章
- Linux 学习记录 四(Bash 和 Shell scirpt).
一.什么是 Shell? 狭义的shell指的是指令列方面的软件,包括基本的Linux操作窗口Bash等,广义的shell则包括 图形接口的软件,因为图形接口其实也可以操作各种驱动程序来呼叫核心进行工 ...
- 自学linux——11.shell入门
shell 基础 1.shell介绍(内置脚本) 程序开发的效率非常高,依赖于功能强大的命令可以迅速地完成开发任务(批处理) 语法简单,代码写起来比较轻松,简单易学 (1)什么是shell shell ...
- 鸟哥的私房菜:Bash shell(四)-Bash shell的使用环境
Bash shell(四)-Bash shell的使用环境 是否记得我们登入主机的时候,屏幕上头会有一些说明文字,告知我们的 Linux 版本啊什么的, 还有,登入的时候,我们还可以给予使用者一些 ...
- shell 编程 && bash 简介(shell 变量、shell操作环境、数据流重导向、管线命令、shell script)
如何学习一门编程语言 数据类型 运算符 关键字 1 认识BASH 这个shell linux是操作系统核心,用户通过shell与核心进行沟通,达到我们想要的目的.硬件.核心.用户之间的关系: 原理:所 ...
- 什么是shell? bash和shell有什么关系?
什么是shell? bash和shell有什么关系? 博客分类: Linux 什么是Shell? shell是你(用户)和Linux(或者更准确的说,是你和Linux内核)之间的接口程序 ...
- Shell学习之Shell特性(一)
Shell学习之Shell特性 目录 命令和文件自动补齐功能 命令历史记忆功能 history.上下键.!number.!string.!$.!! 别名功能 alias.unalias cp.~use ...
- Shell test 命令,Shell 输入/输出重定向
一.Shell test 命令 Shell中的 test 命令用于检查某个条件是否成立,它可以进行数值.字符和文件三个方面的测试. 数值测试 参数 说明 -eq 等于则为真 -ne 不等于则为真 -g ...
- 什么是shell? bash和shell有什么关系?
什么是Shell? shell是你(用户)和Linux(或者更准确的说,是你和Linux内核)之间的接口程序.你在提示符下输入的每个命令都由shell先解释然后传给Linux内核. ...
- shell(shell函数、shell正则表达式)
本章内容 shell函数 shell正则表达式 1.shell函数 linux shell 可以用户定义函数,然后在shell脚本中可以随便调用. 格式: funname () { CMD #函数体 ...
- shell基础之shell相关概念
一.脚本介绍 1.脚本简单地说就是一条条的文字命令(一些指令的堆积),这些文字命令是可以看到的(如可以用记事本打开查看.编辑). 常见的脚本: JavaScript(JS,前端),VBScript, ...
随机推荐
- SAP S4HANA里委外加工采购功能的变化
SAP S4HANA里委外加工采购功能的变化 [Part 1:主要变化点] 1.1,采购订单界面上的变化, 1.2, 新的事务代码: ME2ON (Subcontracting Cockpit), 1 ...
- 掌握这四大MySQL知识点,吊打面试官
作为一名后端开发,MySQL的使用必不可少,合理的使用索引和索引调优是后端开发者必须掌握的技能之一. 在日常数据库的问题当中,不合理的使用索引占大部分. MySQL是大家工作上最常用的关系型数据库之一 ...
- 浅析设计模式之mvc、mvp、mvvm
mvc.mvvm.mvp是常见的设计模式,也是常见的设计思想,现对它们进行简要的归纳总结 三种模式的介绍 1.MVC:经典设计模式 View 传送指令到 Controller(控制器) Control ...
- 前后端分离-crud&svn
前后端分离-crud&svn 1. 跨域 1.1 什么是跨域 请求方与服务方的源不同,即跨域,包括: 1. 协议不同 2. 域名不同 3. 端口不同 1.2 跨域不一定存在跨域问题 什么情况下 ...
- Node.js---起步
1.下载--安装 2.创建js文件 var http = require('http'); var url=require('url'); //引入url 模块,帮助解析 var querystrin ...
- wondiws+centos 双系统
任务:在windows下安装CentOS 1.下载CentOS镜像文件,准备一个未格式化的空间. 2.使用UltraISO将要安装的系统写入U盘. 3.用U盘启动,将系统装入一个空的分区下(未格式化) ...
- 纪中17日T1 2321. 方程
纪中17日T1 2321. 方程 (File IO): input:cti.in output:cti.out 时间限制: 1000 ms 空间限制: 262144 KB 具体限制 Goto ...
- 剑指offer-拓展训练-字符的所有组合-全组合
/* 题目: 给定不含重复字符字符串的全组合. */ /* 思路: 递归法. 例给定abc,输出的组合长度为1,2,3. 对于长度为2的组合,分选择a(ab,ac)和不选择a的情况(bc). 选择a, ...
- P1217 [USACO1.5]回文质数 Prime Palindromes(stringstream,sizeof(num)/sizeof(num[0]),打表)
题目描述 因为 151 既是一个质数又是一个回文数(从左到右和从右到左是看一样的),所以 151 是回文质数. 写一个程序来找出范围 [a,b](5≤a<b≤100,000,000)( 一亿)间 ...
- 适合小白的大白话讲解--->Git与Github的区别
本文由 伯乐在线 - 听风 翻译,艾凌风 校稿.未经许可,禁止转载!英文出处:Red Radger.欢迎加入翻译组. 本文旨在使用通俗易懂的文字,讲解版本控制背后的理论,以便你能对程序员们如何工作有个 ...