GNU AWK

2023-11-07

awk

awk官方给出的是 pattern scanning and processing language即模式扫描处理语言,我们CentOS一般用的是GNU AWK,官方给出的语法有五种,我们只举例前两种使用格式,下面是语法:

   gawk [ POSIX or GNU style options ] -f program-file [ -- ] file ...
   gawk [ POSIX or GNU style options ] [ -- ] program-text file ...

   pgawk [ POSIX or GNU style options ] -f program-file [ -- ] file ...
   pgawk [ POSIX or GNU style options ] [ -- ] program-text file ...

   dgawk [ POSIX or GNU style options ] -f program-file [ -- ] file ...

语法

gawk [ POSIX or GNU style options ] [ – ] program-text file …

  • -F 指定分隔符;
  • -v var=value 赋值变量,使AWK处理过程中可以调用
* -v 表示变量
FS:输入字段分隔符,默认空白字符为分隔符
awk -v FS=':' '{print $1,FS,$3}’ /etc/passwd
awk –F: '{print $1,$3,$7}’ /etc/passwd

OFS:输出字段分隔符,默认为空白字符,使用,号进行使用,也可以命令内部使用OFS的变量
awk -v FS=‘:’ -v OFS=‘:’ '{print $1,$3}’ /etc/passwd
awk -v FS=":" -v OFS=": " '{print $1OFS$3}' /etc/passwd


RS:输入记录分隔符,指定输入时的换行符,原换行符仍有效
[root@localhost ~]#awk -v RS=" " '{print NR,$0}' /root/f1.test
1 aaa
2 bbb
3 ccc
abcd
4 bcd
5 cd
efi
tge
slk
[root@localhost ~]#cat f1.test
aaa bbb ccc
abcd bcd cd
efi
tge
slk
[root@localhost ~]#     

ORS:输出记录分隔符,输出时用指定符号代替换行符

awk  -v ORS='###'‘{print }’ /root/f1.test
1 aaa bbb ccc###2 abcd bcd cd###3 efi###4 tge###5 slk###[root@localhost ~]#

NF:字段数量
awk -F: ‘{print NF}’ /etc/fstab,引用内置变量不用$ 显示每行的列数
awk -F: '{print $(NF-1)}' /etc/passwd    打印出倒数第二个字段
awk -F: '{print $NF}'/etc/passwd 打印最后一个字段

NR:行号
awk '{print NR}' /etc/fstab ; awk END'{print NR}' /etc/fstab

FNR:各文件分别计数,行号
awk '{print FNR}' /etc/fstab /etc/inittab

FILENAME:当前文件名
awk '{print FILENAME}’ /etc/fstab
[root@localhost ~]#awk '{print FILENAME}' /etc/fstab
/etc/fstab
/etc/fstab
/etc/fstab
/etc/fstab
/etc/fstab
/etc/fstab
/etc/fstab
/etc/fstab
/etc/fstab
ARGC:命令行参数的个数
awk '{print ARGC}’ /etc/fstab /etc/inittab
命令本身也是参数的个数
awk ‘BEGIN {print ARGC}’ /etc/fstab /etc/inittab
ARGV:数组,保存的是命令行所给定的各参数
awk ‘BEGIN {print ARGV[0]}’ /etc/fstab  /etc/inittab
awk ‘BEGIN {print ARGV[1]}’ /etc/fstab /etc/initt
{print ARGV[ARGC-1]}
BEGIN和END
BEGIN:模式指定了处理文本之前需要执行的操作
END   :模式指定了处理完所有行后执行的操作

-f scripfile 从脚本文件中读取awk命令

   awk -F: -f awk.txt /etc/passwd
   awk.txt
   {print $1,$3}
格式化输出printf:

printf 必须指定FORMAT,而且不会自动换行,如需换行需在FORMAT内添加 \n,FORMAT中需要分别为后面每个item指定格式符
格式符

%c    : 显示字符的ASCII码
%i和%d: 显示十进制整数
%e和%E: 显示科学计数法数值
%f    : 显示小数点
%g和%G: 以科学计算法显示数值
%s    :显示字符串
%u    :无符号整数
%%    : 显示%号自身

修饰符

#[.#] : 第一个数显示正数位数;第二个#表示小数点精度 如%3.1f
-     : 左对齐 如:%-15s  (默认是右对齐)
+     : 显示数值的正负符号 %+d

