所以我正在尝试阅读一些配置文件,并将查找管道输入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知之甚少,并且无法找出确定正在读取哪条线的方法。无论哪种方式,都会感谢有人指出我正确的方向。
答案 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