awk 在函数中怎么传参数

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了awk 在函数中怎么传参数相关的知识,希望对你有一定的参考价值。

set -x
function ergodic()
echo " ls -al $1 | awk ' if ( ( $8!=\"..\") && ($8!=\".\") ) print $8' "
exit 0
for file in ` ls -al $1 | awk ' if ( ( $8!="..") && ($8!=".") ) print $8' `
do
echo $1"/"$file" ------ "$OWN
if [ -d $1"/"$file ]
then
local mydir=1
mydir=`ls -al $1"/"$file | awk ' if ( ( $3==$OWN) && ($8==".") ) print $8'`

echo "ls -al $1"/"$file | awk ' if ( ( $3==$OWN) && ($8==\".\") ) print $0'"
echo "mydir:"$OWN`ls -al $1"/"$file | awk ' if ( ( $3==$OWN) && ($8==".") ) print $0'`
if [ !$mydir ]
then
echo $1/$file
else
ergodic $1"/"$file
fi
else
local mydir=`ls -al $1"/"$file | awk ' if ( $3==$OWN ) print $8 '`
if [ $mydir==$file ]
then
echo $1"/"$file"------file"
fi
fi
done


INIT_PATH=$1
OWN=$2
ergodic $INIT_PATH

这是我当前的代码
目的是找 某用户的文件夹或文件
awk里面的$数字得不到值!

A.字符串函数:
1.sub和gsub函数:
sub函数在记录中查找能够匹配正则表达式的最长且最靠左的字串,然后用替换子串替换找到的子串。默认是整个记录,可指定目标字符串。
sub(regualr expression,substitution string);
sub(regualr expression,substitution string,target string);
eg: awk 'sub(/Mac/,"MacIntosh"); print' filename
awk 'sub(/Mac/,"macIntosh",$1);print' filename
gsub类似于sub的用法,但是sub只对目标串中出现的第一个匹配进行替换。gsub则对字符串中的正则表达式进行全局替换,即替换出现在目标串的每一次匹配成功的子串。
2.index函数:index函数返回子串在字符串中的第一次出现的位置。从1开始算起。
index(string,substring)
eg: awk 'print indexhollow","low")' filename;

3.lenght函数:这个函数常用,返回字符串的字符个数,支持中文字符
length(string) ; eg: awk 'BEGINprint length("helloworld")'

4.substr函数:该函数返回从字符串指定位置开始的一个子串(从1开始算起)。如果指定了子串的长度,则返回字符串相应的部分。如果指定长度超出极限,则返回实际内容。
substr(string ,starting position);
sbustr(string,starting position,length fo substring);
eg: awk 'BEGINprint substr("Santa Claus",7,6)'

5.match函数:该函数用于返回正则表达式在字符串中出现的位置,如果没有出现,则返回0.内置变量RSTART保存开始位置,RLEGNTH保存匹配到的长度。
match(string,regular expression)
eg: awk 'BEGINstart=match("good morning everyone",/n... e/); print
参考技术A awk里面的$数字得不到值
首先,得问问,你这个 $数字 是函数的参数,还是表示awk分割后的某个字段?

如果是表示函数的参数,那么这样:
就比如这个吧,
mydir=`ls -al $1"/"$file | awk ' if ( ( $3==$OWN) && ($8==".") ) print $8'`
假定你这里的 $3 表示函数的第三个参数,$OWN 也是 shell 的变量,而不是在awk中定义的,那么改为:
mydir=`ls -al $1"/"$file | awk ' if ( ( ‘$3’=='$OWN’) && ($8==".") ) print $8'`

就是当你要让shell去解释 $数字 而不是让awk去解释时,就关闭awk的单引号,把 $数字 放到awk的单引号外面,即可。追问

谢谢你!我说的是$数字是指awk分割后字段号。
用这种格式吗?
mydir=`ls -al $1"/"$file | awk ' if ( ( ‘$3’=='$OWN’) && ($8==".") ) print $8'`

追答

awk是独立于shell的一个文本处理工具。
如果 $数字 是 awk 的内置变量,那么就放在awk的单引号中,不用拿出来。
$OWN 这个肯定不是 awk 里定义的,是shell的变量,需要放到awk的单引号外面。
mydir=`ls -al $1"/"$file | awk ' if ( ( $3=='$OWN’) && ($8==".") ) print $8'`
即把awk后的内容分成几段:
' if ( ( $3=='
$OWN
’) && ($8==".") ) print $8'