我们结合BEGIN 和格式符,修饰符进行语法使用

[root@localhost ~]#awk -F: 'BEGIN{print "user:--------------------UID:----------------------\n"}{printf "%-23s %-25d \n",$1,$3}' /etc/passwd 
user:--------------------UID:----------------------

root                    0                         
bin                     1                         
daemon                  2                         
adm                     3                         
lp                      4    
[root@localhost ~]#awk -F: 'BEGIN{print "user:--------------------UID:----------------------\n"}{printf "%-23s %25d \n",$1,$3}END{print "END结尾看看而己"}' /etc/passwd 
user:--------------------UID:----------------------

root                                            0 
bin                                             1 
daemon                                          2 
adm                                             3     
...
zhang                                        1000 
apache                                         48 
END结尾看看而己

当我们结合着一起使用时是不是感觉出来了,BEGIN的作用是在awk进行脚本内行间循环处理之前进行操作的,我们也可以在之后加END{语法}进行循环后的操作.

—这里注意一点,当printf使用时 必须指定 FORMAT

[root@localhost ~]#awk -F: 'BEGIN{print "user:--------------------UID:----------------------\n"}{printf "%-23 %25 \n",$1,$3}END{print "END结尾看看而己"}' /etc/passwd  
user:--------------------UID:----------------------
%25 
%25 
%25 
%25 
位置变量:

$0 , $1 这些在awk不是指的参数,而是指的awk执行操作时每行进行处理的列,$1表示第1列, 2... 0表示所有列即整行
如:

[root@localhost ~]#awk -F: '{print $1,$2,$3}END{print $0}' /etc/passwd
root x 0
bin x 1
daemon x 2
adm x 3
...
apache x 48
apache:x:48:48:Apache:/usr/share/httpd:/sbin/nologin
匹配模式
1.如果匹配模式为空,则表示匹配每一行
2./regular expression/
例如:

 仅处理只匹配到的行

         [root@CentOS ~]# awk -F: '\$NF~/bash\$/{print \$1,\$NF}' /etc/passwd 
         root /bin/bash
3.关系表达式;结果有真有假,当为真时才会被处理
如:
4.行范围 /pat1/,/pat2/
5.BEGIN/END模式
BEGIN{}: 仅在开始处理文件中的文本之前执行一次
END{} 仅在结束处理文件后文件之后执行一次

[root@localhost ~]#awk -F: '($3>=2&&$3<=10){print $1,$3}' /etc/passwd    
daemon 2
adm 3
lp 4
sync 5
shutdown 6
halt 7
常用的action

Expressions —表达式
Contronl Statements : if , while , for 等控制语句
Compound statements : 组合语句
input statements 输入语句
output statments 输出语句

操作符

算术运算操作符

x+y , x-y , x*y , x/y , x^y , x%y ,-x , +y

赋值操作符

 = , +=  ,  -=  ,  /=  ,  %=  ,  ^=  ,  ++  ,  --

比较操作符

\> , >= , < , <= , != , ==

模式匹配符

~:  是否匹配
!~: 是否不匹配

逻辑操作符

&& : 与   在awk中表示必须满足与的两个条件
 | |   : 或
 ! :非
控制语句
if(condition){statements}
if(condition)statements else{statement}
while(conditon){statements}
do {statements} while(conditon)
for(expr1;expr2;expr3){statements}
break continue exit
array [index] 

单分支if判断例子: if (condition){statements}

[root@localhost ~]#awk -F: '{if($3>=500)print $1,$3}' /etc/passwd   判断打印出uid大于等于500的账号和UID
systemd-bus-proxy 999
polkitd 998
unbound 997
libstoragemgmt 996
colord 995
saslauth 994
geoclue 993
nfsnobody 65534
chrony 992
setroubleshoot 991
gnome-initial-setup 990
zhang 1000

多分支if判断列子:if(condition) else{statements}

[root@localhost ~]#awk -F: '{if($3>=1000){printf "普通用户:%-25s\n",$1}else{printf "系统用户: %-25s\n",$1}}' /etc/passwd
系统用户: root                     
系统用户: bin                      
系统用户: daemon                   
系统用户: adm       
...               
普通用户:zhang                    
系统用户: apache   

while循环例子:while(condition)statement
依次显示grub2.cfg以空白字符开头中间任间包含linux16的行的列,并打印出列和列长

