本文链接:http://blog.csdn.net/kongxx/article/details/8284952
今天工作中碰到一个问题,需要过滤一些命令行的输出,并且将结果按类似表格的格式输出
这里假定有一个命令的输出如下,假定我们过滤掉了其中某些列或者行,这里我们将其存入test.txt文件
ID Name Designation Department Salary 100 Thomas Manager Sales $5,000 200 Jason Developer Technology $5,500 300 Sanjay Sysadmin Technology $7,000 400 Nisha Manager Marketing $9,500 500 Randy DBA Technology $6,000下面是一个简单的awk文件,将其保存到test.awk文件里。
function format(value, maxlen, align) { len=length(value); lendiff=maxlen-len; if (lendiff>0) { for (k=0; k<lendiff; k++) { if(align=="right") { value=value" "; } else { value=" "value; } } } return value; } BEGIN { rows=0; cols=5; } { if(NF==cols) { for(i=1; i<=NF; i++) { if (length($i) > lengths[i]) lengths[i]=length($i); } rows++; for(col=1; col<=NF; col++) { data[rows, col]=$col; } } } END { for(i=1; i<=length(lengths); i++) { lengths[i]=lengths[i]+4; } for(i=1; i<=rows; i++) { print format(data[i, 1], lengths[1]), format(data[i, 2], lengths[2], "right"), format(data[i, 3], lengths[3], "right"), format(data[i, 4], lengths[4], "right"), format(data[i, 5], lengths[5]) } }首先是一个format函数,用来格式化某些字符串,这个函数包含三个参数:第一个参数value是需要格式化的字符串,第二个参数是需要把字符串格式化成多长的字符串,第三个参数是用来表示当字符串长度小于maxlen时,在前面还是在后面补空格。
接下来是BEGIN部分,定义了两个变量,rows是用来表示文本内容共有多少行需要处理,这里考虑到空行问题所以没有使用NR变量;cols是用来定义最终需要显示的列数,这里假定全部列都需要,所以定义成5.
Action部分,处理了所以列是5的的行,这里根据需要可以写自己的过滤条件,上面例子里为了方面没有做过多过滤;这部分使用了两个循环:第一个循环用来计算所以行中每一列的最大长度,并将其保存在lengths数组中;第二个循环是将所以需要的数据放到一个二维数组中;
最后是END部分,此部分也包括两个循环:第一个循环是将每一列的最大长度加4,目的是为了在每一列之间加一些间隔;第二个循环是用来格式化输出的,其中将Name,Designation和Department列左对齐,数字列右对齐。
测试,在命令行运行awk -f test.awk test.txt命令,可以得到如下结果
ID Name Designation Department Salary 100 Thomas Manager Sales $5,000 200 Jason Developer Technology $5,500 300 Sanjay Sysadmin Technology $7,000 400 Nisha Manager Marketing $9,500 500 Randy DBA Technology $6,000