在写shell脚本时,经常会使用到awk程序。但是有些复杂的逻辑,可能需要在awk中使用在shell中定义的变量,而且awk程序处理之后,产生的中间变量,还需要在shell中继续处理。
一、那如何在awk中使用在shell中定义的变量呢?
方法一:
使用"'把shell变量包起来,即"'$var'";注意是“
双引号+单引号+shell变量+单引号+双引号
”的格式。
这种写法大家无需改变用'括起awk程序的习惯,是老外常用的写法;这种写法其实际是双括号变为单括号的常量,传递给了awk.
var="abc"
awk '
BEGIN
{print "'$var'"}'
方法二:
和方法一类似,但使用"'"把shell变量包起来,即"'"$var"'";注意是“
双引号+单引号+
双引号
+shell变量+
双引号+单引号+
双引号
”的格式。
如果变量的值中包含空格,为了shell不把空格作为分隔符,则应使用方法二。
var="this a test"
awk '
BEGIN
{print "'"$var
"'"
}'
方法三:
export变量,然后在awk中使用
ENVIRON["var"]
形式获取环境变量的值
var="this a test"; export var;
awk '
BEGIN
{print ENVIRON["var"]}'
二、那shell中如何使用awk程序中定义的变量呢?
“由awk向shell传递变量”,其思想无非是用awk(sed/perl等也是一样)输出若干条shell命令,然后再用shell去执行这些命令。
eval $(awk 'BEGIN{print "var1='str1';var2='str2'"}')
或者eval $(awk '{printf("var1=%s; var2=%s; var3=%s;",$1,$2,$3)}' abc.txt)
之后可以在当前shell中使用var1,var2等变量了。
echo "var1=$var1 ----- var2=$var2"
三、一个检测磁盘空间使用情况的脚本的例子
#!/bin/sh
#文件系统名字
FILE_SYSTEM_NAME="rootfs"
#文件系统挂在的目录
MOUNTED_ON="/"
# shell命令使用awk中定义的变量spaceSize
eval $(df -P | awk '$1=="'"$FILE_SYSTEM_NAME"'" && $6=="'$MOUNTED_ON'" {printf("spaceSize=%s;",$5)}')
echo "主磁盘的使用空间为$spaceSize"
spaceSize=`echo $spaceSize | cut -d% -f1`
if [ aa$spaceSize = "aa" ]; then
spaceSize=-1
fi
if [ $spaceSize -le 85 ]; then
echo '主磁盘的使用空间充足'
elif [ $spaceSize -eq -1 ]; then
echo '没有找到主磁盘使用空间,请检查脚本'
else
echo '主磁盘的使用空间超过阈值'
fi
在写shell脚本时,经常会使用到awk程序。但是有些复杂的逻辑,可能需要在awk中使用在shell中定义的变量,而且awk程序处理之后,产生的中间变量,还需要在shell中继续处理。一、那如何在awk中使用在shell中定义的变量呢?方法一:使用"'把shell变量包起来,即"'$var'";注意是“双引号+单引号+shell变量+单引号+双引号”的格式。这种写法大家无需改变
awk
是一种编程语言,用于在
linux
/unix下对文本和数据进行处理。
数据可以来自标准输入、一个或多个文件,或其它命令的输出。
支持用户自定义函数和动态正则表达式等先进功能,是
linux
/unix
下的一个强大编程工具。
在命令行
中
使用
,但更多是作为
脚本
来
使用
。
awk
的处理文本和数据的方式是这样的,它逐行扫描文件,从第一行到最后一行,寻找匹配的特定模式的行,并在这些行上进行你想要的操作。如果没有指定处理动作,则把匹配的行显示到标准输出(屏幕),如果没有指定模式,则所有被操作所指定的行
在
awk
中
引用
shell
变量
的方法,本例
中
引用
shell
变量
keyword,在keywrodr的外侧是双引号,在keyword内侧是单引号
#cat ./test.txt
aabbccddeeffgghh112233/usr/bin/umount
#keyword="mount"
cat ./test.txt|grep $keyword|
awk
'{split($0,a,"/");if(a[4]=="'$keyword'")print a[1],a[4]}'
格式是这样的,双引号 单引号 $ke..
一、数值
变量
和字符串
变量
数值常量可以表示为整数(如243)、浮点数(如3.14)或用科学计数法表示的数(如。723E-1或3.4e7)。字符串则括在双引号
中
,例如“Hello world”。
初始化与强制类型转换 只要在
awk
程序
中
被提到,
变量
就开始存在。
变量
可以是一个字符串或一个数字,也可以既是字符串又是数字。
变量
被设置后,就变成与等号右边那个表达式相同的类型。
未经初始化的
变量
的值是 0 或 “”,究竟是哪个取决于它们被
使用
时的上下文。
name = "Nancy" # name 是字符串.
本文翻译自StackOverflow提问—— “How do I use
shell
variables in an
awk
script?”,但更改了文章段落结构和部分表述。
方式1、
使用
-v 选项(最好的方式,兼容性最佳)
使用
-v选项(P.S. 记得在选项和
变量
名之间加上空格)
逐行读取文本,默认以空格或tab键为分隔符进行分隔,将分隔所得的各个字段保存到内建
变量
中
,并按模式或者条件执行编辑命令。
sed命令常用于--整行的处理,而
awk
比较倾向于将一行分成多个“字段"然后再进行处理。
awk
信息的读入也是逐行读取的,执行结果可以通过print的功能将字段数据打印显示。
在
使用
awk
命令的过程
中
,可以
使用
逻辑操作符“&&”表示“与”、“11”表示“或”、 “!”表示“非”; 还可以进行简单的数学运算,如+、-、*、/、号、^分别表示加、减、乘、除、
AWK
是一种处理文本文件的语言,是一个强大的文本分析工具。
它是专门为文本处理设计的编程语言,也是行处理软件,通常用于扫描、过滤、统计汇总工作。
数据可以来自标准输入也可以是管道或文件。
1.1.
AWK
工作原理
逐行读取文本,默认以空格或tab键为分隔符进行分隔,将分隔所得的各个字段保存到内建
变量
中
,并按模式或者条件执行编辑命令。
sed命令常用于一整行的处理,而
awk
比较倾向于将一行分成多个""字段然后再进行处理。
awk
信息的读入也是逐行读取的,执行结果可以通过print的功
一个强大的文本分析工具,把文件逐行的读入,以空格为默认的分割符并将每行切片,切开的部分在进行分析处理。
1.基本用法
awk
[选项参数] ‘pattern1 {action} pattern2 {action}…’ filename
pattern :表示
AWK
在数据
中
查找的内容,就是匹配模式
action:在找到匹配内容时所执行的一系列命令。
-F 指定输入文件拆分隔离
-v 赋值一个用户定义
变量
范例:数据准备(/etc/passwd文件)
搜索passwd文件以root关键字开头的所有行,并输出该行的第7列。
awk
-F : '/^root
awk
是一种文本处理工具,可以用于对文本文件进行分析和处理。它的基本语法是:
awk
'pattern {action}' file,其
中
pattern是匹配模式,action是对匹配到的行进行的操作。
awk
可以对文件进行分割、过滤、计算等操作,非常适合处理大量的文本数据。
awk
的常用选项包括:
-F:指定分隔符,默认为制表符或空格。
-v:定义
变量
。
-f:指定
awk
脚本
文件。
常用的
awk
内置
变量
包括:
$:表示整行文本。
$1、$2、$3等:表示第1、2、3列文本。
NF:表示当前行的列数。
NR:表示当前行的行号。
常用的
awk
命令包括:
print:输出指定的文本。
printf:格式化输出。
if/else:条件判断。
for/while:循环语句。
gsub:替换文本。
substr:截取文本。
以上是
awk
的基本介绍,希望对您有所帮助。
Linux下运行java DES解密失败,报javax.crypto.BadPaddingException:Given final block not properly padded
97267
Linux下运行java DES解密失败,报javax.crypto.BadPaddingException:Given final block not properly padded
weixin_38046004:
Linux下运行java DES解密失败,报javax.crypto.BadPaddingException:Given final block not properly padded
weixin_38046004:
Mac OS X安装libevent库报Install libevent bufferevent_openssl.c:60:10: fatal error: 'openssl/bio.h' file
linux下如何使用自己安装的SunJDK替换默认的OpenJDK