当前位置:文档之家› awk工具使用说明

awk工具使用说明

awk工具使用说明
awk工具使用说明

Awk简单使用说明

第一节awk简介 (2)

第二节awk基础 (3)

第三节awk程序语法 (7)

第一节awk简介

awk语言是一种具有很强能力的模式匹配和过程语言。awk获取一个文件(或多个文件)来查找匹配特定模式的记录。当查到匹配后,即执行所指定的动作。作为一个程序员,你不必操心通过文件打开、循环读每个记录,控制文件的结束,或执行完后关闭文件。这些细节都是自动替你处理的.

awk自动读取文本文件中的每个记录(文本文件中每一行代表一个记录),把记录分成字段(默认情况下安空格分段),并在需要时进行类型转换。变量使用的方式确定了它的类型—不必声明变量的任何类型。当然,“标准的”C编程结构如if/else、do/while、for和while是支持的。awk不支持switch/case结构。awk支持C用于格式化输出的printf()还用于较简单输出的print命令。

一个例子:

1、有个文本文件xnmm.txt 内容如下图:

2、awk命令如下图:

运行这段命令回输出如下内容:

命令的作用:打印出xnmm.txt中的qq邮箱账号

分析哈:这段命令可以看成3部分组成:

(1)是awk命令,就不解释了。

(2)是awk程序源代码,这个必须用单引号引起来。这段代码可能会很长或者我们经常用,所以也可以保存在一个文本文件里,假如我们保存在 my.awk 中的话,就可以这样调用:awk -f my.awk xnmm.txt。继续分析代码含义,awk 程序主要由2部分组成(模式和动作),$1~/@https://www.doczj.com/doc/b310283740.html,/就是模式,模式返回true 的话,就会执行后面的动作{print $1}。在这里,Awk会扫描xnmm.txt的每一

行,并且把每一行按照空格分成若干字段,$1代表第一个字段,依次类推,$0代表整个记录。$1~/@https://www.doczj.com/doc/b310283740.html,/就是说,第一个字段里面是否含有@https://www.doczj.com/doc/b310283740.html,字符,有就返回turn,那么就可以执行{print $1},代表打印当前记录的第一个字段(3)是处理文件,也就是说我们要处理的数据的来源。后面会讲到,其他数据来源,比如一个ls命令后使用管道,在管道后使用awk命令,那么awk处理的数据就是ls输出的数据。

第二节awk基础

一、模式和动作

每个a w k语句由两部分组成:模式和动作。模式在动作执行时决定,当然动作是程序员要求发生什么。没有模式,动作总被执行(模式可以认为缺省值为t r u e”)。

有两种特定的模式(也称为块):B E G I N和E N D。从文件中读第一个记录前执行B E G I N代码,并用来初始化变量和设置像控制改变一类的事情。在到达文件结束后执行E N D 代码,并用来清理请求(像在报告上输出最后的总数)。其他的模式是对从文件读出的每个记录进行测试。

一般的格式是B E G I N块在顶上,然后是任何模式/动作时,最后是E N D块在底下。这不是语言的要求,而只是大多数人所采用的一种方式(主要是可读性原因)。

B E G I N和E N D块是可选的,当你利用这些块时,最大限度使用一个。不要编码两个B E G I N块,也不要编码两个E N D块。

模式在动作之前指定。模式可以是输入记录的匹配部分的正则表达式(包含在一对斜杠/ /中)或是含有比较操作符的表达式。模式还可以是由表达式和正则表达式结合起来或一系列模式所组成的复合或复杂的模式。

动作被包含在花括号({ })内,可以由一个或多个语句组成。省略模式部分时,其缺省值为t r u e,即导致对文件中的每行执行动作。当省略动作时,其缺省值为p r i n t $ 0(输出整个记录)

1. 正则表达式模式

正则表达式是用来指定和匹配字符串的表示法。正则表达式是由字符(像字母

A、B和C—与输入的字符相符)和元字符组成。元字符是具有特殊含义的字符,这些字符不匹配其本身,但执行某种特殊的功能。如图:

看下面例子:

2.比较操作符和模式

这些操作符是用来指定和比较值(包括字符串)的。正则表达式独自匹配输入记录的任何部分。通过把比较与正则表达式相结合,可以测试指定的字段。

最开始的例子就是啦

3. 复合模式操作符

这些操作符是用来把其他的模式(表达式或正则表达式)结合成复杂形式逻辑的表示法。

例子如下图:

4. 值域模式操作符

值域模式比其他类型的模式稍复杂些:当第一个模式匹配时设置为t r u e,并保持t r u e直到第二个模式变为t r u e。其要领是文件必须根据值域模式匹配的字段来排序。否则,有可能过早设置t r u e或提前终止。在值域模式中的各个模式是用逗号( , )分隔的。

例子:

1、打印的刚刚是xnmm.tex文件中的第2行到第6行

2、不解释,多理解这句话:当第一个模式匹配时设置为t r u e,并保持t r u e直到第二个模式变为t r u e。

二、编程

像C语言一样,a w k的最大优点是具有自由格式(一些情况例外)。空行是省略的。可以把语句置于同一行上,或按你的意愿以任何形式把语句分开。a w k识别空白,非常像C。如下的两行实质上是相同的:

在引号内的空格是有意义的,因为这些空格将出现在输出中,或是用来进行匹配的比较。其他空格是无意义的。还可以把动作分开(但必须在作为模式的同一行上有左花括号):

在一个动作内可以有多个语句。如果把语句放在同一行上,就需要利用分号( ; )来隔开语句(因此a w k能够告诉你,何时一个语句结束而下一个语句开始)。输出多行如下:

还可以把语句放置在单独的行上。这样做,不必用分号,编码如下:

应该做的另一件事是注释。在行上符号#之后的任何内容被a w k忽略。这些是为程序员阅读所设计的注释并有助于理解程序代码。一般来说,在程序中设置的注释越多,就越容易维护。

三、BEGIN和END块

BEGIN块中用来初始化操作,比如申明变量什么的。前面了解了模式和动作,模式用来匹配每行记录,匹配成功(也就是模式为true)就会执行动作,也就是说模式和动作能够被多次调用。而BEGIN和END只会被调用一次,BEGIN是在模式和动作之前调用,而END是在最后一行记录的模式和动作执行完后执行,你可以在END块中打印$0,会发现打印的是最后一条记录。

