
9. 将内容居中放置在79个字符的宽页面上
awk '{ l=length(); s=int((79-l)/2); printf "%"(s+l)"sn", $0 }'
第一句使用length函数来计算当前内容行的长度,第二句计算应在行的开头添加多少空格,第三句将内容对齐到内容的右侧s + l宽度.
10. 将foo替换为bar
awk '{ sub(/foo/,"bar"); print }'
如上所述,子函数用bar替换每行中的第一个foo. 但是,如果要将每行中的所有foo替换为bar,则需要使用以下语句
awk '{ gsub(/foo/,"bar"); print }'
另一种方法是使用gensub函数
awk '{ $0=gensub(/foo/,"bar",4); print }'

此语句的不同之处在于,它仅用bar代替了每行中第四次出现的foo. 它的原型是gensub(regex,s,h [,t]),它将字符串t中的hth替换为s. 如果未提供t参数,则默认t为$0. gensub不是标准函数,只能在GNU Awk或netBSD包含的awk中使用它.
11. 在包含baz的行中,将foo替换为bar
awk '/baz/ { sub(/foo/,"bar") }; {print}'
12. 在没有baz的行中,将foo替换为bar
awk '!/baz/ { gsub(/foo/, "bar") }; { print }'
与上一句话的区别在于使用!让baz返回false.
13. 用红色代替猩红色或或puce
awk '{ gsub(/scarlet|ruby|puce/,"red"); print }'
14. 使文字上下颠倒并模仿tac

awk '{ a[i++] = $0} END { for (j=i-1; j>=0;) print a[j--] }'
这是单行代码的困难,将每行的内容放入数组a中. 例如: 有三行,即“ foo”,“ bar”,“ baz”. 序列a包含以下内容: [0] =“ foo”,[1] =“ bar”,[2] =“ baz”. 当awk执行完所有行处理后,它将执行END {}操作. END函数将循环输出a的数组,如以下示例所示:
for (j = 2; j >= 0; ) print a[j--]
让变量j从a的最大值变为0,然后从后面逐行输出内容.
15. 连接以下一行结尾的行
awk '/$/ { sub(/$/,""); getline t; print $0 t; next }; 1'
(/ $ /awk 替换,“”)函数表达式被删除. 然后,getline函数获取下一行的内容并将其存储在变量t中,并输出当前行(已删除)和下一行的连接内容. “ Print $ 0 t”打印原始行和新读取的行(到变量t中). 并使用next跳过下一个1以避免重复输出. 如果当前行无尾,它将直接执行1输出.
16. 排序并输出所有用户名
awk -F ":" '{ print $1 | "sort" }' /etc/passwd

在这里,首先使用-F将分隔符指定为冒号,然后使用|. 指定要逐行传递到外部程序排序的输出内容. (这真的很奇怪).
17. 以相反的顺序输出前两个字段
awk '{ print $2, $1 }' file
18. 交换每行的前两个字段
awk '{ temp = $1; $1 = $2; $2 = temp; print }'
由于要输出整行,因此必须重新分配$ 1和$ 2并使用一个临时变量进行转移.
19. 删除每行的第二个字段
awk '{ $2 = ""; print }'
20. 以相反的顺序输出每一行的所有字段

awk '{ for (i=NF; i>0; i--) printf("%s ", $i); printf ("n") }'
21,删除连续的重复行
awk 'a != $0; { a = $0 }'
前面的句子省略了该动作,并选择输出与a不同的整行;后面的句子省略了模式,并将当前行的内容分配给a. a在此示例中,左和右是上一行的内容.
22. 删除不连续的重复行
awk '!a[$0]++'
使用当前行的内容作为数组a的索引. 如果a中已经有$ 0的记录,则会遇到重复记录. pattern的值为0,不会输出.
23. 每5行用逗号连接
awk 'ORS=NR%5?",":"n"'
在这里awk 替换,在输出的每一行之前,请重新定义ORS,如果行号可被5整除,则为n,否则为逗号.
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-164142-1.html
所以一线人员有权直接开火