[root@localhost ~]#awk  '/^[[:space:]]*linux16/{i=1;while(i<=NF){print $i,length($i);i++}}' /etc/grub2.cfg       
linux16 7
/vmlinuz-3.10.0-514.el7.x86_64 30
root=UUID=241b7f92-047c-4d85-b0b3-2be915811ed5 46
ro 2
crashkernel=auto 16
rhgb 4
quiet 5
LANG=en_US.UTF-8 16
linux16 7
/vmlinuz-0-rescue-42b6aa44a83f48efa5f14aeb1eb12c90 50
root=UUID=241b7f92-047c-4d85-b0b3-2be915811ed5 46
ro 2
crashkernel=auto 16
rhgb 4
quiet 5

我们使用for语句编写上面的例子for(expr1;expr2;expr3){statements}

[root@localhost ~]#awk '/^[[:space:]]*linux16/{for(i=1;i<=NF;i++)print $i,length($i)}' /etc/grub2.cfg  
linux16 7
/vmlinuz-3.10.0-514.el7.x86_64 30
root=UUID=241b7f92-047c-4d85-b0b3-2be915811ed5 46
ro 2
crashkernel=auto 16
rhgb 4
quiet 5
LANG=en_US.UTF-8 16
linux16 7
/vmlinuz-0-rescue-42b6aa44a83f48efa5f14aeb1eb12c90 50
root=UUID=241b7f92-047c-4d85-b0b3-2be915811ed5 46
ro 2
crashkernel=auto 16
rhgb 4

next
能提前结束对本行的处理,提前进入下次循环;
例:

判断uid余2不等于0的次提前结束行处理和打印等于0的账号和UID
[root@localhost ~]#awk -F: '{if($3%2!=0)next;print $1,$3}' /etc/passwd
root 0
daemon 2
lp 4
shutdown 6
mail 8
games 12
ftp 14
systemd-network 192
polkitd 998
libstoragemgmt 996
关联数组

array[index-expression]

1. 可使用任意字符串;字符串要使用双引号
2. 如果某数组元素事先不存在,在引用时awk会自动创建此元素,为将其值初始化为“空串”;

[root@localhost ~]#awk 'BEGIN{weekdays["mon"]="Monday";weekdays["tue"]="Tuesday";print weekdays["mon"]}'
Monday
[root@localhost ~]#awk 'BEGIN{weekdays["mon"]="Monday";weekdays["tue"]="Tuesday";print weekdays["tue"]}'
Tuesday
3.如要遍历数组中的每个元素,要使用for循环 for (var in array ){for-body}

[root@localhost ~]#awk 'BEGIN{weekdays["mon"]="Monday";weekdays["tue"]="Tuesday";for(i in weekdays){print weekdays[i]}}'    
Tuesday
Monday

使用数组例子1:查看端口状态及统计

[root@localhost ~]#netstat -tan |awk '/tcp\>/{i[$NF]++}END{for(j in i)print j,i[j]}'
LISTEN 5
ESTABLISHED 1
[root@localhost ~]#

例子2:计算/etc/fstab内每行单词出现的次数

[root@localhost ~]#awk '{i=1;while(i<=NF){j[$i]++;i++}}END{for(i in j)print i,j[i]}' /etc/fstab     
man 1
and/or 1
UUID=17e5a40c-1872-45ce-807e-b196a3e299b2 1
maintained 1
xfs 3
15 1
Accessible 1
# 7
are 1
defaults 4
blkid(8) 1
/ 1
0 8
See 1
Sat 1
UUID=af4aacb5-abf4-4113-b19b-0542229824f1 1
Created 1
on 1
mount(8) 1
anaconda 1
fstab(5), 1
19:44:18 1
/app 1
/boot 1
UUID=a3e1d352-4dc8-4124-857c-367cecd5a86b 1
findfs(8), 1
2017 1
UUID=241b7f92-047c-4d85-b0b3-2be915811ed5 1
'/dev/disk' 1
by 2
/etc/fstab 1
pages 1
more 1
info 1
swap 2
Jul 1
filesystems, 1
reference, 1
for 1
under 1
[root@localhost ~]#

