常用shell指令_文档编辑


1. sed

sed 命令是利用脚本来处理文本文件。更适合编辑匹配到的文本。

1.1. 参数说明:

  • -e或--expression= 以选项中指定的script来处理输入的文本文件,输出到标准输出。默认参数,如果只执行一条命令,可以不加,多条指令用 ‘-e script1 -e script2’ 隔开。
  • -i[suffix]或--in-place[=suffix] 输出到源文件(即覆盖,危险动作,慎用),Mac下需要补充一个空的字符串
  • -f或--file= 以选项中指定的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

评论
  目录