收藏文章 楼主

shell awk 编程基础大全,与C语言相似

版块:shell   类型:普通   作者:小绿叶技术博客   查看:1919   回复:1   获赞:2   时间:2019-10-25 14:47:18


awk 基本命令

awk -F: '{print $1}' /etc/passwd # -F: 指定分隔符为 :
# 打印第一列,从这个文件里面  # $0 所有字段


awk -F: '{print NR ":" $1}' /etc/passwd

# NR 显示行号号后 加字符串 : 再显示第一列的内容


awk 'BEGIN{FS=":"}{print $1}' /etc/passwd

# begin 程序开始

# FS 默认为空格,当前指定为分隔符为 :   

# 打印第一列

# 等价于awk -F: '{print $1}' /etc/passwd


awk 'BEGIN{RS=":"}{print $1}' /etc/passwd

# RS 换行符,识别冒号为 换行

# 然后打印第一列


awk -F: '{print NF}' /etc/passwd

# 统计以冒号进行分割字段后

# 计算每行有多少列


      #$1--$n 按照分隔符分割取到的第n列内容

     # OFS (默认空格)输出字段分隔符

      # ORS (默认回车)输出记录分隔符


自定义外部变量

awk -v host=$HOSTNAME "BEGIN{print host}"

# -v 定义变量的参数

# 定义变量 host 为内置函数 hostname 

# hostname是linux获取主机名的命令

# begin 开始,打印变量

awk -F: '$7 ~ /^\/bin/{print $0}' /etc/passwd

#  -F: '$7 指定分隔符为冒号,过滤第7列

'$7 ~ /^\/bin/ # 用符号 ~ 判断第7列是否包含 /bin 字符开头

#  \  转译特殊符号, ^ 开头标识

# /{print $0} 如果是,就打印该列

 

<、>、<=、>=、==、!=、~、!~

# 关系操作符号

      # 比较符<等与其他的语言类似

     #  !~:不匹配


while if else 循环

seq 10 |awk '{if($a%2==0){print $a"是双数"}else{print $a"是单数"}}'

# sep10 产生10个正整数

# if 判断 变量 $a  

# 符号 % 整除:除以2后数为0 的数

# {print $a"是双数"} 打印被整除为双数:偶数

# if else 循环打印


while语句:while(expression){action}

# while  [waɪl]  与…同时, 循环

# expression  [ɪkˈspreʃn] 表达

# action [ˈækʃn] 行为过程


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

  # -F: 制定冒号为分隔符

# i=1 赋值初始值为第一行

# NF 显示文本行号。将行号用 i 来表示,<= 是条件,和后面的条件 i ++ 形成两个条件来描述 i 参数;如果 i = NF 行号,就是赋值,已经赋值

# 打印 i ,i++数字增加到最大行号NF;冒号隔开,$i 是文本中的字符串;

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

# 例子:使用:分割/etc/passwd,并将每一列前加上列号


awk -F: '{a[$7]++}END{for(i in a)if(i!=""){print i":"a[i]}}' /etc/passwd

# 统计第7列的个数

# a[$7]:将$7作为数组a的key,然后统计对应的个数;

# 然后遍历for(i in a),判断i是否在数组a的key中;

# 如果存在则打印a[i],a[i]为对应key的值,这里指个数。

 

数组

a["name"]="www" # 相当于数据库表 a 里面的name字段的值为 www

a["passwd"]="000000" # 数组类似python的字典,a[key值]="value值";


delete array["key"] # 数组元素的删除:

 


awk 'BEGIN{ # begin 程序开始执行

a[1]="hello";a[2]="word";a["name"]="meitian";

# 定义数组a的三个值:a[1] a[2] a[name]

for(i in a) # i in a   数组i 的值是a  ; 循环for 换行打印变量

{print "key为"i":value为"a[i]} # print 打印, i 是数组名称, a[i]   数组的字符串

}'



awk 函数     字符串截取


int(x) 取整,删掉小数 sqrt(x) 返回x的平方根


rand() 随机数r,其中0<=r<1,随机数与上次相同


awk 'BEGIN{print rand();srand();print rand()}'

# rand()产生一个随机数

# srand()产生新的种子数

# 使用srand()可以使得rand()返回不同的随机数; 最后打印


echo "hello world world" | awk '{sub("world","xxx");print $0}'

# sub 替换匹配的部分字符 为 xxx

      # gsub 替换匹配到的全部字符

# 匹配打印到第一列或者第一个


awk 'BEGIN{print index("hello world","e")}'

# index 返回 e 在字符串中的位置 

# match 正则表达式 匹配 e 的位置


awk -F 'BEGIN{print length("hello world")}{print lenght()}'

# 返回字符串的长度


a="123456789" ; echo ${a: 3: 4-2}   # echo ${ }  是计算函数,所以:4-2 等于2

                                                         # 截取第3个字符后面的2个字符(不包含第3)

echo ${#a}                                        # 打印字符串长度




awk 'BEGIN{print split("hello world",a,"o");for(i in a){print a[i]}}'

# split(s,a,o) 使用sep将字符串s分解到数组a中

# 识别o为分隔符,默认为FS ;将字符串分割存储到数组a中

  

echo "hello world" |awk '{print toupper($0)}'

# toupper(s):将所有小写字母转换成大写字母


echo "HELLO WORLD" |awk '{print tolower($0)}'

# tolower(s):将所有大写字母转换成小写字母

 


自定义函数

awk -v name=xxx  # 赋值变量name 为xxx

'BEGIN{print name}' # 打印变量


awk 'function sum(a,b){ # 定义一个函数的方法:sum 求和

total=a+b;

return total # 返回他的值

}

BEGIN{ # 开始执行

print sum(2,3) # 打印求和 2与3

}'


ifconfig eth0  | awk -F"[ :]+"  '/inet /{print $3}'

# 获取本机IP地址

# awk 按字段进行处理

# -F 指定分隔符为 [ :] 里面的空格和冒号; 多个分隔符 +

# 再匹配字符inet 的行中的第三列

 

netstat -an |awk  '/^tcp/{a[$NF]++}END{for(i in a){printf("%s:%d\n",i,a[i])}}'

# 统计tcp网络连接数

# /^tcp/表示只处理以tcp开头的行。$NF表示最后一列 


ls |grep conf |awk -F. '{print $1 ":" $2}'

# 对包含 .sh 的文件名,识别点的符号为分隔符

# 将分隔符 . 替换为 : 来打印第一列和第二列


# awk使用-v定义变量


-------    将awk中的结果赋值给变量传递给shell中用    --------


eval $(ls |grep 1.sh |awk -F"-" '{printf("name=%s;version=%s\n",$1,$2)}')

# eval会将打印的值转换成变量,当做命令来进行处理

# shell中定义变量的格式:变量名=变量值

  # 按照-分割。将-前面的存为name变量,中间的版本号存为version变量。

  

a=$(ifconfig eth0 |awk -F":| *" '/inet /{print $3}')

# 将ip 赋值给变量


awk '/^root/{print $0 >"passwd"}' passwd

# >(全部覆盖文件内容)或>>(追加到文件)

# 重导向输出的文件名要用双引号括起来

# awk使用双引号作为分隔符,可以使用单引号括起来,'"'





相关连接:


shell awk内置函数-shell基础

提供企业建站服务,免费网防系统,提交信息登录 http://yundun.ddoss.cn 邮箱: proposal@ddoss.cn 
回复列表
默认   热门   正序   倒序

回复:shell awk 编程基础大全,与C语言相似

头像

用户名:

粉丝数:

签名:

资料 关注 好友 消息