LINUX SHELL AWK 符号问题 awk 'BEGINvar=" ' "$file" ' "ENDprint var;'

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LINUX SHELL AWK 符号问题 awk 'BEGINvar=" ' "$file" ' "ENDprint var;'相关的知识,希望对你有一定的参考价值。

awk 'BEGINvar=" ' "$file" ' "ENDprint var;' "$file"如题,var=" ' "$file" ' "这里边的符号是什么意思?第一步"$file" 比如可以得到a.log第二部" ' a.log' "是啥意思?这个单引号起到什么作用了吗?

awk 'BEGINvar=" '$file' "ENDprint var;' "$file"
和你写的,两个的结果是一样的啊!我上LINXU测试过了,在单引号里面多写几对双引号也是没有用的啊!
单引号引用的 ‘$argument ’ 是对命令外面的参数的引用 而在里面多几对写双引号是没用的

最外面的双引号表示你引用的 外面的参数的值 是一个字符串,在这里把这个字符串 复制给var, 所以END那里打印出var的值就是 参数$file的值
重点:单引号+$是对外面的参数的引用

给个几分啦,一分也好啦
参考技术A 其实很简单,这样写是由于单引号和双引号的区别。
单引号括起来的内容中,特殊字符会自动转译,即$会当成一个普通字符。
双引号括起来的内容中:特殊字符不会转译,所以$file会被当成一个变量。
'$file'等价于"\$file"

如果语句写成:awk 'BEGINvar=$fileENDprint var;' 输出就会是字符串为$file,而不是a.log,所以如果你想要结果是a.log的话,那个语句其实也能写成:
awk 'BEGINvar=' "$file" 'ENDprint var;',这是最正确和简洁的写法。也就是哪里特殊符号需要不转义,就用双引号,其他语句用单引号(语句可看成三段1. 'BEGINvar=' 2. "$file" 3. 'ENDprint var;')。本回答被提问者采纳
参考技术B 单引号: 注释掉引号内的所有字符的特殊意义
双引号: 只注释空格的特殊意义

Linux/awk变量运算符if多分支

一.awk语法

awk [options] ‘commands‘ files
option
-F 定义字段分隔符,默认的分隔符是连续的空格或制表符
使用option中的-F参数定义间隔符号
用$1,$2,$3等的顺序表示files中每行以间隔符号分隔的各列不同域
NF变量表示当前记录的字段数
-v 定义变量并赋值 也可以借用次方式从shell变量中引入

二.变量

变量命名规则

以字母或下划线开头,剩下的部分可以是:字母、数字、下划线.

最好遵循下述规范:

1.以字母开头
2.使用中划线或者下划线做单词的连接
3.同类型的用数字区分
4.对于文件最好加上拓展名


NR 表示AWK读入的行数
FNR表示读入行所在文件中的行数
# awk ‘{print NR,FNR,$1}‘ file1 file2 
1 1 aaaaa
2 2 bbbbb
3 3 ccccc
4 1 dddddd
5 2 eeeeee
6 3 ffffff
#
逻辑运算 可直接引用域进行运算
== >= <= != > < ~ !~
# awk ‘NR==1 {print}‘ /etc/passwd
root:x:0:0:root:/root:/bin/bash

命令 {print $0}
读后处理 END {awk_cmd1;awk_cmd2;}

NR 当前记录的个数(全部文件连接后的统计) 
FNR 当前记录的个数(仅为当前文件的统计,非全部)
FS 字段分隔符 默认为连续空格或制表符,可以使用多个不同的符号做分隔符 -F[:/]
OFS 输出字符的分隔符 默认是空格
# awk -F: ‘OFS="=====" {print $1,$2}‘ /etc/passwd
root=====x
NF 当前读入行的字段个数
ORS 输出记录分隔符 默认是换行
# awk -F: ‘ORS="=====" {print $1,$2}‘ /etc/passwd
root x=====bin x=====
FILENAME 当前文件名

引用shell变量的方法

# a=root
# awk -v var=$a -F: ‘$1 == var {print $0}‘ /etc/passwd
或者 把整个命令拆开传递,让shell变量外露,
# awk -F: ‘$1 == "‘$a‘" {print $0}‘ /etc/passwd
# a=NF
# awk -F: ‘{print $‘$a‘}‘ /etc/passwd

三.操作符
赋值
= += -= /= *= 
逻辑与 逻辑或 逻辑非
&& || !
匹配正则或不匹配,正则需要用 /正则/ 包围住
~ !~
关系 比较字符串时要把字符串用双引号引起来
< <= > >= != ==
字段引用
$ 字段引用需要加$,而变量引用直接用变量名取
运算符
+ - * / % ++ --
转义序列
\\ \自身
\$ 转义$
\t 制表符
\b 退格符
\r 回车符
\n 换行符
\c 取消换行

四.if (条件) 动作

若有多个动作,则要用大括号将动作体包含起来 if (条件) {动作1;动作2}
# awk -F: ‘{if ($1 == "root") print $1}‘ /etc/passwd
root

# awk -F: ‘{if ($1 == "root") {print $1;print $6}}‘ /etc/passwd
root
/root
#

if (条件1)
动作1
else
动作2
# awk -F: ‘{if ($1 == "root"){print $1}else print $6}‘ /etc/passwd
# awk -F: ‘{if ($1 == "root") print $1;else print $6}‘ /etc/passwd
上面两个命令是等价的,要么用分号隔开,表示第一个动作体的结束,要么将动作体用大括号定位范围

if (条件 1)
动作1
else if(条件 2)
动作2
else if(条件 3)
动作3
else
动作4
# awk -F: ‘{if ($1 == "root") print $1;else if ($1 == "seker") print $6;else if ($1 == "zorro") print $7;else print NR}‘ /etc/passwd
root
2
3
...
33
/home/seker
/bin/bash
36

 

条件 ? 动作1 : 动作2
expr?action1:action2
# awk -F: ‘var=($3 >= 500)?$1:"system_user" {print $1"\t"$3"\t"var}‘ /etc/passwd
# awk -F: ‘{print ($3>500?$1:$2)}‘ /etc/passwd


































































































以上是关于LINUX SHELL AWK 符号问题 awk 'BEGINvar=" ' "$file" ' "ENDprint var;'的主要内容,如果未能解决你的问题,请参考以下文章

linux_awk

linux_awk

linux_awk(一)

linux_awk(一)

Linux/awk变量运算符if多分支

[Linux Shell学习系列十四]sed和awk-6.awk与Shell