例子:现在我们把awk程序写在文本my.awk中

My.awk中内容如下:

执行:

解释哈:my.awk中的FS为系统变量,设置记录分割符用,默认使用空格分割

其中1-4行为begin块,6-10行为模式和动作,12-16为end块,NR也是系统变量代表当前记录行号,后面会继续讨论。

第三节awk程序语法

一、变量

除了简单地查找输出类型的程序外,还需要保存数据。保存数据是通过变量来实现的。在a w k内,共有三种类型的变量:字段,预定义和用户定义。已经看到头两个例子,$ 1是在输入记录中包含第一个字段的字段变量,而F S是包含字段分隔符的预定义变量。

用户定义的变量是由你创建的变量。与许多其他的语言不同,a w k在用变量前不要求你定义或声明变量。在C中,你必须声明含在变量内的数据的类型(例如i n t—整型,f l o a t—浮点数,c h a r—字符数据,等等)。在a w k中,只利用变量,a w k通过怎样用变量来设法确定变量中的数据。当你把字符数据存放在变量中时,就把它作为字符串来处理;当你把数字存放在变量中时,就作为数值来处理。

a w k还在数据类型之间进行转换。当你把字符串“1 2 3”存放在变量中,而后对它进行计算时,就把它作为数字来处理。这样是有危险的,当你对字符串“a

b c”进行计算时将会发生什么呢?a w k将试图把字符串转换为数字,从而得到一个转换错误,并把这个值作为数字来看待!这种类型的逻辑错误是难以排除的。

提示在BEGIN动作中初始化全部变量如下:

BEGIN {total = 0.0; loop = 0; first_time = "yes" }

像C语言一样,a w k要求变量以字母或下划线开头。字母可以是大写或小写。变量名的其余部分可以由字母、数字或下划线组成。最好的做法(对你自己和其他任何必须保存编码的人)是使变量名有意义,对变量加以描述。

虽然可以设置变量名为全部大写字母,但这是一种不好的做法,因为预定义变量(如N F或F S)是用大写字母表示的,输入小写字母的预定义变量(如n f或f s)是普遍的错误—这样从a w k得不到任何错误,因而这种失误可能是难以排除的。变量不能像专门的、大写字体的拼法,否则就得不到所要的结果

1、系统预定义变量

二、字符串

a w k支持两种一般类型的变量:数字(可以由字符0到9,+或-,以及小数点[ . ]组成)和字符(可以含有任何字符)。含有字符的变量一般称为字符串。字符串可以包含有效的数字,字一类的文本,或甚至格式化的电话号码。如果字符串含有一个有效数字,a w k 可以自动转换和利用它,就好像它是一个数字变量;如果你试图利用含有格式化电话号码或含有数字和字母的字符串(如“1 2 3 a

b c”)作为数字变量,a w k就会设法转换和利用,好像它是一个数字变量——这个变量含有值0。

1. 字符串常数

字符串常数总是包含在双引号(" ")内,并可以从0(空字符串)到很长的字符。实际的最大长度随U N I X的版本而不同。而我个人,还未达到过最大值。双引号并不存放在内存中。

一个典型的字符串常数看起来如下:

"Red Hat Linux Unleashed, Fourth Edition"

已在本章前面见到所用的字符串常数—与比较及p r i n t语句一起。

2. 字符串操作符

实际上仅有一种字符串操作符,即并置(c o n c a t e n a t i o n)。只要把字符串放在一起就可以组合多个字符串(在任何组合中的常数或变量)。清单2 6 - 1利用p r i n t语句来做这项工作,这里字符串“:”前置于输入记录($ 0)

3. 内部字符串函数

例子:

