awk - 根据字符串长度

时间:2017-09-20 06:39:19

标签: linux bash shell awk

所以我正在尝试阅读一些配置文件,并将查找管道输入grep的信息输出到awk,如下所示:

find /path/to/file/ -name config.php -print0 | xargs -0 grep -E 'cfg_database|cfg_user|cfg_password' | awk -F"[:']" -v OFS="" '{print (NR%3==1) ? $1 " | Database: " : "", (NR%3==2) ? "Username: " : "", (NR%3==0) ? "Password: " : "", $5}'

会有多个结果,所以默认情况下,查找| xargs grep输出是:

/path/to/file/dir1/config.php:define('cfg_database', 'db1');
/path/to/file/dir1/config.php:define('cfg_user', 'user1');
/path/to/file/dir1/config.php:define('cfg_password', 'pass1');
/path/to/file/dir2/config.php:define('cfg_database', 'db2');
/path/to/file/dir2/config.php:define('cfg_user', 'user2');
/path/to/file/dir2/config.php:define('cfg_password', 'pass2');

使用我现在拥有的命令,输出为:

/path/to/file/dir1/config.php | Database: db1
Username: user1
Password: pass1

但是我希望能够添加空格,以便根据文件路径的长度($ 1)以及另外三个空格排列所有结果。

/path/to/file/dir1/config.php | Database: db1
                                Username: user1
                                Password: pass1

我在这里看到的唯一方法是使用print中的循环($ 1)或使用printf。我无法弄清楚在当前命令中获取循环的任何方法,我对printf知之甚少,并且无法找出确定正在读取哪条线的方法。无论哪种方式,都会感谢有人指出我正确的方向。

3 个答案:

答案 0 :(得分:2)

your_command | awk 'FNR==1{l=index($0,"|")+1}FNR>1{$0=sprintf("%*s%s",l,"",$0)}1'

例如:

$ cat f
/path/to/file/dir1/config.php | Database: db1
Username: user1
Password: pass1

$ awk 'FNR==1{l=index($0,"|")+1}FNR>1{$0=sprintf("%*s%s",l,"",$0)}1' f
/path/to/file/dir1/config.php | Database: db1
                                Username: user1
                                Password: pass1

<强>解释

  • index(str, sub)
  

它会检查 sub 是否是 str 的子字符串。成功的话   返回 sub 开始的位置;否则返回0。该    str 的第一个字符位于1位置。

  • sprintf(format, expression1, …)
  

返回(不打印)printf将打印的字符串   出于相同的论点

  • sprintf("%*s%s",l,"",$0)

Like C/C++指定为字符串

分配多少空间
  

*宽度未在格式字符串中指定,而是作为   必须的参数前面的附加整数值参数   格式化。

sprintf("%*s",5,"")

相同
sprintf("%5s", "");   

实施例

用于以动态方式指定字段的宽度:

$ awk 'BEGIN{printf("%*s%s\n",5,"","mystring")}'
     mystring

$ awk 'BEGIN{printf("%5s%s\n","","mystring")}'
     mystring

答案 1 :(得分:0)

awk 'NR==1{len=length($0)} {printf "%"len"s\n",$0}' yourfile
/path/to/file/dir1/config.php | Database: db1
                              Username: user1
                              Password: pass1

这里,第一行的长度用于计算字符串输出的格式,它存储在len变量中。

答案 2 :(得分:0)

$ awk 'NR==1{s=length($1)+4}NR>1{$s=$1 OFS $2;$1=$2=""}1' file

$ awk '
NR==1 {
    s=length($1)+4   # length of first field of first record + correction
}
NR>1 {
    $s=$1 OFS $2     # use length to position to correct field
    $1=$2=""         # clean original fields
}1' file
/path/to/file/dir1/config.php | Database: db1
                                Username: user1
                                Password: pass1