>

www.bifa688.comLinux下完成限制用户的登录地方

- 编辑:www.bifa688.com -

www.bifa688.comLinux下完成限制用户的登录地方

用户在报到时, 验证完passwd后, 依据shell的两样, 系统第三试行/etc下的有个别文件. sh,ksh是profile, csh是csh.cshrc, bash是bashrc. 在此刻对用户登入地方加以印证, 可堤防少数或者的intruder. 下边是本身用在SiemensHighlanderM600并行机上的/etc/profile的一段程序。

awk:

Linux文本处理工科具三徘徊花:

....

grep,sed,awk

grep:文本过滤器

....

grep:文本过滤

sed:流编辑器

# check for authenication

sed:文本编辑

awk:报告生成器(格式化现在,展现)

if [ -r /etc/checkfrom.awk ]; then

awk:文本格式化学工业具;

awk基本使用格式:

VALID=`finger | awk -f /etc/checkfrom.awk`

1 什么是awk、nawk、gawk

awk是一种用于拍卖数量和变化报告的UNIX编制程序语言。nawk时awk的新本子,gawk是基于Linux的GNU版本。

awk简介:

awk是一个姓氏的首字母,代表创制该语言的四个人小编:Ayr弗瑞德 V.Aho、Brian W.Kernighan、Peter J.Weinberger。当然也得以叫它wak或kaw,但常用的时awk。

早期编写于1977年,1985年能够改良以辅助越来越大的次第,还扩充了可用户自定义函数、动态正则表达式、相同的时候管理四个输入文件等职能。

awk版本:

awk的版本有过多,包蕴old awk、new awk、GNU awk(gawk)、POSIX awk等

awk [options] 'script' file1 file2 ...

if [ "$VALID" != "WELCOME" ]; then

2 awk的格式:

主导语法:awk [options] ‘program’ filename…

program: pattern{action statements}

awk [options] 'pattern {action}’ filename

慎选形式操作

options

-F (field separator)

有三种方法:

一、使用空白符分隔字段(默许值);这种情景下,记录的向导空白字符和结尾空白字符(空格和/或制表符)将被忽视。都算得二个空白字符。

2、使用其余单个字符来分隔字段。例如:awk -F “:” 或awk ‘BEGIN{FS=“:”}’

叁、使用持续二个字符作为字段分隔符,它将被当做三个正则表明式来解释。比如: FS=“[‘ :t]"

-v varsvalue (自定义变量)

awk [options] 'pattern  {action}' file1 file2 ...

echo "Intruder, GET AWAY FROM HERE!!!"

三 awk做事原理

行事遍历方式:迭代,循环

一、切片(注意:默许将空格符和制表符都视为空格,而且多少个延续的空格都实属三个(自动删除重复的空格))

贰、赋予变量  (将fs分隔后的字段都存入变量,整行存入$0)

三、遍历(循环每贰个字段,以字段为单位,非每行)

四、逐行 (读取1行,将pattern和action都实践到位,读取下一行)

pattern(模式):

awk方式用来支配awk对输入的公文实行什么样操作。情势由正则表明式、推断条件真伪的表明式或是二者的构成构成。

情势的特性

一、调整(形式调整action的界定:调整第一个左花括号{,到第一个右花括号}内的操作)

二、格局表明式暗含if(假设)的情致

范例:

# awk -F: '/root/{print NR,$1,$3,$5}$3<30{print NR,$0}' /etc/passwd

1 root 0 root

1 root:x:0:0:root:/root:/bin/bash

2 bin:x:1:1:bin:/bin:/sbin/nologin

3 daemon:x:2:2:daemon:/sbin:/sbin/nologin

4 adm:x:3:4:adm:/var/adm:/sbin/nologin

5 lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin

6 sync:x:5:0:sync:/sbin:/bin/sync

7 shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown

8 halt:x:7:0:halt:/sbin:/sbin/halt

9 mail:x:8:12:mail:/var/spool/mail:/sbin/nologin

10 operator 11 operator

10 operator:x:11:0:operator:/root:/sbin/nologin

11 games:x:12:100:games:/usr/games:/sbin/nologin

12 ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin

33 rpcuser:x:29:29:RPC Service User:/var/lib/nfs:/sbin/nologin

44 mysql:x:27:27:MariaDB Server:/var/lib/mysql:/sbin/nologin

说明

一、选项-F,以:为分隔符(暗许是以空格为分隔符,能够回顾)

二、同一条awk命令,能够有多个差异pattern和见仁见智action的组合

3、行号表明awk是逐行推行

4、pattern调节的限定验证,只好调整随行pattern的{}中的内容(玛瑙红部分是pattern一的调整操作结果,整行的是pattern二的垄断操作结果)

定界:addr1,addr2

表达式:$3 > 500

/pattern/ 格局,正则表明式

BEGIN{}:在遍历操作起来在此之前施行一回