你问的“awk 在函数中怎么传参数” 是什么意思?你要传什么参数?

本回答被提问者采纳
参考技术B awk自定义函数格式如下,和其他语言基本没区别
function name(参数列表)

函数体

参数传递就是通过参数列表,在函数体可用return返回追问

不好意思 我刚接触shell 没有怎么明白您说的。能给个实例吗?

追答

上述所说的是awk代码内的自定义函数
你要的可能是awk的处理和传值机制
awk是一种行处理机制,也就是输入的每一行都经过'xxxxx'内的运算
awk一般输入方式有三种
1,文件传入
如: awk 'xxxx' fname.txt
这里awk将对fname.txt的每一行进行处理
2,管道传入
如: cat fname.txt | awk 'xxxx'
这里awk同样将对fname.txt的每一行进行处理
3,变量传入
如: awk -v a="123" 'xxxx'
这里awk程序内部将可以使用a并得到a的值

如何将bash参数传递给awk脚本?

【中文标题】如何将bash参数传递给awk脚本?【英文标题】:How to pass bash parameter to awk script? 【发布时间】:2012-01-23 14:11:50 【问题描述】:

我有 awk 文件:

#!/bin/awk -f
BEGIN 



        filetime[$'$colnumber']++;

END 
        for (i in filetime) 
                print filetime[i],i;
        

和 bash 脚本:

#!/bin/bash
var1=$1
awk -f myawk.awk

当我跑步时:

ls -la | ./countPar.sh 5

我收到错误:

ls -la | ./countPar.sh 5
awk: myawk.awk:6:         filetime[$'$colnumber']++;
awk: myawk.awk:6:                   ^ invalid char ''' in expression

为什么? $colnumber 必须替换为 5,因此 awk 应该读取 ls 输出的第 5 列。 谢谢。

【问题讨论】:

这似乎是这个问题的后续:***.com/q/8551780/226201 正如其他人所指出的那样,bash 环境和 awk 环境是分开的,如果您想将参数从一个传递到另一个,则必须进行明确的。 【参考方案1】:

您可以直接从命令行将变量传递给您的 awk 脚本。

改变这一行:

filetime[$'$colnumber']++;

收件人:

filetime[colnumber]++;

然后运行:

ls -al | awk -f ./myawk.awk -v colnumber=5

如果你真的想使用 bash 包装器:

#!/bin/bash
var1=$1
awk -f myawk.awk colnumber=$var1

(您的脚本中的更改与上述相同。)

如果要使用环境变量,请使用:

#!/bin/bash
export var1=$1
awk -f myawk.awk

和:

filetime[ENVIRON["var1"]]++;

(我真的不明白你的 awk 脚本的目的是什么。最后一部分可以简化为:

END  print filetime[colnumber],colnumber; 

解析ls 的输出通常是个坏主意。)

【讨论】:

感觉是结合 bash 和 awk。我得到的输入参数,例如bash script比较复杂。 我不确定我是否理解你,所以添加了更多选项。您不能在 awk 脚本中进行纯 shell 替换,这将不起作用 - shell 仅对其参数进行替换,而不是在您在命令行上指定的随机文件中进行替换(它甚至不检查什么是文件和一般情况下不是什么)。 有趣;我不知道你可以在不使用 -v 的情况下将变量传递给 awk @twqqis:参见例如here,有/没有-v的行为略有不同。【参考方案2】:

最简单的方法:

#!/bin/bash
var=$1
awk -v colnumber="$var" -f /your/script

但在您的 awk 脚本中,您不需要在 colnumber 前面添加 $

HTH

【讨论】:

【参考方案3】:

将 3 个变量传递给脚本 myscript.sh var1 是设置了条件的列号。 而 var2 & var3 是输入和临时文件。

#!/bin/ksh
var1=$1
var2=$2
var3=$3
awk -v col="$var1" -f awkscript.awk $var2 > $var3
mv $var3 $var2

如下执行 -

./myscript.sh 2 file.txt temp.txt

【讨论】:

以上是关于awk 在函数中怎么传参数的主要内容,如果未能解决你的问题,请参考以下文章

VBA传两个参数报错

thinkphp中的函数怎么传多个参数

python怎么传参

js addeventlistener 怎么传参数

怎么将可变参数的函数的参数传递给另一个可变参数的函数

jscall不传参数