使用for语句
[root@localhost ~]#awk '{for(i=1;i<=NF;i++)j[$i]++}END{for(i in j)print i,j[i]}' /etc/fstab
man 1
and/or 1
UUID=17e5a40c-1872-45ce-807e-b196a3e299b2 1
maintained 1
xfs 3
15 1
Accessible 1
# 7
are 1
defaults 4
blkid(8) 1
/ 1
0 8
See 1
Sat 1
UUID=af4aacb5-abf4-4113-b19b-0542229824f1 1
Created 1
on 1
mount(8) 1
anaconda 1
fstab(5), 1
19:44:18 1
/app 1
/boot 1
UUID=a3e1d352-4dc8-4124-857c-367cecd5a86b 1
findfs(8), 1
2017 1
UUID=241b7f92-047c-4d85-b0b3-2be915811ed5 1
'/dev/disk' 1
by 2
/etc/fstab 1
pages 1
more 1
info 1
swap 2
Jul 1
filesystems, 1
reference, 1
for 1
under 1

数组切片

例: 查看本地访问IP的次数 使用了数组切片

[root@localhost ~]#netstat -tan|awk '/^tcp\>/{split($5,ip,":");count[ip[1]]++}END{for(i in count){print i,count[i]}}'
192.168.3.1 1
0.0.0.0 5
[root@localhost ~]#netstat -tan|awk '/^tcp\>/{split($5,ip,":");count[ip[2]]++}END{for(i in count){print i,count[i]}}' 
* 5
52563 1
[root@localhost ~]#netstat -tan|awk '/^tcp\>/{split($5,ip,":");count[ip[1]]++}END{for(i in count){print i,count[i]}}' 
192.168.3.1 1
0.0.0.0 5
[root@localhost ~]#
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

GNU AWK 的相关文章

  • 车票识别 OCR系统带GUI界面 完整代码数据 可直接运行

    项目结构 import argparse import codecs import logging import os import os path as osp import sys from guiocr import appname
  • spring知识巩固

    文章目录 前言 什么是spring Spring 特点 spring框架用到了哪些设计模式 Spring中有多少个模块 它们分别是什么 什么是AOP 谈谈你对Spring中AOP的理解 AOP应用场景 Spring AOP中名词的概念 Sp
  • 管理基础知识20

    波特五力模型 掌握 波特五力模型是迈克尔 波特 Michael Porter 于20世纪80年代初提出 他认为行业中存在着决定竞争规模和程度的五种力量 这五种力量综合起来影响着产业的吸引力以及现有企业的竞争战略决策 五种力量分别为同行业内现
  • K8S集群搭建笔记

    K8S集群搭建笔记 1 Master的创建及配置 1 1 环境准备 1 2 初始化主节点 1 2 1 修改主节点配置信息 1 2 2 初始化主节点 kubeadm init 1 2 3 配置kubectl 1 2 4 检查master配置是
  • 队列基础使用示例与通过队列实现线程通信

    目录 一 队列基础解释 二 ConcurrentLinkedDeque 并发非阻塞式队列 三 BlockingQueue 阻塞队列 ArrayBlockingQueue LinkedBlockingQueue PriorityBlockin
  • idea编译时不提示任何错误信息解决方案

    问题描述 idea中 实现某个接口不提示导包 不提示实现方法 甚至 随便输入任何信息都不报错提示 解决方法一 1 打开File gt Settings gt Build Execution Deployment gt Compiler 2
  • CGAL功能大纲

    CGAL功能大纲 Computational Geometry Algorithms Library CGAL 计算几何算法库 使用C 语言编写的 提供高效 可控的算法库 广泛应用于计算几何相关领域 如地理信息系统 计算机图形学 计算机辅助
  • sonarqube安装

    开发十年 就只剩下这套Java开发体系了 gt gt gt 1 下载 下载地址 https www sonarqube org 2 Linux安装 解压 sonarqube zip 进入sonarqube 7 1 bin linux x86
  • jpa简介

    一 JPA是什么 1 JPA简介 JPA是Java Persistence API的简称 中文名Java持久层API 是JDK 5 0注解或XML描述对象 关系表的映射关系 并将运行期的实体对象持久化到数据库中 2 JPA 提供商 Hibe
  • 求最大公约数和最小公倍数的方法

    一 求最大公约数 1 辗转相除法 最推荐 不用管a b谁大谁小 如果b大 经过一次循环 a b会交换位置 include
  • html和js的学习

    链接如下 html https www runoob com html html attributes html js https www runoob com js js tutorial html
  • Gradle系列

    gradle idea使用 Gradle的使用教程 https blog csdn net qq 22172133 article details 81513955 原文网址 https www jianshu com p 46e7a916
  • Android强大的原生调试工具adb的常用命令

    文章目录 ADB简介 常用命令 列出链接的设备 进入设备的shell环境 设备日志 安装应用程序 卸载应用程序 将本地文件复制到调试设备上 将设备上的文件拉取到本地 启动程序 强制停止程序运行 截图 屏幕录制 列出调试设备所有的应用的报名
  • 说说数据一致性有哪几种?

    分析 回答 一般来说 数据一致性模型可以分为强一致性和弱一致性 强一致性也叫做线性一致性 除此以外 所有其他的一致性都是弱一致性的特殊情况 弱一致性根据不同的业务场景 又可以分解为更细分的模型 不同一致性模型又有不同的应用场景 强一致性 当
  • ETest_Tester-装备外场试验综合测试仪

    1 产品简介 装备外场试验综合测试仪ETest Tester是用于各行业装备软件研发 测试部门或者质量管理部门外场装备测试的综合测试设备 该设备由硬件和软件两部分组成 硬件采用全封闭 无风扇铝合金结构 嵌入式X86架构主板 软件部分包括操作
  • 苦逼的是怎么又有东西没记住,但我们依然每天坚持一遍、一遍又一遍指导记住为止。

    期待的是可以检验自己学习的成功 苦逼的是怎么又有东西没记住 但我们依然每天坚持一遍 一遍又一遍指导记住为止 原本以为大家会把讲过的都记录下来 以便日后毕业复习 事实证明18岁的我还是太年轻 一切想象的太美好 三番五次督促整理到自己笔记上 可
  • python基础—图形开发

    python基础 图形开发 python图形界面开发 认识tkinter模块 窗体的基本设置方法 几何布局管理器 pack布局管理器 grid布局管理器 place布局管理器 使用tkinter设计计算器程序 Python事件处理 常用tk
  • C++11实现的数据库连接池

    它什么是 数据库连接池负责分配 管理和释放数据库连接 它允许应用程序重复使用一个现有的数据库连接 而不是再重新建立一个 类似的还有线程池 为什么要用 一个数据库连接对象均对应一个物理数据库连接 每次操作都打开一个物理连接 使用完都关闭连接
  • markdown使用文档(Typora 快捷键)

    markdown 更简洁 更高效 强烈建议开发者认真阅读本文档 掌握md及HBuilderX对md的强大支持 窄屏幕下 可按Alt 滚轮横向滚动 很多人只把markdown用于网络文章发表 这糟蹋了markdown markdown不止是H
  • 对numpy.c_的理解

    文章目录 文档描述 关于python科学计算 pandas numpy 中axis 轴 的理解 理解 文档描述 来自官方文档的叙述 这里只简单翻译一部分 numpy c numpy c