END{}:在遍历操作结束之后、命令退出自签实行二遍

action:print,printf:用于可以落成格式化输出的工具

一、print

print的选拔格式:

print item1,item2,...

要点:

(一)各样目里面利用逗号隔绝,而输出时则以空白字符分割;

(2)输出的item可感到字符串或数值、当前记下的字段(如$1)、变量或awk的表明式;(数值会先转移为字符串,而后再出口;)

(叁)print命令前边的item能够省略,此时其功效相当于print $0;假诺想出口空白行,则供给采取print "";

例子:

awk 'BEGIN { print "line onenline twonline three" }'

awk -F: '{ print $1,$3 }' /etc/passwd

exit

四 awk格式化输出

print函数

print的行使格式:

print item1, item2, ...

要点:

壹、种种型里面利用逗号隔开,而输出时则以空白字符分隔;

2、输出的item可感到字符串或数值、当前记下的字段(如$一)、变量或awk的表达式;数值会先转移为字符串,而后再出口;

三、print命令后边的item能够轻松,此时其职能也便是print $0, 由此,假设想出口空白行,则须要运用print "";

例子:

# awk 'BEGIN { print "line onenline twonline three" }'

awk -F: '{ print $1, $3 }' /etc/passwd

printf函数

printf命令的采纳格式:

printf "format", item1, item2, ...

要点:

一、其与print命令的最大分歧是,printf要求钦定format;

贰、format用于钦定前面的每一种item的输出格式;

三、printf语句不会自行打字与印刷换行符;n

format格式的提示符都是%初步,后跟3个字符;如下:

%c: 显示字符的ASCII码;

%d, %i:10进制整数;

%e, %E:科学计数法突显数值;

%f: 展现浮点数;

%g, %G: 以科学计数法的格式或浮点数的格式突显数值;

%s: 显示字符串;

%u: 无符号整数;

%%: 显示%自身;

修饰符:

#[.#]: 展现上涨的幅度;

-: 左对齐;

:呈现数值符号;

例子:

# awk -F: '{printf "%-15s %in",$1,$3}' /etc/passwd

输出重定向

print items > output-file

print items >> output-file

print items | command

特别规文件讲述符:

/dev/stdin:标准输入

/dev/sdtout: 规范输出

/dev/stderr: 错误输出

/dev/fd/N: 某特定文件描述符,如/dev/stdin就一定于/dev/fd/0;

例子:

# awk -F: '{printf "%-15s %in",$1,$3 > "/dev/stderr" }' /etc/passwd

二、printf

printf命令的选拔格式:

printf format,item1,item2,...

要点:

(一)其与print命令的最大差异是:printf要求钦定format;

(二)format用于钦定前面的各类item的出口格式;

(叁)printf语句不会活动打字与印刷换行符:n

注意:在format格式中,格式与格式之间、字符串与字符串之间无需运用逗号“,”举办隔断。

format格式的指令符都以%开始,后跟三个字符,如下:

%c:突显字符的ASCII码

%d,%i:10进制整数

%e,%E:科学计数法显示数值

%f:突显浮点数

%g,%G:以科学计数法的格式或浮点数的格式呈现数值

%s:呈现字符串

%u:无符号整数

%%:显示%自身

修饰符:

N:展现升幅

-:左对齐

:显示数值符号

例子:

awk -F: '{printf "%-5dn",$3}' /etc/passwd

awk -F: '{printf "%-15s %in",$1,$3}' /etc/passwd

fi

5 awk变量

停放变量(Built-in Variables)

自定义变量(User-Defined Variables)

字段变量(Field Variables)

伍.一.1 awk内置变量之记录变量:

FS: input 田野(field)separator,读取文件本时,所选择字段分隔符;默以为空白字符

PRADOS: input Record separator,输入文本音信所采取的换行符;

OFS:Output Filed Separator:暗许为空白字符

O宝马7系S:Output Row Separator:默认为换行符

awk -F:

awk -v FS=“:” -v OFS=“#”

