awk搜索文件的字符串

时间:2012-05-02 01:53:40

标签: linux scripting awk

我已经建立了一个函数,它在文件中的列中搜索字符串,但它运行良好。我想知道如何修改它以搜索字符串中的所有列?

awk -v s=$1 -v c=$2 '$c ~ s { print $0 }' $3

由于

3 个答案:

答案 0 :(得分:3)

如果“所有列”表示“整个文件”,则:

grep $string $file

答案 1 :(得分:0)

以下是修改当前脚本以在两个不同列中搜索两个不同字符串的一种方法示例。你可以根据自己的意愿扩展它,但是对于不止一些,以另一种方式更有效率。

awk -v s1="$1" -v c1="$2" -v s2="$3" -v c2="$4"  '$c1 ~ s1 || $c2 ~ s2 { print $0 }' "$5"

正如您所看到的,这种技术不能很好地扩展。

另一种技术将列号和字符串视为文件,并且应该更好地扩展:

awk 'FNR == NR {strings[++c] = $1; columns[c] = $2; next}
     {
         for (i = 1; i <= c; i++) {
             if ($columns[i] ~ strings[i]) {
                 print
             }
         }
     }' < <(printf '%s %d\n' "${searches[@]}") inputfile

数组${searches[@]}应包含交替的字符串和列号。

有几种方法可以填充${searches[@]}。这是一个:

#!/bin/bash
# (this is bash and should precede the AWK above in the script file)
unset searches
for arg in "${@:1:$#-1}"
do
    searches+=("$arg")
    shift
done
inputfile=$1   # the last remaining argument
# now the AWK stuff goes here       

要运行脚本,您需要执行以下操作:

$ ./scriptname foo 3 bar 7 baz 1 filename

答案 2 :(得分:0)

awk -v pat="$string" '$0 ~ pat' infile