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
网友评论