awk ‘BEGIN {FS=“:”;OFS=“#”} {print}'

五.壹.2 awk内置变量之数据变量:

N奥迪Q5: The number of input records,awk命令所拍卖的记录数;假设有八个文本,那么些数据会把拍卖的八个公文中央银行统一计数;

NF:Number of Field,当前记下的田野先生个数;(注意{print NF}和 {print $NF}的区别)

FNTucson: 与N奥德赛差别的是,FNEvoque用于记录正管理的行是当前这一文本中被一齐管理的行数(分别计数);

FILENAME: awk命令所管理的文书的称号;在命令中获取当前文件名

ALX570GC: awk命令的参数的个数;

A昂科雷GV: 数组,保存命令行本人这些字符串,如awk '{print $0}' a.txt b.txt那些命令中,ACRUISERGV[0]保存awk,ARGV[1]保存a.txt;

ENVIRON:当前shell情形变量及其值的涉及数组;

如:awk 'BEGIN{print ENVIRON["PATH"]}'

做计算器使用 awk BEGIN {print 一 1}

5.二 用户自定义变量

gawk允许用户自定义自身的变量以便在程序代码中应用,变量名命名规则与大诸多编制程序语言一样,只好动用假名、数字和下划线,且不能够以数字初叶。gawk变量名称区分字符大小写。

(一)命令行中赋值变量

-v var=value

-v num1=20 -v num2=32

例如:

awk -v var="variable testing" 'BEGIN{print var}'

(2)脚本程序(program)中赋值变量

例如:

awk 'BEGIN{var="variable testing";print var}'

5.3 字段变量

能够像用户自定义的变量同样使用,唯1的分别是它们引用了字段。

新的字段能够透过赋值来创制。如果字段变量引用的字段未有值,则被赋值为空白。

当字段的值发生变化时,awk会以OFS的值作为字段分隔符重新总计$0变量的值。

当不存在这么些字段,创立并赋值;存在该字段,覆盖原本的情节。

# awk ‘{ $5 = 1000 * $3 / $2; print }’ filename

# awk ‘$4 == “CA” { $4 = “California”;print}’ filename

三、awk变量

fi

6 awk的形式和操作:

awk 'program' input-file1 input-file2 ...

其中的program为:

pattern { action }

pattern { action }

...

六.一 常见的方式类型:

Summary of Patterns

empty {statements}

An empty pattern is considered to match every input line.

空情势,相配每一行

BEGIN {statements}

The statements are executed once before any input has been read.

奇怪格局,仅在awk命令实践前运转二回

END {statements}

The statements are executed once after all input has been read.

破例情势,仅在awk命令截至前运转贰遍

expression {statements}

The statements are executed at each input line wherethe expression is true, that is, nonzero or nunnull

当表明式为“真”输入行,试行statements;expression为真指的是其值非0或非空。

/regular expression/ {statements}

The statements are executed at each input line thatcontains a string matchedby regular expression.

正则表明式,仅处理相配的行

compound pattern {statements}

A compound pattern combines expressions with &&(AND),||(OR),!(NOT),and parentheses; the statements are executed at each input line wherethe compound pattern is true.

复合方式,将表明式用&&、||、!,以及括号组合起来;当compound pattern为真时,statements实践。

pattern1,pattern2 {statements}

A range pattern matches each input line from a line matched by pattern1 to the next line matched by pattern2,inclusive; the statements are executed at each matching line.

界定形式,startline,endline:/pattern1/,/pattern2/

# awk ‘/Tom/,/Suzanne/‘ filename

一、非只相当三遍,会频仍(选取关键字很关键);先匹配从第3个形式的第四回面世到首个情势的首回出现之间的剧情,然后相配从第三个格局的下叁回面世到第2个的下壹次出现,就那样推算。

贰、当未有找到第3个形式,会议及展览示从第三个方式出现的行到文本末尾。

专注:不帮助直接付出数字的格式

# awk -F: ‘(NR>=2&&NR<=10){print $1}’ /etc/passwd

BEGIN and END do not combine(组合) with other patterns. A range pattern cannot be part of any other pattern. BEGIN and END are the only patterns that require an action(不能够省略action).

例如:

条目1:# df -h|awk '!/^File/,gsub(/%/,"") {if($5>20){print $NF}}’

条目2:# df -h|awk '!/^File/gsub(/%/,"") {if($5>20){print $NF}}'

条目3:# df -h|awk 'gsub(/%/,""),!/^File/ {if($5>20){print $NF}}’

条目4:# df -h|awk '!/^File/&&gsub(/%/,"") {if($5>20){print $NF}}’

条目5:# df -h|awk 'gsub(/%/,"")&&!/^File/ {if($5>20){print $NF}}’

# df -h|awk 'gsub(/%/,"")&&!/^File/ {if($5>20) print $NF}'

# df -h|awk 'gsub(/%/,"")&&!/^File/&&$5>20 {print $NF}’

# df -h|awk '!/^File/{split($5,percent,"%");if(percent[1]>20){print $NF}}'

解释:

一、当pattern部分,多于1个方式时,八个格局间的逗号“,”功能,以及七个格局的依次很要紧,未有逗号或是调节顺序(条目款项2、3)都达不到想要的结果。

条目款项四、5中央银行使&&与条令一得以实现预期的结果。&&未有种种的限定。

小结建议:多情势,须求用&&,这样防止出现“,”和形式顺序的干扰。

二、action中,出现if语句,当statement只有一句,print $NF能够省略花括号{};当出现else,要求求加上花括号{};

Regular expression: 正则说明式

格式为 /regular expression/

是$0 ~/regular expression/的简写情势

^ 串首

$ 串尾

. 相配单个任性字符

* 相称零个或八个前导字符

 相称贰个或几个前导字符

? 相配零个或3个指路字符

[ABC] 相配ABC中任一字符

[^ABC] 相称不在ABC中的字符

[A-Z] 相配A到Z的任一字符

A|B 匹配A或B

(AB) 相称三个或多个A B的重组;比方

* 相配星号本人

& 用在轮换串中,代表查找串中相称的内容

expresssion: 相比表明式,其值非0或为非空字符时满意条件,如:$一 ~ /foo/ 或 $一 == "magedu",用运算符~(匹配)和!~(不匹配)。

比较表明式用来对文本行实行相比较,唯有标准为真,才实践内定的动作。

运算符

描述

范例

=, =,-=,*=,%=,^=

赋值运算符(Assignment Operators)

expr1 ?expr2 :expr3

C条件表明式(C Conditional Expression)

expression中不大概写推行语句,只好赋值变量

# awk -v num1=22 -v num2=31 'BEGIN {max=(num1>num2)?num1:num2;print “MAX number is "max}'

MAX number is 31

# awk -F: '{$3>=1000?usertype="Common User":usertype="Sysadmin or SysUser";printf " s:%-sn",$1,usertype}' /etc/passwd

&&(AND) ||(OR) !(NOT)

逻辑运算符(Logical Operators)

< <= == != > >= ~(match) !~(not match)

事关运算符 (Relational Operators)

- * / % ^

算术运算符(Arithmetic Operatiors)

(Increment Operator)

--(Decrement Operator)自增与自减运算符(Increment and Decrement Operators)

(正号),-(负号)

单目运算符

空格

拼接运算符

-赋值运算符(Assignment Operators)

=, =,-=,*=,%=,^=

-条件表明式(Conditional expression Operators)

expr1 ?expr2 :expr3

expression中不大概写实行语句,只好赋值变量

# awk -v num1=22 -v num2=31 'BEGIN {max=(num1>num2)?num1:num2;print “MAX number is "max}'

MAX number is 31

# awk -F: '{$3>=1000?usertype="Common User":usertype="Sysadmin or SysUser";printf " s:%-sn",$1,usertype}' /etc/passwd

-逻辑运算符(Logical Operators)

&&(AND) ||(OR) !(NOT)

-关系运算符 (Relational Operators)

< <= == != > >= ~(match) !~(not match)

-算术运算符(Arithmetic Operatiors)

- * / % ^

-自增与自减运算符(Increment and Decrement Operators)

(正号),-(负号), (Increment Operator),—(Decrement Operator)

-运算优先级依次(Precedence)

$

^

,-,!(正负号以及逻辑上not)

*,/,%(乘 除 除数)

,-

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

~,!~

&&

||

?:

=, =,-=,*=,/=,%=,^=

-复合形式

用逻辑运算符将格局组合起来产生的表达式。

# awk ‘!($2 < 100 && $3 < 20)’ filename

6.2 常见的Action

In a pattern-action statement, the pattern determines when the action is to be executed. Sometimes an action is very simple:a single print or assignment. Other times, it may be a sequence of several statements separated by newlines or semicolons.

This section begins the description of actions by discussing expressions and control-flow statements. The following sections present user-defined functions,and statements for input and output.

Actions

The statements in actions can include:

expressions: 包罗constants(常量),variables(变量),assignments(赋值),function calls(函数调用),etc

output statements

print expression-list

printf(format,expression-list)

system(“command")

input statements

close(file [,how])

getline

getline

getline var

getline var

next

nextfile

control statements

if (expression) statement [ else statement ]

while (expression) statement

do statement while (expression)

for (expression;expression;expression) statement

for (variable in array) statement

break

continue

exit [ expression ]

compound statements

三.一 awk内置变量之记录变量

FS:Fieldseparator,暗中同意是空白字符,钦点输入字段分隔符,读取文本时所运用字段分隔符;

LX570S:Record separator,暗中同意是换行符,钦命输入行分隔符,输入文本音信所接纳的换行符;

OFS:Output Field Separator,暗中认可是空白字符,内定输出字段分隔符

OHighlanderS:Out Record Separator,私下认可是换行符,内定输骑行分隔符

.....

7 调整语句:

七.1 条件语句

if-else

语法:if(condition) {statements}

if(condition) {statements} else {statements}

if (condition) {then-body} else {[ else-body ]}

专注:statement中唯有一条语句,{}可以轻易

# awk '{if ($3==0) {print $1, "Adminitrator";} else { print $1,"Common User"}}' /etc/passwd

例子:

awk -F: '{if ($1=="root") print $1, "Admin"; else print $1, "Common User"}' /etc/passwd

awk -F: '{if ($1=="root") printf "%-15s: %sn", $1,"Admin";else printf "%-15s: %sn", $1, "Common User"}' /etc/passwd

awk -F: '{if ($1=="root"){printf "%-15s: %sn", $1,"Admin”}else{printf "%-15s: %sn", $1, "Common User"}}' /etc/passwd

awk -F: '{if ($1=="root"){printf "%-15s: %sn", $1,"Admin”}else printf "%-15s: %sn", $1, "Common User"}' /etc/passwd

在意:statement中只有一条语句,要是有else分支语句,要么将else前边的说话加分号;或是将前方的讲话加上花括号{};else前边假若只有1个言语,加不加{}都能够。

小结:防止麻烦,将单个语句或多少个语句都抬高花括号{}。

awk -F: -v sum=0 '{if ($3>=500) sum }END{print sum}' /etc/passwd

7.二 循环(while循环、for循环和特别for循环)

7.2.1 while循环

语法: while (condition){statement1; statment2; …}

规范“真”,进入循环;条件“假”,退出循环;

何为“真”:非0时就为“真”

awk -F: '{i=1;while (i<=3) {print $i;i }}' /etc/passwd

awk -F: '{i=1;while (i<=NF) { if (length($i)>=4) {print $i}; i }}' /etc/passwd

awk '{i=1;while (i<=NF) {if ($i>=100)   print $i; i }}' hello.txt

hello.txt文件的剧情为一批随机数。

柒.2.2 do-while循环 至少实施三次循环体,不管条件知足与否

语法: do {statement1, statement2, ...} while (condition)

awk -F: '{i=1;do {print $i;i }while(i<=3)}' /etc/passwd

awk -F: '{i=4;do {print $i;i--}while(i>4)}' /etc/passwd

7.2.3 for循环

语法: for ( variable assignment; condition; iteration process) { statement1, statement2, ...}

awk -F: '{for(i=1;i<=3;i ) print $i}' /etc/passwd

awk -F: '{for(i=1;i<=NF;i ) { if (length($i)>=4) {print $i}}}' /etc/passwd

7.二.4 for特殊循环 还足以用来遍历数组成分:

语法: for (i in array) {statement1, statement2, ...}

awk -F: '$NF!~/^$/{BASH[$NF] }END{for(A in BASH){printf "s:%in",A,BASH[A]}}' /etc/passwd

7.2.5 case

语法:switch (expression) { case VALUE or /REGEXP/: statement1, statement2,... default: statement1, ...}

7.贰.陆 循环调节break 和 continue

常用来循环或case语句中

柒.三 程控语句 (next和exit)

next语句

提前甘休对行当文本的管理,并随之管理下壹行;例如,上边包车型大巴一声令下将显示其ID号为奇数的用户:

# awk -F: '{if($3%2==0) next;print $1,$3}' /etc/passwd

# awk ‘{if ($5 >= 4.5) next; print $1}’ datefile

比方第伍个字段大等于四.伍,就读入输入文件(datafile)的下1行,并从awk脚本的起源初始拍卖,不然,打字与印刷第3个字段。

知晓为:当$五 >= 4.5,就跳过本行,从BEGIN处从头试行。

exit语句

exit语句用于终止awk程序。它不得不中断对记录的处理,无法跳过END语句。要是exit语句的参数是三个0~255里头的值(exit 1),

这么些值就能被打字与印刷在命令行上,以评释程序是或不是奉行成功,并且建议退步的门类。

暗中同意awk不能够重临值 一,只要语法未有不当都再次回到0,exit 1,设置重返值。

{exit (1)}

# echo $status (csh)

1

# echo $?(sh/ksh)

1

证实:退出状态为0表示成功,退出状态为非0则象征失利(那时UNIX的合并约定)。

三.贰 awk内置变量之数据变量

NBMWX三:The number of input records,awk命令所拍卖的记录数;倘诺有多少个文件,那一个数目会把拍卖的四个文本中央银行统1计数;

FN昂Cora:与NCR-V分裂的是,FNRubicon用于记录正在管理的行是当前这一文件中被一同管理的行数;

NF:Number of 田野(field),当前记录的田野(field)个数;

ARAV四GV:数组,保存命令行本身那几个字符串,如:awk '{print $0}' a.txt b.txt这么些命令中,A冠道GV[0]保存awk,ARGV[1]保存a.txt;

A大切诺基GC:awk命令的参数的个数;

FILENAME:awk命令所管理的公文的名目;

ENVIRON:当前shell情况变量及其值的关周全组;如:awk 'BEGIN{print ENVIRON["PATH"]}'

......

八 awk中使用数组

9.1 数组(Arrays)

array[index-expression]

index-expression能够运用大四字符串;需求留意的是,借使某数码组元素事先不存在,那么在引用其时,awk会自动创制此因素并开始化为空白;因而,要看清某数码组中是或不是存在某成分,须求选择index in array的办法。

要遍历数组中的每二个因素,供给使用如下的不一样常常结构:

for (var in array) { statement1, ... }

里面,var用于引用数组下标,而不是成分值;

例子:

netstat -ant | awk '/^tcp/ { S[$NF]} END {for(a in S) print a, S[a]}'

每现身一被/^tcp/格局匹配到的行,数组S[$NF]就加一,NF为当前同盟到的行的终极一个字段,此处用其值做为数组S的成分索引;

awk '{counts[$1] }; END {for(url in counts) print counts[url], url}' /var/log/httpd/access_log

用法与上贰个例证同样,用于总结某日志文件中IP地的访问量

玖.二 删除数组变量

从涉嫌数组中除去数组索引须要采纳delete命令。使用格式为:

delete  array[index]

三.三用户自定义变量

gawk允许用户自定义本人的变量以便在程序代码中采用,变量名命名规则与繁多编制程序语言一样,只可以选拔假名、数字和下划线,且无法以数字开端,gawk变量名称区分字符大小写。

3.三.一在剧本中赋值变量

在awk中给变量赋值使用赋值语句进行,比如:

awk 'BEGIN {var="variable testing";print var}'

在意:在action中一旦有多少个语句,语句之间用分号隔离。

3.三.二在指令行中使用赋值变量

gawk命令也足以在“脚本”外为变量赋值,并在本子中举办引用,举个例子,上述的例子还是能改写为:

awk -v var="variable testing" 'BEGIN{print var}'

专注:在awk中打字与印刷变量值,变量值前是无需加$的,那与shell是差异的。假如前边不加文件,一般都施用BEGIN格局。

/etc/checkfrom.awk是2个awk程序, 内容如下:

玖 awk的松开函数

松开字符串函数(Built-In String Functions)

gsub(r,s)

gsub(r,s,t)

index(s,t)

length(s)

match(s,r)

split(s,a)

split(s,a,fs)

sprintf(fmt,expr-list)

sub(r,s)

sub(r,s,t)

substr(s,p)

substr(s,p,n)

1.sub和gsub函数:替换字符的效率(gsub全局替换,sub替换第多少个)

gsub(r,s)

gsub(r,s,t)

gsub(正则表明式,替换串);

gsub(正则表达式,替换串,指标串);

# awk 'gsub(/aa/,bb) {print $0}' grade.txt

特别注意一点的是:当bb是还是不是数字的时候,要用双引号把它括起来才行。

二.index:查询有些字符或字符串在壹切字符串当中的职分

# awk '{print index("hollow","low") }’ filename

4

3.length:重回字符串的长短

# awk ‘{print length(“hello”)}’ filename

# awk ‘{print length($1)}’ filename

肆.substr:遵照初始地点及长度重返字符串的一片段

substr(字符串,伊始地点)

substr(字符串,发轫地方,字串长度)(包含空格)

# awk '$1=="L.Tansley" {print substr($1,1,5)}' grade.txt

另1种格局是:重回字符串后缀或钦命地点前边字符

# awk '{print substr($1,3)}' grade.txt

5.match:查找目的字符串是不是带有查找字符的壹部分

# awk 'BEGIN {print match("ANCD",/D/)}’

6.split:重临字符串数组元素个数

split(字符串,数组,字段分隔符)

split(字符串,数组)

# awk ‘BEGIN{split(“12/25/2001”,date,”/“);print date[2]}’ filename

25

# awk 'BEGIN {print split("123#456#789",cc,"#")}'

7.sprintf函数:重返3个钦定格式的表明式。能够在sprintf函数中应用printf函数的格式规范。

格式:

variable = sprintf(”含有格式表达的字符串“,表明式一,表明式二,…,表明式n)

# awk ‘{line = sprintf (“%-15s %6.2f “,$1,$3);print line}’ filename

八.应用管道向awk传入字符串

# echo "Stand-by" |awk '{print length($0)}’

9.采取wall -a -g tellin 新闻,发新闻给同组的人。

10.设置域分隔符: awk -F| 设置|为域分隔符

system(“command”)

功效:实践系统command并将结果回到至awk命令

systime()—仅适于gawk

作用:取系统当下时刻

strftime函数:使用C库中的strftime函数对时间进行格式化。

格式:

# awk ‘BEGIN{print strftime(“%D”)}'

tolower(字符串)—仅适于gawk

功能:将s中的全数字母转为小写

toupper(字符串)—仅适于gawk

功效:将s中的全体字母转为大写

任何剧情:

读输入(getline)

# awk ‘BEGIN{ “date”|getline d;print d}’ datefile

将unix/linux的date命令输出通过管道传给getline函数,结果保存在变量d中兵打字与印刷出来。

# awk 'BEGIN{ printf "Who are you looking for?" ;getline name < "/dev/tty”}'

从终端/dev/tty读取输入,保存到数组name中。

垄断(monopoly)函数

# awk ‘{if ($5 >= 4.5) next; print $1}’ datefile

若是第四个字段大等于四.五,就读入输入文件(datafile)的下壹行,并从awk脚本的源点初阶拍卖,不然,打字与印刷第2个字段。

知道为:当$伍 >= 肆.5,就跳过本行,从BEGIN处从头施行。

四、awk操作符

BEGIN {site["aft01"]=1;

10 用户自定义函数

自定义函数使用function关键字。格式如下:

function F_NAME([variable,variable,variable,...])

{

statements

}

函数还是能够使用return语句重临值,格式为“return value”。

netstat -tn |awk '/^tcp/{state[$NF] }END{for (s in state){printf "%-15s 5dn",s,state[s]}}'

总结每种连接的个数

练习:

一、总计当前系统上每一种客户端IP的接二连三中处于TIME_WAIT的连日境况的个数;

二、计算ps aux命令实行时,当前系统上各状态的进度的个数;

[root@httpweb1 ~]# ps aux|awk '!/^USER/{state[$8] }END{for (i in state) {printf "%-15s %dn",i,state[i]}}'

S<              2

S

Ss              18

STAT            1

SN              1

S               94

Ss              7

Ssl             4

R               1

S               1

Sl              6

S

三、总结ps aux命令推行时,当前系统上各用户的进度的个数;

[root@httpweb1 ~]# ps aux |awk '!/^USER/{state[$1] }END{for (i in state) {printf "%s %dn",i,state[i]}}'

rpc 1

dbus 1

named 1

68 2

daemon 4

postfix 2

rpcuser 1

root 122

四、展现ps aux命令推行时,当前系统上其VSZ(虚拟内部存款和储蓄器集)大于一千0的进度及其PID;

ps aux|awk '!/^USER/{if ($5<10000) next;print $2,$5,$NF}'

ps aux|awk '!/^USER/{if ($5>10000) print $2,$5,$NF}'

4.1算术操作符

-x:

x:

x^y:

x**y:

x*y:

x/y:

x y:

x-y:

x%y:

site["aft02"]=1;

四.二字符串操作符:

用来落到实处字符串连接

site["aft03"]=1;

4.三赋值操作符

=

=

-=

*=

/=

%=

^=

**=

--

留神:即便某形式为*号,此时使用/*/也许会有语法错误,应以/[*]/替代。

site["aft04"]=1;

4.4布尔值

awk中,任何非0值或非空字符串都为真,反之就为假。

site["aft05"]=1;

4.五比较操作符

x<y      True if x is less than y.

x<=y    True if x is less than or equal to y.

x>y      True if x is greater than y.

x>=y    True if x is greater than or equal to y.

x==y    True if x is equal to y.

x!=y      True if x is not equal to y.

x~y       True if the string x matches the regexp denoted by y.

x!~y      True if the string x does not match the regexp denoted by y.

subscript in array   True if the array array has an element with the subscript subscript.

注意:awk中的相比较操作符与shell中的比较操作符不雷同,使用时只顾区分。

例子:

awk -F: '$3 1>=500{print $1,$3}' /etc/passwd

site["rs6000"]=1;

四.6说明式间的逻辑关系符

$$

||

}

四.七规格表明式

selector?if-true-exp:if-false-exp

等价于:

if selector; then

    if-true-exp

else

    if-false-exp

fi

$1==ENVIRON["LOGNAME"] {

四.8函数调用

function_name(para1,para2)

if ($NF !~ /[0-9] :[0-9] /){

五、awk模式

awk 'program' input-file1 input-file2 ...

其中的program为:

pattern {action}

pattern {action}

...

i = NF - 3

伍.1大规模的情势类型

(1)Regexp:正则表明式,格式为/regular expression/

(二)Expression:表明式,其值非0或为非空字符时满意条件,$一~/foo/或$一=="magedu",用运算符~(匹配)和!~(不匹配)

(三)Ranges:钦命的异常范围(最棒利用形式作为相配),格式为pat壹,pat二

(四)BEGIN/END:特殊情势,仅在awk命令实施前运维三遍或终止前运营三回

(5)Empty:航空模型式,相称大四输入行

/正则表明式/:使用通配符的扩大集。

关联表明式:能够用下边运算符表中的关系运算符实行操作,能够是字符串或数字的可比,如$二>$一选取第一个字段比第贰个字段长的行。

形式相配表达式:方式,方式(钦点2个行的限制,该语法无法包罗BEGIN和END格局。)

BEGIN:让用户内定在率先条输入记录被管理从前所发出的动作,平常可在那边安装全局变量。

END:让用户在最终一条输入记录被读取之后发生的动作。

例子:

awk -F: '/^r/{print $1}' /etc/passwd

//正则表明式:收取以r早先的行的率先个字段(呈现以r开首的用户的用户名)

awk -F: '$7~"bash$"{print $1,$7}' /etc/passwd

//表明式:抽出默许shell是bash shell的用户

awk -F: '$3==0,$7~"nologin"{print $1,$3,$7}' /etc/passwd

awk -F: '/^r/,/^m/{print $1,$7}' /etc/passwd

//情势匹配:相配以r初始的行,到以m开端的行之间的富有行,并抽出用户名和shell。

awk -F: 'BEGIN {print "Username      ID      Shell"} $3==0,$7~"nologin" {printf "%-10s%-10s%-20sn",$1,$3,$7}END{print "End of report."}' /etc/passwd

//BEGIN/END

awk -F: '{printf "%-10s%-10s%-20sn",$1,$3,$7}' /etc/passwd

//Empty

if("/dev/"$i == ENVIRON["TTY"]){

5.2常见的action

(一)Expressions:表明式,如赋值表明式、判定表达式

(二)Control statements:调控语句,如if、case、for、while、do-while

(三)Compound statements:复合语句

(肆)Input statements:输入语句

(5)Output statements:输出语句

if(ENVIRON["TTY"] != "/dev/console"){

陆、调整语句

if($NF in site)print "WELCOME"

6.1 if-else

语法:if (condition) {then-body} else {[else-body]}

例子:

awk -F: '{if ($1=="root") print $1,"Admin"; else print $1,"Common User"}' /etc/passwd

awk -F: '{if ($1=="root") printf "%-15s: %sn",$1,"Admin"; else printf "%-15s: %sn",$1,"Common User"}' /etc/passwd

awk -F: -v sum=0 '{if ($3>=500) sum }END{print sum}' /etc/passwd

瞩目:格式与shell区别,可是逻辑一样。

else print "GETAWAY"

6.2 while

语法:while (condition){statement1;statement2;...}

例子:

awk -F: '{i=1;while (i<=NF) {if (length($i)>=4) print $i; i }}' /etc/passwd

awk -F: '{i=1;while (i<=3){print $i; i }}' /etc/passwd

}

6.3 do-while

语法:do {statements1;statements2;...}while (condition)

例子:

awk -F: '{i=1;do {print $i; i }while (i<=3)}' /etc/passwd

注意:shell中尚无do-while,类似于C语言风格的轮回。

else print "WELCOME"

6.4 for

语法:for (variable assignment; condition; iteration process) {statement1;statement2;...}

例子:

awk -F: '{for (i=1;i<=NF;i ) {if (length($i)>=4) print $i}}' /etc/passwd

awk -F: '{for(i=1;i<=3;i ) print $i}' /etc/passwd

exit 0

6.5 case

语法:switch (expression) {case VALUE or /REGEXP/: statement1,statement2,... default: statement1,...}

}

6.6 break和continue

常用来循环或case语句中

}

6.7 next

提前甘休对行当文本的拍卖,并随后管理下1行。譬喻,上面的吩咐将呈现其ID号为奇数的用户:

awk -F: '{if ($3%2==0) next;print $1,$3}' /etc/passwd

else{

七、awk中选择数组

i = NF - 2

7.1数组

array[index-expression]

index-expression能够动用猖狂字符串。要求专注的是,若是某数组元素事先不设有,那么在引用其时,awk会自动创造此因素并开始化为空白;由此,要一口咬住不放某数组中是或不是留存某成分,须要使用index in array。

awk中数组下标是从一开头的,shell中数组下标是从0起始。

要遍历数组中的每2个要素,需求利用如下的特种结构:

for (var in array) {statement1, ...}

里面,var用于引用数组下标,而不是成分值。

例子:

awk -F: '{shell[$NF] }END{for (A in shell) {print A,shell[A]}}' /etc/passwd

在awk中,变量在率先次引用的起头值为0。

netstat -ant | awk  '/^tcp/{STATE[$NF] }END{for (S in STATE) {print S,STATE[S]}}'

总计tcp连接:每出现一被/^tcp/情势相称到的行,数组STATE[$NF]就加一,NF为当前同盟到的行的终极叁个字段,此处用其值作为数组STATE的因素索引。

awk '{counts[$1] } END {for (ip in counts) print counts[ip],ip}' /var/log/httpd/access_log

用于计算某日志文件中IP地址的访问量

if("/dev/"$i == ENVIRON["TTY"]){

7.2剔除数组变量

从涉嫌数组中去除数组索引必要接纳delete命令,使用格式为:

delete array[index]

print "WELCOME"

捌、输出重定向

print items > output-file

print items >> output-file

print items | command

特种文件讲述符:

/dev/stdin:规范输入

/dev/stdout:标准输出

/dev/stdeer:错误输出

/dev/fd/N:某一定文件描述符,如/dev/stdin就一定于/dev/fd/0;

例子:

awk -F: '{printf "%-15s %in",$1,$3 > "/dev/stderr"}' /etc/passwd

exit 0

}

}

}

注: 请注意你的机械上的finger突显的格式, 作者机器上的格式如下:

$ finger

lsad% finger

Login Name TTY Idle When Where

tiger Wang Shuhu console Mon 00:41

lsad%

上边的awk程序是针对性这种格式编写的, 仅供参照他事他说加以调查。www.bifa688.com 1

本文由bifa688.com发布,转载请注明来源:www.bifa688.comLinux下完成限制用户的登录地方