要求:我要打印xnmm.txt文件中的QQ号码(不要后面的@https://www.doczj.com/doc/b310283740.html,)

三、内部数字函数

四、算数操作符

五、条件流

通过利用i f语句在动作内也可以设条件程序流。

一般的i f语句流如下:

if (c o n d i t i o n)

当t r u e时执行的语句

e l s e

当f a l s e时执行的语句

e 1 s e是可选的。当有多个

要执行的语句时,如同在C语法中一样,必须把语句用花括号{ }括起来

六、循环

a w k程序本质上就是一个大循环—读输入文件中的每个记录并处理相应的模式和动作。

在动作内重复需要经常出现。a w k支持通过d o、f o r和w h i l e语句的循环,这些与C中可找到的循环相似。

正如if 语句一样,若要在循环中执行多个语句,就必须把语句包含在花括号内。

提示在多个语句的周围忘记花括号是使用条件和循环语句时通常的编程错误。

1. do语句

d o语句(有时称为do while语句)提供一种至少执行一次的循环结构。条件或判别出现在循环内容执行后。

d o语句采用如下的格式:

do

statement

while(condition)

s t a t e m e n t可以是一个语句或是包含在花括号内的多个语句。c o n d i t i o n是任何有效的判别,像if 语句所使用的判别,或用来触发动作的模式。

一般来说,必须改变循环内条件中的变量值。如不改变,就会有一个永远循环的条件,因为判别的结果( c o n d i t i o n )永不改变(成为f a l s e )。

2. for语句

for 语句提供一种在循环内改变值的循环结构。f o r语句适用于特定数目项的计数。for 语句有两种一般的格式如下:

for(loop=0; loop<10;1oop++)

statement

for(subscript in array)

statement

第一种格式初始化变量( l o o p=0 ),执行判别( l o o p < 1 0 ),然后执行循环内容( s t a t e m e n t )。接着,改变变量( l o o p++)并再判别。只要判别为t r u e,就执行s t a t e m e n t。在第二种格式中,根据在a r r a y中设置s u b s c r i p t的每个下标来执行s t a t e m e n t。这样,即使不知道下标的值也能通过数组来循环。在使用多维数组时,很有用途。

s t a t e m e n t可以是一个语句或包含在花括号内的多个语句。条件( l o o p<1 0 )是任何有效的判别,如if 语句所使用的判别,或用来触发动作的模式。

一般来说,不必去改变循环体内的循环控制变量( l o o p或s u b s c r i p t ),而是让for 语句替你去执行,否则可能会处于难以排错的境地。对于第一种格式,变量的改变可以是任何有效的操作(包括调用函数)。在大多数情况下,采用增量或减量操作。

提示这个例子说明了后置增量。利用后置( l o o p + + )还是前置( + + l o o p )增量都无关紧要—结果是相同的,并且完全一致。

f o r循环是一种通过未知大小的数据进行循环的好方法:

for(i=1:i<=NF;i++)

print $ i

在单行上输出当前记录的每个字段,作为一个程序员,在编写程序时我不知道一个特定的记录有多少个字段。当程序运行的时候,变量N F会告诉我。

3. while语句

最后的循环语句是w h i l e循环。这是最普通的循环,因为while 语句当条件为t r u e时执行。

一般的格式如下:

while(condition)

statement

s t a t e m e n t可以是一个语句或包含在花括号内的多个语句。c o n d i t i o n是任何有效的判别,如i f语句所使用的判别,或用来触发动作的模式。

如果在遇到w h i l e之前条件为f a l s e,那么不执行循环中的内容。这与d o不同,d o循环总是至少执行循环内容一次。

一般来说,必须改变循环内条件中的变量值。如不改变,就有一个永远循环的条件,因为判别的结果( c o n d i t i o n )永不改变(成为f a l s e )。

4. 循环控制

如果需要(不赋假值给条件中的变量),可以提前退出循环。a w k提供两个实现的工具: b r e a k和c o n t i n u e。

b r e a k导致退出当前(最内部)的循环。b r e a k的行为就像在f a l s e结果下立即执行条件判别。在循环中没有其余的代码(在b r e a k语句之后)执行,并且循环结束。当你需要处理某个错误或提前终止条件时,b r e a k是有用的。

c o n t i n u e使得当前的循环返回到条件判别。在循环中没有其余的代码(在c o n t i n u e语句之后)被执行,而且立即执行判别。当你需要暂时跳过(在该循环内)存在的代码时,c o n t i n u e是最有用的。c o n t i n u e与b r e a k是不同的,因为c o n t i n u e不强行结束循环。

AIX系统基本命令

AIX系统基本命令 mkdir:用于创建目录 $ mkdir oracle $ ls oracle $ rm:用于删除文件或目录(rm –r 删除目录时目录内有内容,用-r一起删除)$ rm -r oracle $ ls $ mv:用于改变文件或目录名 $ mkdir ll $ ls ll $ mkdir kk $ ls kk ll $ mv ll kk $ ls kk $ cd kk $ ls ll $ cd:用于进入系统某一级目录中去 $ cd / $ pwd / $ cd /home/oracle $ pwd /home/oracle $ ls 功能:显示目录中的内容,列出当前目录中所有文件的文件名 参数说明: a:列出目录中所有文件 d:列出所有子目录 l:列出长格式文件信息 举例: ls –a:列出当前目录中的所有文件 $ ls -a #UNTITLED# .dt createdbscripts oracle . .dtprofile dead_letter smit.log .. .profile ll smit.script .TTauthority .sh_history make.log websm.log .Xauthority afiedt.buf mbox websm.script $ ls –l:显示文件的详细信息 $ ls -l

-rw------- 1 201 dba 11174 Sep 17 09:15 err*.log drwxr-xr-x 3 201 dba 512 Sep 22 10:21 tra*.log -rw-r--r-- 1 201 dba 8971 Sep 20 11:08 smit.log -rw-r--r-- 1 201 dba 5437 Sep 20 11:08 smit.script -rw-r--r-- 1 201 system 1682 Sep 02 15:18 websm.log -rw-r--r-- 1 201 system 21441 Sep 02 15:10 websm.script (还有ls –rtl,ls –lt 等相关类似命令) $ date 功能:显示当前日期和时间,超级用户可以进行修改 举例:$ date Mon Sep 22 11:22:33 BEIST 2013 $ wc 功能:计算文件中的行数、字数和字符数 参数说明: c:计算字符数 l:计算行数 w:计算字数 举例: # wc profile 13 53 381 profile | | | 行数字数字符数 $ wc smit.log 422 1162 8971 smit.log $ who 功能:列出当前系统注册的用户 举例:$who am i-- 列出当前系统使用者身份 $ who oracle lft0 Sep 22 09:05 oracle pts/0 Sep 22 10:17 (192.168.100.79) oracle pts/4 Sep 22 09:05 (:0.0) $ who am i oracle pts/0 Sep 22 10:17 (192.168.100.79) $ finger 显示当前登陆到系统中的用户的信息 举例: # finger Login Name TTY Idle When Site I nfo oracle ??? *l0 2:02 Mon 09:05 oracle ??? p4 1:59 Mon 09:05 root ??? p0 Mon 11:06 # finger oracle

wc详解

wc命令参数及用法详解 wc命令的功能为统计指定文件中的字节数、字数、行数,并将统计结果显示输出。 语法:wc [选项] 文件... 说明:该命令统计指定文件中的字节数、字数、行数。如果没有给出文件名,则从标准输入读取。wc同时也给出所指定文件的总统计数。下面让我们来简单的看一下其支持的参数及其代表的含义。 参数及含义 举例 demo.txt Welcome to https://www.doczj.com/doc/b310283740.html, 欢迎来到这里 wc -cwl demo.txt #2 4 39 demo.txt 顺序依次是l w c 强调 这里面大家要注意一点。m和c参数是不能共存的,只有一个可以起作用,看哪个参数在后面。例如: wc -c demo.txt #39 demo.txt wc -m demo.txt #33 demo.txt wc -cml demo.txt #2 33 demo.txt wc -cm demo.txt #33 demo.txt 结果为m的值哦

举一反三 需要把一个文件的行数存在另一个文件里。可是这个wc还会同时输出文件名。咋办?简单,用管道处理一下OK啦 wc -l demo.txt | awk 'BEGIN{FS=" "}{print $1}' 这样,我们就把想要的文件行数给取到了,至于存在另一个文件里,我们可以把awk的print结果重定向到文件。 重要提示 用wc处理文件的时候,一定要在文件末尾存在换行符,否则统计的行数是不正确的。当然多几个换行符是没有问题的。 echo "UNIX" | wc -l # 1 echo -n "UNIX" | wc -l # 0 echo "UNIX\n\n\n" | wc -l # 1 今天看到的命令是:ls -l | wc -l 用来统计当前目录下的文件数

Shell 经典实例

Thizlinux 系统教程 Shell 经典实例 ----------------Milo 经典小shell 1 列目录树的shell 脚本如下: #!/bin/sh # dtree: Usage: dtree [any directory] dir=${1:-.} (cd $dir; pwd) find $dir -type d -print | sort -f | sed -e "s,^$1,," -e "/^$/d" -e "s,[^/]*/([^/]*)$,`----1," -e "s,[^/]*/,| ,g" 2 while中使用read (file是一个文件) cat file | while read line do echo $line echo " :: Please input any key(s):c" str4read="" while true do chr4read=`dd if=/dev/tty bs=1 count=1 2>/dev/null` str4read=$str4read$chr4read if [ "$chr4read" = "" ] ;then break; fi

done echo " :: |$str4read|" done 3 将多个空格替换为字符 sed 's/[ ][ ]*/ /g' 如果空格与tab共存时用 sed -e 's/[[:space:]][[:space:]]*/ /g' filename 4用脚本实现分割文件 #!/bin/bash if [ $# -ne 2 ]; then echo 'Usage: split file size(in bytes)' exit fi file=$1 size=$2 if [ ! -f $file ]; then echo "$file doesn't exist" exit fi

员工转正申请书范文【三篇】

员工转正申请书范文【三篇】 尊敬的领导: 您好! XXX员工XXX,于20XX年XX月XX日加入公司,根据公司的需要,当前担任XXX一职,主要负责XXXX工作。本人做事具有较强的责任心 和进取心,对人热情,热爱现从事的人事工作。从我参加工作到现在,已有将近七个年头,所以,在之前的工作中,锻炼了我不惧怕困难与 团队合作的精神。但来到XXXX,这里的工作与环境又是一个新的开始,在领导的严格要求下,我的工作得到了提升,在同事的协助下,我的 工作得以顺利展开。现将这段时间的工作情况简要总结如下: 1、初到公司时,本人仅仅从公司简介以及同事们的口述中了解公司,对公司的理解仅仅是皮毛的话,那么随着时间的推移,我对公司 也有了更为深刻的了解。从一开始对工作的没有压力,到逐渐的感到 肩上的责任性,在这其中,我持续的学习与请教,就好比一辆新车, 在与公司的持续的实行磨合。到当前为止,这项工作我基本上能够掌握,但是我知道还有很多地方需要改善,还能够做得更好,我相信, 我也有那个信心,随意时间的推移,我会从这份工作中得到成长,同 时我也会把这份工作做得更加完善。 2、在本部门的工作中,我勤奋工作,获得了本部门领导和同事的 认同。当然,在工作中我也出现了一些小的差错和问题,部门领导也 即时给我指出,促动了我工作的成熟性。跟本部门的同事相处中也非 常融洽,有什么问题大家也都能够齐心协心,相互协助,所以,来到 这里,让我有种宾至如归的感觉,我相信,在一个团结协作的团队, 一定会是个强大的团队,所以,我为自己能加入这个团队感到荣幸与 骄傲。 3、在公司的领导下,我会更加严格要求自己,在作好本职工作的 同时,积极团结同事,任何事情沟通都是第一位的。在工作中,要持

awk命令

什么是awk? 你可能对UNIX比较熟悉,但你可能对awk很陌生,这一点也不奇怪,的确,与其优秀的功能相比,awk还远没达到它应有的知名度。awk是什么?与其它大多数UNIX命令不同的是,从名字上看,我们不可能知道awk的功能:它既不是具有独立意义的英文单词,也不是几个相关单词的缩写。事实上,awk是三个人名的缩写,他们是:Aho、(Peter)Weinberg 和(Brain)Kernighan。正是这三个人创造了awk---一个优秀的样式扫描与处理工具。 AWK的功能是什么?与sed和grep很相似,awk是一种样式扫描与处理工具。但其功能却大大强于sed和grep。awk提供了极其强大的功能:它几乎可以完成grep和sed所能完成的全部工作,同时,它还可以可以进行样式装入、流控制、数学运算符、进程控制语句甚至于内置的变量和函数。它具备了一个完整的语言所应具有的几乎所有精美特性。实际上,awk 的确拥有自己的语言:awk程序设计语言,awk的三位创建者已将它正式定义为:样式扫描和处理语言。 为什么使用awk? 即使如此,你也许仍然会问,我为什么要使用awk? 使用awk的第一个理由是基于文本的样式扫描和处理是我们经常做的工作,awk所做的工作有些象数据库,但与数据库不同的是,它处理的是文本文件,这些文件没有专门的存储格式,普通的人们就能编辑、阅读、理解和处理它们。而数据库文件往往具有特殊的存储格式,这使得它们必须用数据库处理程序来处理它们。既然这种类似于数据库的处理工作我们经常会遇到,我们就应当找到处理它们的简便易行的方法,UNIX有很多这方面的工具,例如sed 、grep、sort以及find等等,awk是其中十分优秀的一种。 使用awk的第二个理由是awk是一个简单的工具,当然这是相对于其强大的功能来说的。的确,UNIX有许多优秀的工具,例如UNIX天然的开发工具C语言及其延续C++就非常的优秀。但相对于它们来说,awk完成同样的功能要方便和简捷得多。这首先是因为awk提供了适应多种需要的解决方案:从解决简单问题的awk命令行到复杂而精巧的awk程序设计语言,这样做的好处是,你可以不必用复杂的方法去解决本来很简单的问题。例如,你可以用一个命令行解决简单的问题,而C不行,即使一个再简单的程序,C语言也必须经过编写、编译的全过程。其次,awk本身是解释执行的,这就使得awk程序不必经过编译的过程,同时,这也使得它与shell script程序能够很好的契合。最后,awk本身较C语言简单,虽然awk吸收了C语言很多优秀的成分,熟悉C语言会对学习awk有很大的帮助,但awk 本身不须要会使用C语言——一种功能强大但需要大量时间学习才能掌握其技巧的开发工具。 使用awk的第三个理由是awk是一个容易获得的工具。与C和C++语言不同,awk只有一个文件(/bin/awk),而且几乎每个版本的UNIX都提供各自版本的awk,你完全不必费心去想如何获得awk。但C语言却不是这样,虽然C语言是UNIX天然的开发工具,但这个开发工具却是单独发行的,换言之,你必须为你的UNIX版本的C语言开发工具单独付费(当然使用D版者除外),获得并安装它,然后你才可以使用它。

常用shell脚本

如何用脚本实现分割文件 #!/bin/bash if [ $# -ne 2 ]; then echo 'Usage: split file size(in bytes)' exit fi file=$1 size=$2 if [ ! -f $file ]; then echo "$file doesn't exist" exit fi #TODO: test if $size is a valid integer filesize=`/bin/ls -l $file | awk '{print $5}'` echo filesize: $filesize let pieces=$filesize/$size let remain=$filesize-$pieces*$size if [ $remain -gt 0 ]; then let pieces=$pieces+1 fi echo pieces: $pieces i=0 while [ $i -lt $pieces ]; do echo split: $file.$i: dd if=$file of=$file.$i bs=$size count=1 skip=$i let i=$i+1 done echo "#!/bin/bash" >; merge echo "i=0" >;>; merge echo "while [ $i -lt $pieces ];" >;>; merge echo "do" >;>; merge echo " echo merge: $file.$i" >;>; merge echo " if [ ! -f $file.$i ]; then" >;>; merge echo " echo merge: $file.$i missed" >;>; merge

Thizlinux 系统教程 Shell 经典实例

Thizlinux 系统教程Shell 经典实例 ----------------Milo经典小shell 1 列目录树的shell 脚本如下: #!/bin/sh # dtree: Usage: dtree [any directory] dir=${1:-.} (cd $dir; pwd) find $dir -type d -print | sort -f | sed -e "s,^$1,," -e "/^$/d" -e "s,[^/]*/([^/]*)$,`----1," -e "s,[^/]*/,| ,g" 2 while中使用read (file是一个文件) cat file | while read line do echo $line echo " :: Please input any key(s):c" str4read="" while true do chr4read=`dd if=/dev/tty bs=1 count=1 2>/dev/null` str4read=$str4read$chr4read if [ "$chr4read" = "" ] ;then break; fi done echo " :: |$str4read|" done 3 将多个空格替换为字符 sed 's/[ ][ ]*/ /g' 如果空格与tab共存时用 sed -e 's/[[:space:]][[:space:]]*/ /g' filename 4用脚本实现分割文件 #!/bin/bash if [ $# -ne 2 ]; then echo 'Usage: split file size(in bytes)' exit fi file=$1 size=$2 if [ ! -f $file ]; then echo "$file doesn't exist" exit fi #TODO: test if $size is a valid integer filesize=`/bin/ls -l $file | awk '{print $5}'` echo filesize: $filesize let pieces=$filesize/$size let remain=$filesize-$pieces*$size if [ $remain -gt 0 ]; then let pieces=$pieces+1 fi echo pieces: $pieces i=0 while [ $i -lt $pieces ]; do echo split: $file.$i: dd if=$file of=$file.$i bs=$size count=1 skip=$i let i=$i+1 done echo "#!/bin/bash" > merge echo "i=0" >> merge echo "while [ $i -lt $pieces ];" >> merge echo "do" >> merge echo " echo merge: $file.$i" >> merge echo " if [ ! -f $file.$i ]; then" >> merge echo " echo merge: $file.$i missed" >> merge echo " rm -f $file.merged" >> merge echo " exit" >> merge echo " fi" >> merge echo " dd if=$file.$i of=$file.merged bs=$size count=1 seek=$i" >> merge echo " let i=$i+1" >> merge echo "done" >> merge chmod u+x merge' 5得到上月未日期,格式为YYYYMMDD get_lastday_of_lastmonth() { yy=`date +%Y` mm=`date +%m-1|bc` [ $mm -lt 1 ] && mm=12;yy=`expr $yy - 1` aaa=`cal $mm $yy` dd=`echo $aaa|awk '{print $NF}'` echo $yy$mm$dd } print $NF的$NF是打印最后一个列。因为awk的内置变量NF是列的总数,而$NF就代表着最后一列 6 实现用backup或tar命令来做目录备份

ls -l命令详解

有几个字段老是记不住,就记载这里吧 ls -l 列表信息详解 我们平时用ls -l 命令查看一个目录下的文件和子目录的详悉信息时,会得到一个详细的文件和目录名列表.这个列表包含了文件的属性,所属用户,所属组,创建时间,文件大小等等信息.这些信息到底是什么意思呢?有很多初学者对这些不太了解,因此想详悉讲解一下用ls -l命令得到的文件列表每一个字段的意思 以笔者电脑的/root目录为例: [root@gucuiwen root]# ll 总用量 4055 -rw-r--r-- 1 root root 1581 11月 24 18:14 anaconda-ks.cfg drwxr-xr-x 2 root root 208 12月 1 13:50 babylinux -rw-r--r-- 1 root root 1474560 11月 25 15:02 babylinux.img -rw-r--r-- 1 root root 26829 11月 25 15:10 babylinux.png lrwxrwxrwx 1 root root 9 1月 4 11:06 disk1.link.png -> disk1.png -rw-r--r-- 1 root root 3209 11月 26 12:07 disk1.png -rw-r--r-- 1 root root 692 11月 26 13:16 disk2.png -rw-r--r-- 1 root root 718 11月 26 13:30 disk3.png drwx------ 8 root root 392 1月 4 08:40 evolution -rwxr-xr-x 1 root root 13695 11月 30 16:51 fangkuai.sh drwxr-xr-x 2 root root 208 12月 28 12:06 FreeBSD -rw-r--r-- 1 root root 2315 11月 25 17:19 getMBR.png brw-r----- 1 root root 3, 1 1月 4 11:06 hda1 drwxr-xr-x 2 root root 296 12月 31 11:53 htmls -rw-r--r-- 1 root root 21369 11月 24 18:12 install.log -rw-r--r-- 1 root root 3024 11月 24 18:12 install.log.syslog -rw-r--r-- 1 root root 293 1月 4 10:51 ls.txt -rw-r--r-- 1 root root 2237702 11月 25 15:09 magick.miff -rw-r--r-- 1 root root 13493 11月 25 17:31 mbr1.png -rw-r--r-- 1 root root 8123 11月 25 17:42 mbr2.png -rw-r--r-- 1 root root 512 11月 30 16:10 mbr.dat -rw-r--r-- 1 root root 64512 11月 26 15:33 partition.doc -rw-r--r-- 1 root root 49887 11月 26 15:32 partition.sxw -rw-r--r-- 1 root root 1541 12月 18 13:14 passwd -rw-r--r-- 1 root root 46320 11月 25 17:28 Screenshot-1.png -rw-r--r-- 1 root root 44145 11月 25 17:32 Screenshot-2.png -rw-r--r-- 1 root root 43732 11月 25 17:13 Screenshot.png drwxr-xr-x 3 root root 72 1月 4 10:49 test -rw-r--r-- 1 root root 0 12月 18 10:44 tset crw-r----- 1 root root 4, 65 1月 4 11:08 ttyS1

LINUX awk用法

AWK 尹会生 --2010.9.6注:本文档中的代码和图片均来自《sed与awk(第二版)》

一 编写awk脚本 HELLO,WORLD $ echo 'this line of data is ignored' > test $ awk '{ print "Hello, world" }' test Hello, world test文件只包含一行,因此,print操作只执行一次。 $ cat test2 Hello, world $ awk '{ print }' test2 Hello, world print语句没有参数,只简单输出每个输入行。 $ awk ‘BEGIN {print “hello,World”}’ Hello,World

BEGIN模式不需要等待输入,它在第一个输入行读入之前执行。 awk程序设计模型 awk程序由所谓的主输入(main input)循环组成。一个循环称作一个例程。awk允许你编写两个特殊的例程,他们在任何输入被读取前和所有输入都被读取后执行。他们是与BEGIN和END规则相关的过程。BEGIN和END过程是可选的。 模式匹配 src1.awk # test for integer, string or empty line. /[0-9]+/ { print "That is an integer" } /[A-Za-z]+/ { print "This is a string" } /^$/ { print "This is a blank line." }

一个特殊的例子: $ awk -f awkscr 4T That is an integer This is a string 一行可以匹配一条或多条规则 程序脚本的注释 # 以#号开始的一行 记录和字段 awk假设它的输入是有结构的,而不是一串无规则的字符。默认它将每个输入行作为一条记录,而将由空格或制表符分隔的单词作为字段。连续的多个空格和/或制表符被作为一个分隔符。 John Robinson 666-555-1111 字段的引用和分离 awk允许使用字段操作符$来指定字段。$后面可以跟着一个数字或者一个变量。$1表示第一个字段,$2表示第二个字段,$0表示整个输入记录。 $ awk '{ print $2, $1, $3 }' names Robinson John 666-555-1111

GAWK入门

GAWK 入门:AWK 语言基础 利用GAWK 的开放源代码实现学习AWK 了解A WK 文本处理和模式扫描语言的基本概念。本教程将带您开始使用A WK 进行编程:您将了解A WK 如何读取输入数据和对其进行排序、如何运行A WK 程序、操作数据并进行复杂的模式匹配。当您完成本教程的学习时,同时也了解了GNU A WK (GA WK)。 开始之前 了解本教程中介绍的内容、如何最好地利用它以及在学习本教程的过程中需要完成哪些工作。 关于本教程 GNU A WK (GAWK) 是历史悠久的A WK 编程语言的开放源代码实现,可用于所有的UNIX? 系统。A WK 语言是一种UNIX 备用工具,它是一种功能强大的文本操作和模式匹配语言,特别适用于进行信息检索,这使得它非常适合用于当今的数据库驱动的应用程序。因为它集成于UNIX 环境,所以可以设计、构建和快速地执行完整的工作程序,并且立即就能得到结果。 本教程为A WK 文本处理语言提供了实践性的介绍。它介绍了如何使用开放源代码GA WK 解释器来编写和执行A WK 程序,以便通过各种方式来搜索和操作数据。 目标 本教程面向那些需要利用A WK 强大的文本操作功能的读者。在本教程中,您将使用GA WK,以了解各种运行A WK 程序的方法。您还将了解如何组织程序,并学习A WK 的记录和字段范例。在完成本教程后,您可以学习到该语言的基本内容,包括格式化输出、记录和字段操作以及模式匹配。您还应该能够编写自定义的A WK 程序,以使用UNIX 命令行执行复杂的文本处理。 先决条件 本教程没有特殊的先决条件,不过您应该熟悉UNIX 命令行Shell 的使用。如果您对 C 编程语言的构造比较熟悉,那么将会很有帮助,但这并不是必需的。 系统要求 您必须在系统中安装GA WK 的工作副本,最好是V ersion 3.0 或更高版本。很容易获得GA WK 的源代码和二进制包。如果您使用源代码安装GA WK,请参考GA WK 源代码分发版中的README 文件,其中列出了进行成功的编译和安装所需的任何附加软件。

Linux常用的系统监控shell脚本

https://www.doczj.com/doc/b310283740.html,下面是我常用的几个Linux系统监控的脚本,大家可以根据自己的情况在进行修改,希望能给大家一点帮助。 1、查看主机网卡流量 1.#!/bin/bash 2. 3.#network 4. 5.#Mike.Xu 6. 7.while : ; do 8. 9.time=’date +%m”-”%d” “%k”:”%M’ 10. 11.day=’date +%m”-”%d’ 12. 13.rx_before=’ifconfig eth0|sed -n “8″p|awk ‘{print $2}’|cut -c7-’ 14. 15.tx_before=’ifconfig eth0|sed -n “8″p|awk ‘{print $6}’|cut -c7-’ 16. 17.sleep 2 18. 19.rx_after=’ifconfig eth0|sed -n “8″p|awk ‘{print $2}’|cut -c7-’ 20. 21.tx_after=’ifconfig eth0|sed -n “8″p|awk ‘{print $6}’|cut -c7-’ 22. 23.rx_result=$[(rx_after-rx_before)/256] 24. 25.tx_result=$[(tx_after-tx_before)/256] 26. 27.echo “$time Now_In_Speed: “$rx_result”kbps Now_OUt_Speed: “$tx_result”kbps” 28. 29.sleep 2 30. 31.done 2、系统状况监控 1.#!/bin/sh 2. 3.#systemstat.sh

awk分隔符学习

3.请执行命令取出linux中eth0的IP地址(请用cut,有能力者也可分别用awk,sed命令答)。 解答: 说明:此题解答方法已经给大家讲解了不下15种,还可以有很多,在这里给大家着重讲下awk的技巧用法,希望大家能多重视老师的思路、思维过程,不过过分关注问题的答案,以便达到学一通十的效果。 方法一【此法为绿叶】:如果用awk来处理的话,一般的同学可能会用下面的办法实现: [root@oldboy ~]# ifconfig eth0|grep 'inet addr'|awk -F ":" '{print $2}'|awk '{print $1}' 10.0.0.162 小结:这个方法是常规方法,很好。但是我们有没有更简单的awk实现方法呢?往下看。 方法二【此法为小红花】:通过awk同时使用多个分隔符来实现: [root@oldboy ~]# ifconfig eth0|grep 'inet addr'|awk -F '[ :]' '{print $13}' 192.168.1.186 提示:本题通过使用空格或冒号来做分隔符,然后一次性取出结果,就是空格或冒号可以看做是同一个分隔符。

小结:这个方法很方便吧,同学们可以多用,选取包含IP 地址行的特殊关键字'inet addr’过滤然后,使用awk以空格和:同时做分隔符,然后取出需要的内容。 本答案的最大缺点就是计算$n的时候很费劲,因为inet 前面有多个空格,查到$13,真是不容易,如此看来从实现时间上可能还不如第一个方法快呢?那好引出我们今天的关键答案案例。 方法三【大红花出场】:通过awk同时使用多个分隔符,然后通过正则匹配多个分隔符的方法来实现: [root@oldboy ~]# ifconfig eth0 |awk -F '[ :]+' 'NR==2 {print $4}' 10.0.0.185 我们来说明下这个简单易用的好办法: 提示:本题NR是行号,分隔符+号匹配,[]里一个或多个任意一个分隔符,这里就是匹配一个或多个冒号或空格。1)awk -F 后面跟分隔符‘[空格:]+’,其中[空格:]多分隔符写法,意思是以空格或冒号做分隔,后面的"+"号是正则表达式,意思是匹配前面空格或冒号,两者之一的1个或1个以上。 2)NR==2和sed -n "2p",相当,意思都是选择第几行,例:[root@oldboy ~]# ifconfig eth0|awk NR==2

ubuntu shell 使用命令大全

ubuntu shell 使用命令大全 前言 下面的命令大都需要在控制台/ 终端/ shell 下输入。 控制台, 终端, 和shell 意味着同样一件事- 一个命令行界面,他可以用来控制系统。 打开一个控制台: 应用程序--> 附件--> 终端 任何一个使用'sudo' 作为前缀的命令都需要拥有管理员(或root) 访问权限。所以你会被提示输入你自己的密码。 安装升级 查看软件xxx安装内容 dpkg -L xxx 查找软件库中的软件 apt-cache search 正则表达式 或 aptitude search 软件包 显示系统安装包的统计信息 apt-cache stats 显示系统全部可用包的名称 apt-cache pkgnames 显示包的信息 apt-cache show k3b 查找文件属于哪个包 apt-file search filename 查看已经安装了哪些包 dpkg -l 查询软件xxx依赖哪些包 apt-cache depends xxx 查询软件xxx被哪些包依赖 apt-cache rdepends xxx 增加一个光盘源 sudo apt-cdrom add 系统升级 sudo apt-get update (这一步更新包列表) sudo apt-get dist-upgrade (这一步安装所有可用更新) 或者 sudo apt-get upgrade (这一步安装应用程序更新,不安装新内核等) 清除所有已删除包的残馀配置文件 dpkg -l |grep ^rc|awk '{print $2}' |sudo xargs dpkg -P 如果报如下错误,证明你的系统中没有残留配置文件了,无须担心。 dpkg: --purge needs at least one package name argument Type dpkg --help for help about installing and deinstalling packages [*]; Use `dselect' or `aptitude' for user-friendly package management; Type dpkg -Dhelp for a list of dpkg debug flag values; Type dpkg --force-help for a list of forcing options; Type dpkg-deb --help for help about manipulating *.deb files; Type dpkg --license for copyright license and lack of warranty (GNU GPL) [*]. Options marked [*] produce a lot of output - pipe it through `less' or `more' ! 编译时缺少h文件的自动处理 sudo auto-apt run ./configure 查看安装软件时下载包的临时存放目录

Linux awk命令详解

Linux awk命令详解 AWK介绍 0.awk有3个不同版本: awk、nawk和gawk,未作特别说明,一般指gawk。 1.awk语言的最基本功能是在文件或字符串中基于指定规则来分解抽取信息,也可以基于指定的规则来输出数据。完整的awk脚本通常用来格式化文本文件中的信息。 2.三种方式调用awk 1) awk [opion] 'awk_script' input_file1 [input_file2 ...] awk的常用选项option有; ① -F fs : 使用fs作为输入记录的字段分隔符,如果省略该选项,awk使用环境变量IFS的值 ② -f filename : 从文件filename中读取awk_script ③ -v var=value : 为awk_script设置变量 2) 将awk_script放入脚本文件并以#!/bin/awk -f 作为首行,给予该脚本可执行权限,然后在shell下通过键入该脚本的脚本名调用之。 3) 将所有的awk_script插入一个单独脚本文件,然后调用: awk -f awk脚本文件input_file(s) 3. awk的运行过程 1) awk_script的组成: ① awk_script可以由一条或多条awk_cmd组成,两条awk_cmd之间一般以NEWLINE分隔 ② awk_cmd由两部分组成: awk_pattern { actions } ③ awk_script可以被分成多行书写,必须确保整个awk_script被单引号括起来。 2) awk命令的一般形式: awk ' BEGIN { actions } awk_pattern1 { actions } ............ awk_patternN { actions } END { actions } ' inputfile 其中BEGIN { actions } 和END { actions } 是可选的。 3) awk的运行过程: ①如果BEGIN 区块存在,awk执行它指定的actions。 ② awk从输入文件中读取一行,称为一条输入记录。(如果输入文件省略,将从标准输入读取) ③awk将读入的记录分割成字段,将第1个字段放入变量$1中,第2个字段放入$2,以此类推。$0表示整条记录。字段分隔符使用shell环境变量IFS或由参数指定。 ④把当前输入记录依次与每一个awk_cmd中awk_pattern比较,看是否匹配,如果相匹配,就执行对应的actions。如果不匹配,就跳过对应的actions,直到比较完所有的awk_cmd。 ⑤当一条输入记录比较了所有的awk_cmd后,awk读取输入的下一行,继续重复步骤③和④,这个过程一

awk正则表达式介绍

awk命令详解 简单使用: awk :对于文件中一行行的独处来执行操作。 awk -F :'{print $1,$4}' :使用‘:’来分割这一行,把这一行的第一第四个域打印出来。 详细介绍: AWK命令介绍 awk语言的最基本功能是在文件或字符串中基于指定规则浏览和抽取信息,awk抽取信息 后,才能进行其他文本操作,完整的awk脚本通常用来格式化文本文件中的信息 1.调用awk: 第一种命令行方式,如: awk [-Field-separator] 'commands' input-file(s) 这里commands是真正的awk命令,[-F域分隔符]是可选的,awk默认使用空格分隔, 因此如果要浏览域间有空格的文本,不必指定这个选项,但如果浏览如passwd文件,此文件 各域使用冒号作为分隔符,则必须使用-F选项: awk -F : 'commands' input-file 第二种,将所有awk命令插入一个文件,并使awk程序可执行,然后用awk命令解释器作为脚 本的首行,以便通过键入脚本名称来调用它 第三种,将所有awk命令插入一个单独文件,然后调用,如: awk -f awk-script-file input-file -f选项指明在文件awk-script-file的awk脚本,input-file是使用awk进行浏览 的文件名 2.awk脚本: awk脚本由各种操作和模式组成,根据分隔符(-F选项),默认为空格,读取的内容依次放置到 对应的域中,一行一行记录读取,直到文件尾 2.1.模式和动作

任何awk语句都是由模式和动作组成,在一个awk脚本中可能有许多语句。模式部分决定动作语句何时触发及触发事件。动作即对数据进行的操作,如果省去模式部分,动作将时刻保持执行状态 模式可以是任何条件语句或复合语句或正则表达式,模式包含两个特殊字段BEGIN和END,使用BEGIN语句设置计数和打印头,BEGIN语句使用在任何文本浏览动作之前,之后文本浏览动作依据输入文件开始执行;END语句用来在awk完成文本浏览动作后打印输出文本总数和结尾状态标志,有动作必须使用{}括起来 实际动作在大括号{}内指明,常用来做打印动作,但是还有更长的代码如if和循环looping 语句及循环退出等,如果不指明采取什么动作,awk默认打印出所有浏览出的记录 2.2.域和记录: awk执行时,其浏览标记为$1,$2...$n,这种方法称为域标记。使用$1,$3表示参照第1和第3域,注意这里使用逗号分隔域,使用$0表示使用所有域。例如: awk '{print $0}' temp.txt > sav.txt 表示打印所有域并把结果重定向到sav.txt中 awk '{print $0}' temp.txt|tee sav.txt 和上例相似,不同的是将在屏幕上显示出来 awk '{print $1,$4}' temp.txt 只打印出第1和第4域 awk 'BEGIN {print "NAME GRADE\n----"} {print $1"\t"$4}' temp.txt 表示打信息头,即输入的内容的第一行前加上"NAME GRADE\n-------------",同时内容以tab分开 awk 'BEGIN {print "being"} {print $1} END {print "end"}' temp 同时打印信息头和信息尾 2.3.条件操作符: <、<=、==、!=、>=、~匹配正则表达式、!~不匹配正则表达式

正则表达式

正则表达式
目录
1. 引言 2. 基本语法 3. sed 4. awk 5. 练习:在 C 语言中使用正则表达式
1. 引言
以前我们用 grep 在一个文件中找出包含某些字符串的行,比如在头文件中找出一个宏定义. 其实 grep 还可以找出符合某个模式(Pattern)的一类字符串.例如找出所有符合 xxxxx@xxxx.xxx 模式的字符串(也就是 email 地址),要求 x 字符可以是字母,数字,下划 线,小数点或减号,email 地址的每一部分可以有一个或多个 x 字符,例如 abc.d@https://www.doczj.com/doc/b310283740.html,, 1_2@987-6.54,当然符合这个模式的不全是合法的 email 地址,但至少可以做一次初步筛选, 筛掉 a.b,c@d 等肯定不是 email 地址的字符串.再比如,找出所有符合 yyy.yyy.yyy.yyy 模 式的字符串(也就是 IP 地址),要求 y 是 0-9 的数字,IP 地址的每一部分可以有 1-3 个 y 字 符. 如果要用 grep 查找一个模式,如何表示这个模式,这一类字符串,而不是一个特定的字符串 呢?从这两个简单的例子可以看出,要表示一个模式至少应该包含以下信息: 字符类(Character Class):如上例的 x 和 y,它们在模式中表示一个字符,但是取 值范围是一类字符中的任意一个. 数量限定符(Quantifier): 邮件地址的每一部分可以有一个或多个 x 字符,IP 地址 的每一部分可以有 1-3 个 y 字符 各种字符类以及普通字符之间的位置关系:例如邮件地址分三部分,用普通字符@和. 隔开,IP 地址分四部分,用.隔开,每一部分都可以用字符类和数量限定符描述.为 了表示位置关系,还有位置限定符(Anchor)的概念,将在下面介绍.
规定一些特殊语法表示字符类,数量限定符和位置关系,然后用这些特殊语法和普通字符一 起表示一个模式,这就是正则表达式(Regular Expression).例如 email 地址的正则表达式 可以写成[a-zA-Z0-9_.-]+@[a-zA-Z0-9_.-]+\.[a-zA-Z0-9_.-]+,IP 地址的正则表达式可以 写成[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}.下一节介绍正则表达式的语法, 我们先看看正则表达式在 grep 中怎么用.例如有这样一个文本文件 testfile:
192.168.1.1
第 1 页 共 10 页

相关主题
文本预览
相关文档 最新文档