awk相关知识
-
Linux awk命令详解awk 是除了 sed 命令之外,Linux 系统中另一个功能比较强大的数据处理工具。下面良许小编就将从几个方面对于 Linux awk命令详解命令进行详述,希望对大家有所帮助。 和 sed 命令类似,awk 命令也是逐行扫描文件(从第一行到最后一行),寻找含有目标文本的行,如果匹配成功,则会在该行上执行用户想要的操作;否则不对行做任何处理。 awk 在读取文件内容的每一行时,将对比该行是否与给定的模式相匹配,如果匹配,则执行处理过程,否则对该行不做任何处理。如果没有指定处理脚本,则
-
如何使用 Awk 打印文件中的字段和列在 Linux Awk 命令系列介绍 的这部分,我们来看一下 awk 最重要的功能之一,字段编辑。首先我们要知道 Awk 会自动把输入的行切分为字段,字段可以定义为是一些字符集,这些字符集和其它字段被内部字段分隔符分离。Awk 输出字段和列如果你熟悉 Unix/Linux 或者懂得 bash shell 编程,那么你也应该知道内部字段分隔符(IFS)变量。Awk 默认的 IFS 是 tab 和空格。Awk 字段切分的工作原理如下:当获得一行输入时,根据定义的 IFS,第一个字符集是字段一,用 $1 表示,第二个字符集是字段二,用 $2 表示,第三个字符集是字段三,用 $3 表示,以此类推直到最后一个字符集。为了更好的理解 Awk 的字段编辑,让我们来看看下面的例子:事例 1:: 我创建了一个名为 tecmintinfo.txt 的文件。# vi tecmintinfo.txt# cat tecmintinfo.txt在 Linux 中创建文件然后在命令行中使用以下命令
-
Linux生产环境上,最常用的一套“AWK“技巧awk的命名得自于它的三个创始人姓别的首字母,都是80来岁的老爷爷了。当然也有四个人的组合:流行的GoF设计模式。但对于我这游戏爱好者来说,想到的竟然是三位一体,果然是不争气啊。它长的很像C,为什么这么有名,除了它强大的功能,我们姑且认为a这个字母比较靠前吧。awk比sed简单,它更像一门编程语言。打印某一列下面,这几行代码的效果基本是相同的:打印文件中的第一列。#JavaSystem.out.println(aStr.split(" ")[0]);#Pythonprint(aString.split(" ")[0])#cut 命令cut -d " " -f1 file#awk命令awk '{print $1}' file这可能是awk最常用的功能了:打印文件中的某一列。它智能的去切分你的数据,不管是空格,还是TAB,大概率是你想要的。对于csv这种文件来说,分隔的字符是,。AWK使用-F参数去指定。以下代码打印csv
-
Unix & Linux的文本处理工具 -- grep, sed & awk当大家看到标题时脑中闪过的大概是铺天盖地baidu, google出来的冗余的各类使用介绍,老生常谈希望能让大家对这三个文本工具有新的理解。1、grepgrep不做过多的介绍, 打印出匹配的行, 着重点在于输出结果并不对文本本身做修改。有个关于grep的小故事, 从sed和grep能追溯到最初的unix行编辑器ed而grep的命名代表 g(全局)/re(正则表达式)/p(打印)正是ed中全局打印行匹配的语法. grep自身的劣势在于无法实现多行匹配, 这时sed和awk相继出现弥补了grep的不足。2、sed和awk的比较在进入sed的相关讨论之前,先就sed跟awk之间进行简单的比较。1. 相似性可使用指定的脚本文件对相应文本进行编辑。sed -f 'script filename' or stdinawk -f 'script filename' or stdin默认全局匹配并且拥有自身的主输入循环。除去影响控制流的命令或语句(sed中: t,b; awk中continu
awk相关课程
awk相关教程
- 1.2 为什么用awk 我们日常工作中有很多需要格式化打印输出的需求,更多的是关注列操作时,就可以利用awk工具来进行处理。awk除了是工具也同样是一门语言,其允许用户创建简短的程序来处理自己的需求,这些程序读取输入文件、为数据排序、处理数据、对输入执行计算以及生成报表等。功能非常的强大,相信在掌握了awk,日常运维工作更加方便高效简单。
- 4.3 awk命令详解 4.3.1 awk 输出awk print输出,例如:print item1,item2...1.各字段之间逗号隔开,输出时以空白字符分隔;2.输出的字段可以为字符串或数值,当前记录的字段(如$1)、变量或 awk 的表达式;数值先会转换成字符串然后输出;3.print 命令后面的 item 可以省略,此时其功能相当于print $0,如果想输出空白,可以使用print "";例如:[root@master ~]# awk -F: '{print $1,$NF}' /etc/passwd|column -troot /bin/bashbin /sbin/nologindaemon /sbin/nologinadm /sbin/nologinlp /sbin/nologinsync /bin/syncawk printf 输出printf 命令的使用格式:printf <format> item1,item2...要点:1.其与 print 命令最大区别,printf 需要指定 format,format 必须给出;2.format 用于指定后面的每个 item 输出格式;3.printf 语句不会自动打印换行字符\n。format 格式的指示符都以 % 开头,后跟一个字符:%c:显示ascall码%d:%i:十进制整数%e,%E:科学计数法%f:浮点数%s:字符串%u:无符号整数%%:显示%自身修饰符:#[.#]:第一个#控制显示的宽度:第二个#表示小数点后的精度:%3.1f-:左对齐+:显示数组符号例如:[root@master ~]# awk -F: '{printf "Username:%-15s ,Uid:%d\n",$1,$3}' /etc/passwdUsername:root ,Uid:0Username:bin ,Uid:1Username:daemon ,Uid:2Username:adm ,Uid:3Username:lp ,Uid:4Username:sync ,Uid:5Username:shutdown ,Uid:64.3.2 awk变量记录变量:IFS(input field separator),输入字段分隔符(默认空白)OFS(output field separator),输出字段分隔符RS(Record separator):输入文本换行符(默认回车)ORS:输出文本换行符数据变量NR:the number of input records,awk 命令所处理的文件的行数,如果有多个文件,这个数目会将处理的多个文件计数NF:number of field,当前记录的 field 个数{print NF},{print $NF}ARGV:数组,保存命令行本身这个字符串ARGC:awk 命令的参数个数FILENAME:awk 命令处理的文件名称ENVIRON:当前 shell 环境变量及其值的关联数组awk 'BEGIN{print ENVIRON["PATH"]}'自定义变量-v var=value变量名区分大小写,例如:[root@master ~]# awk -v test="abc" 'BEGIN{print test}'abc[root@master ~]# awk 'BEGIN{var="name";print var}'name4.3.3 操作符算术运算+,-,*,/,^,%。例如:[root@master ~]# awk 'BEGIN{a=5;b=3;print "a + b =",a+b}'a + b = 8字符串操作无符号操作符,表示字符串连接,例如:[root@master ~]# awk 'BEGIN { str1="Hello,"; str2="World"; str3 = str1 str2; print str3 }'Hello,World赋值操作符:=,+=,-=,*=,/=,%=,^=,例如:[root@master ~]# awk 'BEGIN{a=5;b=6;if(a == b) print "a == b";else print "a!=b"}' a!=b[root@master ~]# awk -F: '{sum+=$3}END{print sum}' /etc/passwd72349比较操作符:>,>=,<,<=,!=,==模式匹配符:~:是否匹配!~:是否不匹配例如:[root@master ~]# awk -F: '$1~"root"{print $0}' /etc/passwdroot:x:0:0:root:/root:/bin/bash逻辑操作符:&& 、 || 、 !,例如:[root@master ~]# awk 'BEGIN{a=6;if(a > 0 && a <= 6) print "true";else print "false"}'true函数调用:function_name(argu1,augu2)条件表达式(三元运算):selection?if-true-expresssion:if-false-expression[root@master ~]# awk -F: '{$3>=100?usertype="common user":usertype="sysadmin";printf "%15s:%s\n",$1,usertype}' /etc/passwd root:sysadmin bin:sysadmin daemon:sysadmin adm:sysadmin lp:sysadmin sync:sysadmin shutdown:sysadmin halt:sysadmin4.3.4 Patternempty:空模式,匹配每一行/regular expression/:仅处理能被此处模式匹配到的行,例如;[root@master ~]# awk -F: '$NF=="/bin/bash"{printf "%15s,%s\n",$NF,$1}' /etc/passwd /bin/bash,rootrelational expression:关系表达式,结果为“真”有“假”,结果为“真”才会被处理。Tips:使用模式需要使用双斜线括起来,真:结果为非0值,非空字符串。[root@master ~]# awk -F: '$3>100{print $1,$3}' /etc/passwdsystemd-network 192polkitd 999ceph 167kube 998etcd 997gluster 996nfsnobody 65534chrony 995redis 994awk -F: '$NF=="/bin/bash"{printf "%15s,%s\n",$NF,$1}' /etc/passwdawk -F: '$NF~/bash$/{printf "%15s,%s\n",$NF,$1}' /etc/passwddf -Th|awk '/^\/dev/{print}'line ranges:行范围,制定startline,endline。[root@master ~]# awk -F: '/10/,/20/{print $1}' /etc/passwdgamesftpnobodysystemd-networkdbuspolkitdpostfixsshdcephkubeetcdglusterrpcBEGIN/END模式BEGIN{}:仅在开始处理文本之前执行一次END{}:仅在文本处理完成之后执行一次 [root@master ~]# awk -F: 'BEGIN{print "username uid\n--------------------"}{printf "%-15s:%d\n",$1,$3}END{print "-----------------\nend"}' /etc/passwdusername uid -------------------- root :0 bin :1 daemon :2 adm :3 lp :4 rpc :32 rpcuser :29 nfsnobody :65534 chrony :995 redis :994 ----------------- end4.3.5 控制语句if(condition) {statements},例如:[root@master ~]# awk -F: '{if($3>100) print $1,$3}' /etc/passwdsystemd-network 192polkitd 999ceph 167kube 998etcd 997gluster 996nfsnobody 65534chrony 995redis 994if(condition) {statments} [else {statments}],例如:[root@master ~]# awk -F: '{if($3>100) {printf "Common user:%-15s\n",$1} else {printf "sysadmin user:%-15s\n",$1}}' /etc/passwdsysadmin user:root sysadmin user:bin sysadmin user:daemon sysadmin user:adm sysadmin user:lp sysadmin user:sync sysadmin user:shutdown sysadmin user:halt sysadmin user:mail sysadmin user:operator sysadmin user:games
- 3. awk的处理模式 一般是遍历一个文件中的每一行,然后分别对文件的每一行进行处理。awk对输入的一行数据进行处理的模式,对整个文件进行重复执行此模式处理,在此说明对输入的一行数据处理的内在机制如下图所示:处理过程不断重复,直到到达文件结尾。首先读入文件流的一行到模式空间;在模式空间内,对内容进行模式匹配处理;然后输出处理后的数据内容;清空当前模式空间;读取第二行输入流到模式空间;又开始对模式空间内的第二行输入数据进行处理。总体可以分为以下三步:读(Read):AWK 从输入流(文件、管道或者标准输入)中读入一行然后将其存入内存中。执行(Execute):对于每一行输入,所有的 AWK 命令按顺序执行。 默认情况下,AWK 命令是针对于每一行输入,但是我们可以将其限制在指定的模式中。重复(Repeate):一直重复上述两个过程直到文件结束。
- 1.1 awk是什么 awk不同于grep的文本搜索与sed工具的文本处理,它更偏向于对文本的格式化处理输出,它不仅仅是一款工具,也是一门解释性语言,其名字来源于它的三位作者的姓氏:Alfred Aho, Peter Weinberger 和 Brian Kernighan,在文本处理功能非常强大,是一款Linux服务器文本报告生成器和格式化文本输出工具。
- 2.3 实现 核心利用 sed 代码:#!/bin/bash# auth:kaliarch# func:sys info check# version:v1.0# sys:centos6.x/7.x# 判断用户是否为root用户,如果非root则提示需要root用户执行脚本[ $(id -u) -gt 0 ] && echo "请用root用户执行此脚本!" && exit 1sysversion=$(rpm -q centos-release|cut -d- -f3)line="-------------------------------------------------"# 创建日志目录[ -d logs ] || mkdir logs# 定义日志文件sys_check_file="logs/$(ip a show dev eth0|grep -w inet|awk '{print $2}'|awk -F '/' '{print $1}')-`date +%Y%m%d`.txt"# 获取系统cpu信息function get_cpu_info() { Physical_CPUs=$(grep "physical id" /proc/cpuinfo| sort | uniq | wc -l) Virt_CPUs=$(grep "processor" /proc/cpuinfo | wc -l) CPU_Kernels=$(grep "cores" /proc/cpuinfo|uniq| awk -F ': ' '{print $2}') CPU_Type=$(grep "model name" /proc/cpuinfo | awk -F ': ' '{print $2}' | sort | uniq) CPU_Arch=$(uname -m)cat <<EOF | column -t CPU信息:物理CPU个数: $Physical_CPUs逻辑CPU个数: $Virt_CPUs每CPU核心数: $CPU_KernelsCPU型号: $CPU_TypeCPU架构: $CPU_ArchEOF}# 获取系统内存信息function get_mem_info() { check_mem=$(free -m) MemTotal=$(grep MemTotal /proc/meminfo| awk '{print $2}') #KB MemFree=$(grep MemFree /proc/meminfo| awk '{print $2}') #KB let MemUsed=MemTotal-MemFree MemPercent=$(awk "BEGIN {if($MemTotal==0){printf 100}else{printf \"%.2f\",$MemUsed*100/$MemTotal}}") report_MemTotal="$((MemTotal/1024))""MB" #内存总容量(MB) report_MemFree="$((MemFree/1024))""MB" #内存剩余(MB) report_MemUsedPercent="$(awk "BEGIN {if($MemTotal==0){printf 100}else{printf \"%.2f\",$MemUsed*100/$MemTotal}}")""%" #内存使用率%cat <<EOF内存信息:${check_mem}EOF}# 获取系统网络信息function get_net_info() { pri_ipadd=$(ip a show dev eth0|grep -w inet|awk '{print $2}'|awk -F '/' '{print $1}') pub_ipadd=$(curl ifconfig.me -s) gateway=$(ip route | grep default | awk '{print $3}') mac_info=$(ip link| egrep -v "lo"|grep link|awk '{print $2}') dns_config=$(egrep -v "^$|^#" /etc/resolv.conf) route_info=$(route -n)cat <<EOF | column -t IP信息:系统公网地址: ${pub_ipadd}系统私网地址: ${pri_ipadd}网关地址: ${gateway}MAC地址: ${mac_info}路由信息:${route_info}DNS 信息:${dns_config}EOF}# 获取系统磁盘信息function get_disk_info() { disk_info=$(fdisk -l|grep "Disk /dev"|cut -d, -f1) disk_use=$(df -hTP|awk '$2!="tmpfs"{print}') disk_inode=$(df -hiP|awk '$1!="tmpfs"{print}')cat <<EOF磁盘信息:${disk_info}磁盘使用:${disk_use}inode信息:${disk_inode}EOF}# 获取系统信息function get_systatus_info() { sys_os=$(uname -o) sys_release=$(cat /etc/redhat-release) sys_kernel=$(uname -r) sys_hostname=$(hostname) sys_selinux=$(getenforce) sys_lang=$(echo $LANG) sys_lastreboot=$(who -b | awk '{print $3,$4}') sys_runtime=$(uptime |awk '{print $3,$4}'|cut -d, -f1) sys_time=$(date) sys_load=$(uptime |cut -d: -f5)cat <<EOF | column -t 系统信息:系统: ${sys_os}发行版本: ${sys_release}系统内核: ${sys_kernel}主机名: ${sys_hostname}selinux状态: ${sys_selinux}系统语言: ${sys_lang}系统当前时间: ${sys_time}系统最后重启时间: ${sys_lastreboot}系统运行时间: ${sys_runtime}系统负载: ${sys_load}EOF}# 获取服务信息function get_service_info() { port_listen=$(netstat -lntup|grep -v "Active Internet") kernel_config=$(sysctl -p 2>/dev/null) if [ ${sysversion} -gt 6 ];then service_config=$(systemctl list-unit-files --type=service --state=enabled|grep "enabled") run_service=$(systemctl list-units --type=service --state=running |grep ".service") else service_config=$(/sbin/chkconfig | grep -E ":on|:启用" |column -t) run_service=$(/sbin/service --status-all|grep -E "running") ficat <<EOF服务启动配置:${service_config}${line}运行的服务:${run_service}${line}监听端口:${port_listen}${line}内核参考配置:${kernel_config}}# 获取系统用户信息function get_sys_user() { login_user=$(awk -F: '{if ($NF=="/bin/bash") print $0}' /etc/passwd) ssh_config=$(egrep -v "^#|^$" /etc/ssh/sshd_config) sudo_config=$(egrep -v "^#|^$" /etc/sudoers |grep -v "^Defaults") host_config=$(egrep -v "^#|^$" /etc/hosts) crond_config=$(for cronuser in /var/spool/cron/* ;do ls ${cronuser} 2>/dev/null|cut -d/ -f5;egrep -v "^$|^#" ${cronuser} 2>/dev/null;echo "";done)cat <<EOF系统登录用户:${login_user}${line}ssh 配置信息:${ssh_config}${line}sudo 配置用户:${sudo_config}${line}定时任务配置:${crond_config}${line}hosts 信息:${host_config}EOF}# 获取进程信息function process_top_info() { top_title=$(top -b n1|head -7|tail -1) cpu_top10=$(top b -n1 | head -17 | tail -10) mem_top10=$(top -b n1|head -17|tail -10|sort -k10 -r)cat <<EOFCPU占用top10:${top_title}${cpu_top10}内存占用top10:${top_title}${mem_top10}EOF}# 信息汇总function sys_check() { get_cpu_info echo ${line} get_mem_info echo ${line} get_net_info echo ${line} get_disk_info echo ${line} get_systatus_info echo ${line} get_service_info echo ${line} get_sys_user echo ${line} process_top_info}sys_check > ${sys_check_file}
- 5. 实例 1.统计/etc/fstab文件中每个单词出现的次数,并按从大到小排序awk '{for(i=1;i<=NF;i++){words[$i]++}}END{for(key in words)print key,words[key]}' /etc/fstab|sort -k2 -nrawk '{ips[$1]++}END{for(i in ips) print i,ips[i]}' access_nginx.log |column -t|sort -k2 -nr2.统计/etc/fstab每个文件系统类型出现的次数awk '!/^#/&&!/^$/{dev[$3]++}END{for(i in dev) print i,dev[i]}' /etc/fstab3.ping一个域名,输出ping此刻的时间ping baidu.com|awk '{print $0" "strftime("%Y-%m-%d %H:%M:%S")}'4.利用netstat监控服务是否正常监听netstat -lntup|awk 'NR>2{if($4 ~/.*:22/) print $0"yes";exit 0}'5.统计web服务器日志状态码awk '$9~"[0-9]"{stat[$9]++}END{for(i in stat) print i,stat[i]}' access_log
awk相关搜索
-
ajax
android
a href
abap
abap开发
abort
absolutelayout
abstractmethoderror
abstracttablemodel
accept
access
access教程
accordion
accumulate
acess
action
actionform
actionlistener
activity
addeventlistener