awk+sed+vim等技巧

awk技巧

awk的内置变量:

  • FS:(Input Field Separator)
    表示awk所认知的分隔符

  • OFS:(Output Field Separator)
    表示输出文件的分隔符
    awk -F':' 'BEGIN{OFS="=";} {print $3,$4;}' /etc/passwd

  • RS:(Record Seperator)
    RS表示每一行的分割符,默认是'\n'
    cat student.awk BEGIN { RS="\n\n"; FS="\n"; } { print $1,$2; }

  • ORS:(Output Record Separator)
    表示输出的的行分割符,与RS相对应

  • NR:(Number of Record)
    这个比较常用,表示awk当前处理第几行

  • NF:(Number of Field)
    表示awk处理当前行有几个单词(按照分隔符分开,默认为空格)

  • FNR: (Number of Records related to current Input File)
    表示当前处理行在当前处理文件的第几行

awk模式扫描处理:

awk -F ":" '{print "USER:" 7 }' /etc/passwd
awk -f file.awk /etc/passwd

awk变量:

FILENAME 当前输入的文件名称
FNR 当前输入的文件的记录数
FS 字段分隔符(支持正则表达式),默认空格
NF 当前记录的字段数
NR 在工作(job)中的记录数
OFS 输出字段分隔字符
ORS 输出记录分隔字符(默认为“\n”)
RS 输入记录分隔字符
$ cat etc_passwd.awk
BEGIN{
FS=":";
print "Name\tUserID\tGroupID\tHomeDirectory";
}

{
    print $1"\t"$3"\t"$4"\t"$6;
}
END {
    print NR,"Records Processed";
}

$awk -f etc_passwd.awk /etc/passwd

$cat student.txt
Jones
2143
78
84
77

Gondrol
2321
56
58
45

$cat student.awk
BEGIN {
    RS="\n\n";
    FS="\n";

}
{
    print $1,$2;
}

$ awk -f student.awk  student.txt
Jones 2143
Gondrol 2321

$cat student-marks
Jones 2143 78 84 77
Gondrol 2321 56 58 45

$ awk '{print NR,"->",NF}' student-marks
1 -> 5
2 -> 5

awk '{print FILENAME}' student-marks


vim技巧

:s/test1/test2/
:s/test1/test2/g
:n,$/test1/test2/g
:%s/test1/test2/g #替换每一行的字符

  • 删除文本中的^M :
    cat filename1 | tr -d "VM" > newfile
    sed -e "s/VM//" filename > outputfilename

  • :%s/VM//

文本处理命令:

sort常用参数:
-t 指定一行的分隔符
-k 指定具体排序的规则
-d 按字典序排列
-f 忽略大小写
-u (unique)丢弃相同指定字段的记录

unique:报告或删除文件中重复的行
-c 在输出行前加上出现的次数
-d (duplicated)显示重复的行
-u 仅显示不重复的行

wc:统计文本行数,字数和字符数
-c 字符数
-w 单词数
-l 行数

pr:将文本转换成适合打印的格式
-c 显示的列数(截断超出的部分)

fmt: 优化文本的格式
-w 设置一行显示的最大行宽
-s 只对过长的行进行换行,不要自动回填。

fold:限制文本宽度(强行截断并换行)
-w 指定宽度
-s 只在空格处换行。

cut :截取行的字段
-delimiter 设置字段分割符
-f List 设置截取的域

List可以是M,M-,M-N -M;可以用逗号指定多个

join:连接两个文件的数据字段
join file1 file2 -1 M -2 N

M、N指定匹配的字段

tr: 文本替换
tr set set :将str1上字符替换成str2上对于位置的字符;(可以是 tr 'a-z' 'A-Z')
tr {-d|-s} set :-d 删除set上的每一个字符 ;-s 除去连续出现的set中的字符,至只剩下单个
tr -c (complement 互补)使用set1的外的其他字符 [例子:tr -cs '[:lower:][:upper:]' '[\n*]' 单词表]

sed流编辑器:

  • sed -e '1,5d' test.txt
  • sed -e '/^#/d' test.txt

^ 与行首匹配
$ 与行尾匹配
. 与任意一个字符匹配
* 与之前一个字符的零个或多个出现匹配
[] 与[]之间的所有字符匹配

  • 替换文本:

sed -e "s/benson/BENSON/g" 将benson 替换成大写
sed -e "1,10s/benson/BENSON/g" 将1-10行的benson变成大写

  • 多条命令一起执行:

sed -n -e "=;p" #打印行号;打印行
等价与 sed -e "=" -e "p"

  • 多条命令于同一地址范围:

sed -n -e '1,5{s/benson/BENSON/g;s/laur/LAUR/g}'

  • 把命令放在文件fsed里:

sed -n -f fsed

你可能感兴趣的:(awk+sed+vim等技巧)