1. sed
sed 命令是利用脚本来处理文本文件。更适合编辑匹配到的文本。
1.1. 参数说明:
- -e 以选项中指定的script来处理输入的文本文件,输出到标准输出。默认参数,如果只执行一条命令,可以不加,多条指令用 ‘-e script1 -e script2’ 隔开。
- -i[suffix]或--in-place[=suffix] 输出到源文件(即覆盖,危险动作,慎用),Mac下需要补充一个空的字符串。
- -f 以选项中指定的script文件来处理输入的文本文件。
- -n或--quiet或--silent 仅显示script处理后的结果
- -V或--version 显示版本信息。
1.2. 动作说明:
在Mac下慎用,与在Linux有较大不同:
- a :新增,行后插入;
- i :插入, 行前插入;
- d :删除,因为是删除啊,所以 d 后面通常不接任何咚咚;
- p :打印,亦即将某个选择的数据印出。常与参数 -n 一起运行,否则会多打印一次源文件的内容;
- c :取代,n1,n2 之间的行替换成指定的字符串。
- s :取代,常与正规语句搭配。
1.3. 常用例子:
1.3.1. 追加
sed '$line a\xxx' a.txt # 指定行后面追加内容,如果不指定行号,则会在每一行后面追加内容
sed 'a\\' a.txt # 每一行后面增加一行空行
sed '$line i\xxx' a.txt # 指定行前面追加内容,如果不指定行号,则会在每一行前面追加内容
1.3.2. 删除
sed '$line1 d' a.txt # 只删除一行
sed '$line1,$line2 d' a.txt # 删除多行
sed '$line1,$ d' a.txt # 删除line1后面所有的行
sed '/xxx/d' a.txt # 删除包含xxx的行
1.3.3. 替换
sed '$line1,$line2 c\xxx' a.txt # 将line1-line2替换成xxx
sed '$line1,$line2 s/xxx/xx/g' a.txt # 将第line1-line2行中xxx替换成xx
sed 's/\.$//g' a.txt # 删除每一行行尾的'.'
1.3.4. 查询
sed -n '$line1,$line2 p' a.txt # 查看line1-line2行的内容
sed -n '/xxx/p' a.txt # 查看包含xxx的行
2. grep
grep 命令用于查找文件里符合条件的字符串。更适合单纯的查找或匹配文本。
Globally search a Regular Expression and Print.
常与管道指令 '|' 一起用
2.1. 参数说明:
- -a 或 --text : 不要忽略二进制的数据。
- -A<显示行数> 或 --after-context=<显示行数>显示行数>显示行数> : 除了显示符合范本样式的那一列之外,并显示该行之后的内容。
- -b 或 --byte-offset : 在显示符合样式的那一行之前,标示出该行第一个字符的编号。
- -B<显示行数> 或 --before-context=<显示行数>显示行数>显示行数> : 除了显示符合样式的那一行之外,并显示该行之前的内容。
- -c 或 --count : 计算符合样式的列数。
- -C<显示行数> 或 --context=<显示行数>或-<显示行数>显示行数>显示行数>显示行数> : 除了显示符合样式的那一行之外,并显示该行之前后的内容。
- -d <动作> 或 --directories=<动作>动作>动作> : 当指定要查找的是目录而非文件时,必须使用这项参数,否则grep指令将回报信息并停止动作。
- -e<范本样式> 或 --regexp=<范本样式>范本样式>范本样式> : 指定字符串做为查找文件内容的样式。
- -E 或 --extended-regexp : 将样式为延伸的正则表达式来使用。
- -f<规则文件> 或 --file=<规则文件>规则文件>规则文件> : 指定规则文件,其内容含有一个或多个规则样式,让grep查找符合规则条件的文件内容,格式为每行一个规则样式。
- -F 或 --fixed-regexp : 将样式视为固定字符串的列表。
- -G 或 --basic-regexp : 将样式视为普通的表示法来使用。
- -h 或 --no-filename : 在显示符合样式的那一行之前,不标示该行所属的文件名称。
- -H 或 --with-filename : 在显示符合样式的那一行之前,表示该行所属的文件名称。
- -i 或 --ignore-case : 忽略字符大小写的差别。
- -l 或 --file-with-matches : 列出文件内容符合指定的样式的文件名称。
- -L 或 --files-without-match : 列出文件内容不符合指定的样式的文件名称。
- -n 或 --line-number : 在显示符合样式的那一行之前,标示出该行的列数编号。
- -o 或 --only-matching : 只显示匹配PATTERN 部分。
- -q 或 --quiet或--silent : 不显示任何信息。
- -r 或 --recursive : 此参数的效果和指定"-d recurse"参数相同。
- -s 或 --no-messages : 不显示错误信息。
- -v 或 --revert-match : 显示不包含匹配文本的所有行。
- -V 或 --version : 显示版本信息。
- -w 或 --word-regexp : 只显示全字符合的列。
- -x --line-regexp : 只显示全列符合的列。
- -y : 此参数的效果和指定"-i"参数相同。
2.2. 常用例子:
2.2.1. 普通查找
grep 'xxx' ./* # 查找文件夹内所有文件包含xxx的行,如果查找过程中遇到子目录的话,会报错并退出
grep -d 'xxx' ./* # 忽略子目录查找包含xxx的行
grep -r 'xxx' ./* # 递归搜索该文件夹内所有文件,查找包含xxx的行
ll | grep 'a.txt' # 显示文件夹内包含a.txt文件
2.2.2. 反向查找
grep -v 'xxx' a.txt # 打印出不包含xxx的行
grep -Ev '^#|^$' a.py # 显示文件内容,不带注释或空行。
2.2.3. 正则查找
grep '[0-9]\{5\}' a.txt # 扩展的正则表达式需要接'\'转义
grep -E '[0-9]{5}' a.txt # 不需要接'\'转义
grep -E 'xxx|yyy' a.txt # 查找包含xxx或yyy的行,等价于 grep -e 'xxx' -e 'yyy' a.txt
grep 'xxx' a.txt | grep 'yyy' # 查找既包含xxx又包含yyy的行
grep '\<xxx' a.txt # 匹配以xxx开头的单词的行
grep '\<xxx\>' a.txt # 匹配只包含xxx单词的行,等价于 grep -w 'xxx' a.txt
3. awk
awk 命令用于使用短脚本处理文本文件。更适合格式化文本,对文本进行较复杂格式处理。
通常,awk是以文件的一行为处理单位的。awk每接收文件的一行,然后执行相应的命令,来处理文本。
awk 取自三位创始人 Alfred Aho,Peter Weinberger, 和 Brian Kernighan 的 Family Name 的首字符
3.1. 参数说明:
- -F fs or --field-separator fs 指定输入文件折分隔符,fs是一个字符串或者是一个正则表达式,如-F:,默认空格为分隔符。
- -v var=value or --asign var=value 赋值一个用户定义变量。
- -f scripfile or --file scriptfile 从脚本文件中读取awk命令。
- -mf nnn and -mr nnn 对nnn值设置内在限制,-mf选项限制分配给nnn的最大块数目;-mr选项限制记录的最大数目。这两个功能是Bell实验室版awk的扩展功能,在标准awk中不适用。
- -W compact or --compat, -W traditional or --traditional 在兼容模式下运行awk。所以gawk的行为和标准的awk完全一样,所有的awk扩展都被忽略。
- -W copyleft or --copyleft, -W copyright or --copyright 打印简短的版权信息。
- -W help or --help, -W usage or --usage 打印全部awk选项和每个选项的简短说明。
- -W lint or --lint 打印不能向传统unix平台移植的结构的警告。
- -W lint-old or --lint-old 打印关于不能向传统unix平台移植的结构的警告。
- -W posix 打开兼容模式。但有以下限制,不识别:/x、函数关键字、func、换码序列以及当fs是一个空格时,将新行作为一个域分隔符;操作符和=不能代替和=;fflush无效。
- -W re-interval or --re-inerval 允许间隔正则表达式的使用,参考(grep中的Posix字符类),如括号表达式[[:alpha:]]。
- -W source program-text or --source program-text 使用program-text作为源代码,可与-f命令混用。
- -W version or --version 打印bug报告信息的版本。
3.2. 内置参数:
变量 | 描述 |
---|---|
$n | 当前记录的第n个字段,字段间由FS分隔 |
$0 | 完整的输入记录 |
ARGC | 命令行参数的数目 |
ARGIND | 命令行中当前文件的位置(从0开始算) |
ARGV | 包含命令行参数的数组 |
CONVFMT | 数字转换格式(默认值为%.6g)ENVIRON环境变量关联数组 |
ERRNO | 最后一个系统错误的描述 |
FIELDWIDTHS | 字段宽度列表(用空格键分隔) |
FILENAME | 当前文件名 |
FNR | 各文件分别计数的行号 |
FS | Field Separator,字段分隔符(默认是任何的空格符) |
RS | Record Separator,记录分隔符(默认是一个换行符) |
OFS | Out of Field Separator,输出记录分隔符(输出换行符),输出时用指定的符号代替换行符 |
IGNORECASE | 如果为真,则进行忽略大小写的匹配 |
NF | 一条记录的字段的数目 |
NR | 已经读出的记录数,就是行号,从1开始 |
OFMT | 数字的输出格式(默认值是%.6g) |
RLENGTH | 由match函数所匹配的字符串的长度 |
RSTART | 由match函数所匹配的字符串的第一个位置 |
SUBSEP | 数组下标分隔符(默认值是/034) |
3.3. 内置函数:
3.3.1. 算法函数:
函数名 | 说明 |
---|---|
atan2( y, x ) | 返回 y/x 的反正切。 |
cos( x ) | 返回 x 的余弦;x 是弧度。 |
sin( x ) | 返回 x 的正弦;x 是弧度。 |
exp( x ) | 返回 x 幂函数。 |
log( x ) | 返回 x 的自然对数。 |
sqrt( x ) | 返回 x 平方根。 |
int( x ) | 返回 x 的截断至整数的值。 |
rand( ) | 返回任意数字 n,其中 0 <= n < 1。 |
srand( [Expr] ) | 将 rand 函数的种子值设置为 Expr 参数的值,或如果省略 Expr 参数则使用某天的时间。返回先前的种子值。 |
3.3.2. 字符串函数:
函数 | 说明 |
---|---|
gsub( Ere, Repl, [ In ] ) | gsub 是全局替换( global substitution )的缩写。除了正则表达式所有具体值被替代这点,它和 sub 函数完全一样地执行。 |
sub(regex,sub,string) | sub 函数执行一次子串替换。它将第一次出现的子串用 regex 替换。第三个参数是可选的,默认为 $0。 |
substr(str, start, l) | substr 函数返回 str 字符串中从第 start 个字符开始长度为 l 的子串。如果没有指定 l 的值,返回 str 从第 start 个字符开始的后缀子串。 |
index( String1, String2 ) | 在由 String1 参数指定的字符串(其中有出现 String2 指定的参数)中,返回位置,从 1 开始编号。如果 String2 参数不在 String1 参数中出现,则返回 0(零)。 |
length [(String)] | 返回 String 参数指定的字符串的长度(字符形式)。如果未给出 String 参数,则返回整个记录的长度($0 记录变量)。 |
blength [(String)] | 返回 String 参数指定的字符串的长度(以字节为单位)。如果未给出 String 参数,则返回整个记录的长度($0 记录变量)。 |
substr( String, M, [ N ] ) | 返回具有 N 参数指定的字符数量子串。子串从 String 参数指定的字符串取得,其字符以 M 参数指定的位置开始。M 参数指定为将 String 参数中的第一个字符作为编号 1。如果未指定 N 参数,则子串的长度将是 M 参数指定的位置到 String 参数的末尾 的长度。 |
match( String, Ere ) | 在 String 参数指定的字符串(Ere 参数指定的扩展正则表达式出现在其中)中返回位置(字符形式),从 1 开始编号,或如果 Ere 参数不出现,则返回 0(零)。RSTART 特殊变量设置为返回值。RLENGTH 特殊变量设置为匹配的字符串的长度,或如果未找到任何匹配,则设置为 -1(负一)。 |
split( String, A, [Ere] ) | 将 String 参数指定的参数分割为数组元素 A[1], A[2], . . ., A[n],并返回 n 变量的值。此分隔可以通过 Ere 参数指定的扩展正则表达式进行,或用当前字段分隔符(FS 特殊变量)来进行(如果没有给出 Ere 参数)。除非上下文指明特定的元素还应具有一个数字值,否则 A 数组中的元素用字符串值来创建。 |
tolower( String ) | 返回 String 参数指定的字符串,字符串中每个大写字符将更改为小写。大写和小写的映射由当前语言环境的 LC_CTYPE 范畴定义。 |
toupper( String ) | 返回 String 参数指定的字符串,字符串中每个小写字符将更改为大写。大写和小写的映射由当前语言环境的 LC_CTYPE 范畴定义。 |
sprintf(Format, Expr, Expr, . . . ) | 根据 Format 参数指定的 printf 子例程格式字符串来格式化 Expr 参数指定的表达式并返回最后生成的字符串。 |
strtonum(str) | strtonum 将字符串 str 转换为数值。 如果字符串以 0 开始,则将其当作十进制数;如果字符串以 0x 或 0X 开始,则将其当作十六进制数;否则,将其当作浮点数。 |
3.3.3. 时间函数:
函数名 | 说明 |
---|---|
mktime( YYYY MM DD HH MM SS[ DST]) | 生成时间格式 |
strftime([format [, timestamp]]) | 格式化时间输出,将时间戳转为时间字符串 具体格式,见下表. |
systime() | 得到时间戳,返回从1970年1月1日开始到当前时间(不计闰年)的整秒数 |
3.3.4. 位操作函数:
函数名 | 说明 |
---|---|
and | 位与操作。 |
compl | 按位求补。 |
lshift | 左移位操作 |
rshift | 右移位操作 |
or | 按位或操作 |
xor | 按位异或操作 |
3.3.5. 其他函数:
函数名 | 说明 |
---|---|
close(expr) | 关闭管道的文件 |
delete | 用于从数组中删除元素 |
exit | 终止脚本执行,它可以接受可选的参数 expr 传递 AWK 返回状态。 |
flush | 刷新打开文件或管道的缓冲区 |
getline | 读入下一行 |
next | 停止处理当前记录,并且进入到下一条记录的处理过程。 |
nextfile | 停止处理当前文件,从下一个文件第一个记录开始处理。 |
return | 从用户自定义的函数中返回值。请注意,如果没有指定返回值,那么的返回值是未定义的。 |
system | 执行特定的命令然后返回其退出状态。返回值为 0 表示命令执行成功;非 0 表示命令执行失败。 |
3.4. 常用例子:
3.4.1. 正则搜索
awk '/xxx/' ax.txt # 输出所有包含xxx的行
3.4.2. 打印
awk '{print $1","$3}' a.txt # 默认以空格作为分隔符分隔文件,打印第一列和第三列,并以","连接
awk '{print $1,",",$3}' a.txt # 打印第一列和第三列,并以" , "连接
awk -F '[ ,]' '{print $1,$3}' a.txt # 以“ ”或“,”作为分隔符分隔文件,打印第一列和第三列
awk 'BEGIN{FS="[ ,]"} {print $1,$3}' a.txt # 等价于上面的语句
awk -v FS='[ ,]' '{print $1,$3}' a.txt # 等价于上面的语句
awk -v RS='[\n][\n]' '{print NR,NF,$1}' a.txt # 以两个换行符作为记录分隔符
awk '{print $NF-1}' a.txt # 打印倒数第二列
awk '{printf ("linenumber:%3s,content:%3f\n",NR,$0)}' a.txt # 格式化输出
3.4.3. 结果运算
awk '{print $1*$2}' a.txt # 输出第一列和第二列相乘的结果
3.4.4. 判断
awk 'NR==2{print "columns:" NF, $0}' a.txt # 打印第二行的列数和完整行内容。{}外不用加if
awk '{if(NR<2 && NR >10) print $0}' a.txt # 打印第二行到第10行的内容
awk '$1>2' a.txt # 输出第一列大于2的行
3.4.5. 循环
awk '{for(i=1;i<10;i++){print $i}}' a.txt # 依次打印每一行第1列到第10列的内容
3.4.6. 自定义变量
ll | awk '{if($5>100){count++; sum+=$5}} END{print "Count:" count,"Sum:" sum}' # 统计目录下的大于100k文件的数量和总和;count和sum为自定义变量,默认值为0;加END,只显示最后的结果
awk '{s[$1]++} END{(for a in s){print a,s[a]}}' a.txt # 统计第一列每个元素出现的次数,最后打印每个元素以及每个元素出现的次数;s为数组变量,索引为该元素的值
eval $(awk '{printf("x=%s\ny=%s\nz=%s",$1,$2,$3)}' a.txt) # 赋值给外部变量x,y,
3.4.7. 自定义函数
$ cat script.awk
# 返回最小值
function find_min(num1, num2)
{
if (num1 < num2)
return num1
return num2
}
# 返回最大值
function find_max(num1, num2)
{
if (num1 > num2)
return num1
return num2
}
# 主函数
function main(num1, num2)
{
# 查找最小值
result = find_min(10, 20)
print "Minimum =", result
# 查找最大值
result = find_max(10, 20)
print "Maximum =", result
}
# 脚本从这里开始执行
BEGIN {
main(10, 20)
}
$ awk -f script.awk
Minimum = 10
Maximum = 20
4. wc
wc命令用于计算字数。
4.1. 参数说明:
- -c或--bytes或--chars 只显示Bytes数。
- -l或--lines 只显示行数。
- -w或--words 只显示字数。
4.2. 常用例子:
wc ./* # 显示文件夹下所有文件(包括总量)的行数、字数,以及字节数
wc -l xxx.txt # 统计文件的行数
5. paste
paste 指令会把每个文件以列对列的方式,一列列地加以合并。
5.1. 参数说明:
- -d<间隔字符>或--delimiters=<间隔字符>间隔字符>间隔字符> 用指定的间隔字符取代跳格字符。
- -s或--serial 串列进行而非平行处理。
- --help 在线帮助。
- --version 显示帮助信息。
5.2. 常用例子:
paste a.txt b.txt > xxx.txt