随机推荐

  • Python 7.OpenCV 获取执行时间 抠图添加到另一个图、按位运算

    与运算 对掩膜的白色区域保留 黑色区域去除 非运算 取反运算 黑变白 白变黑 import cv2 import numpy as np from matplotlib import pyplot as plt img1 cv2 imrea
  • 1.4 新倚天屠龙之Java传--夜谈Java的运行

    黑夜迅速从地球另一端弥漫而来 重新又笼罩起了这块孤独的荒岛 但是冰火岛中这一束火光打破了这无边的寂寥 带了了一丝丝温馨 张翠山夫妇和谢逊 还有这便宜儿子Neo吃起了简陋的篝火晚餐 虽然只有烤鱼跟野菜汤 但是因为殷素素的精心准备还是比较可口的
  • Apache log4j2远程代码执行漏洞复现

    Apache Log4j2远程代码执行漏洞 声明 漏洞描述 漏洞影响范围 漏洞复现 验证工具 JNDI注入 JNDI注入原理 jndi注入的利用条件 复现过程 深度利用 反弹shell 防御措施 缓解措施 声明 首先声明一下 图片上有Fre
  • input框输入实时检测校验

    1 只能输入英文 数字且必须以英文开头
  • 黑马程序员并发笔记-juc并发以及锁原理-总集篇-结合自己的思考和心得完整版

    黑马程序员并发编程笔记 一 进程的概念 黑马程序员并发编程笔记 二 java线程基本操作和理解 java并发编程笔记 三 管程 一 java并发编程笔记 三 管程 二 java并发编程笔记 三 管程 三 java并发编程笔记 三 管程 四
  • 同步和异步的区别

    同步 同指一个进程在执行某个请求的时候 若该请求需要一段时间才能返回信息 那么这个进程将会一直等待下去 直到收到返回信息才继续执行下去 异步 是指进程不需要一直等下去 而是继续执行下面的操作 不管其他进程的状态 当有消息返回时系统会通知进程
  • 关于socket的各种错误码

    1 INVALID SOCKET 表示该 socket fd 无效 如 accept 2 或 socket 2 等在创建socketfd时 int m socket socket AF INET SOCK STREAM 0 if m soc
  • Python操作MySQL数据库

    1 查询操作 注意 Python查询Mysql使用 fetchone 方法获取单条数据 使用fetchall 方法获取多条数据 fetchone 该方法获取下一个查询结果集 结果集是一个对象 fetchall 接收全部的返回结果行 rowc
  • SpringBoot日志

    application properties logging level com atguigu trace spring profiles active dev logging path 不指定路径在当前项目下生成springboot l
  • 启用springboot security后登录web页面需要用户名和密码之默认的用户名和密码

    问题 注意 本人使用的Spring Boot 2 0 2 对1 5 x系列未必有用 官方文档在这里 直接解决办法 0 移除spring boot starter security依赖 如果没有实际使用security的功能 可以直接移除sp
  • RHEL 7.3 根密码重置

    环境 win10 RedHat Enterprise Linux 7 2 目的 重置Root 用户密码 操作 1 界面选择首项 e 进入编辑界面 2 linuxefi vmlinuz 3 10 0 327 末尾UTF 8 后添加 rd br
  • JS:颜色的格式转换(rgb、十六进制)

    简介 偶尔需要转换颜色格式 然后使用 如rgb和十六进制之间的互相转换 具体实现 使用 import TzColorExchangeStyle from colorExchange js console log TzColorExchang
  • 搜狗双拼口诀

    今天给大家介绍一下搜狗双拼口诀 掌握搜狗双拼输入法的难点是将其26个韵母对应的字母键位记忆到脑海中 比如 自然码方案的ang韵母对应于H键 ao韵母对应于K键 如果你没记住对应关系 那么搜狗双拼输入也就无从谈起了 通过搜狗双拼口诀 你可以很
  • IDEA添加自定义浏览器

    比如添加搜狗浏览器 1 打开setting 2 Tools gt Web Browsers 点 添加浏览器 3 点击文件夹图标 修改浏览器路径 4 找到搜狗浏览器的exe文件 5 修改浏览器的名字 然后点ok 6 完成 运行直接点击图标即可
  • Windows下php和apache的安装及启动

    php版本 php5 6 httpd版本 apache2 4 php5 6 在D盘下创建php文件夹 并在其下解压压缩包 修改系统变量PATH 末尾新增 D php D php ext httpd2 4 在D盘下创建Apache24文件夹
  • 操作系统复习知识点(第三章)

    处理机调度 1 高级调度 中级调度 低级调度 高级调度 根据某种算法 把外存上处于后备队列中的那些作业调入内存 作业调度 中级调度 为了提高内存利用率和系统吞吐量 使那些暂时不能运行的进程不再占用内存资源 将它们调至外存等待 把进程状态改为
  • HDU--1233:还是畅通工程 (并查集 & 最小生成树Prim)

    1 题目源地址 http acm hdu edu cn showproblem php pid 1233 2 简单思路 先对村庄距离从小到大排序 然后使用并查集的查找 一边查找一边加上村庄之间的距离 从而得到可以走通所有村庄的最短距离 3
  • 根据年月日计算星期几的函数

    大部分日期计算正常 2014 04 01 星期2 计算出来的星期不正确 原因 计算出来的 w可能出现负值 求负数的余数需要特殊处理 需要按数论的计算方式求余数 网上很多代码存在此问题 少数日期计算不正确 解决 负数先转为正数求余 然后求补
  • Android源码编译环境搭建

    一 前言 Google自 2021 年 6 月 22 日起 不再支持在 MacOS 上进行Android平台开发 某些芯片厂家提供的Android SDK不支持低版本的Ubuntu 16 04 LTS及以下 故本篇文章以Ubuntu18 0
  • GNU AWK

    awk awk官方给出的是 pattern scanning and processing language即模式扫描处理语言 我们CentOS一般用的是GNU AWK 官方给出的语法有五种 我们只举例前两种使用格式 下面是语法 gawk