提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录

  • 前言
    • awk
      • 补充说明
        • 语法形式
        • 模式
        • 示例
        • 其他语句
        • 数组的定义
    • col
      • 补充说明
        • 语法
        • 选项
    • comm
      • 补充说明
        • 语法
        • 选项
        • 参数
    • csplit
    • 补充说明
      • 语法
      • 选项
      • 参数
      • 实例
    • ed
      • 补充说明
        • 语法
        • 选项
        • 参数
    • egrep
      • 补充说明
        • 语法
        • 实例
    • ex
      • 补充说明
      • 语法
      • 参数
    • fgrep
      • 补充说明
    • fmt
      • 补充说明
        • 语法
        • 选项
        • 参数
    • fold
      • 补充说明
        • 语法
        • 选项
        • 参数
    • ispell
      • 补充说明
        • 语法
        • 参数
    • join
      • 补充说明
        • 语法
        • 选项
        • 参数
    • joe
      • 补充说明
        • 语法
        • 选项
        • 参数
    • jed
      • 补充说明
        • 语法
        • 选项
        • 参数
        • 实例
    • grep
      • 补充说明
        • 选项
    • look
      • 补充说明
        • 语法
        • 选项
        • 参数
    • pico
      • 补充说明
        • 语法
        • 选项
        • 参数
    • sed
      • 补充说明
        • 命令格式
        • 参数
    • sort
      • 补充说明
        • 语法
        • 选项
        • 参数
        • 实例
    • tr
      • 补充说明
        • 语法
        • 选项
        • 参数
    • uniq
      • 补充说明
        • 语法
        • 选项
        • 参数
    • vi
      • 补充说明
        • 语法
        • 选项
        • 参数
        • 扩展
    • wc
      • 补充说明
        • 语法
        • 选项
  • 总结

前言

第三期了 ( •̀ ω •́ )y


提示:本篇文章有彩蛋,

awk

文本和数据进行处理的编程语言

补充说明

awk 是一种编程语言,用于在linux/unix下对文本和数据进行处理。数据可以来自标准输入(stdin)、一个或多个文件,或其它命令的输出。它支持用户自定义函数和动态正则表达式等先进功能,是linux/unix下的一个强大编程工具。它在命令行中使用,但更多是作为脚本来使用。awk有很多内建的功能,比如数组、函数等,这是它和C语言的相同之处,灵活性是awk最大的优势。

awk命令格式和选项

语法形式

awk [options] ‘script’ var=value file(s)
awk [options] -f scriptfile var=value file(s)
常用命令选项

  • -F fs **fs指定输入分隔符,fs可以是字符串或正则表达式,如-F:
  • -v var=value ** 赋值一个用户定义变量,将外部变量传递给awk
  • -f scripfile 从脚本文件中读取awk命令
  • -m[fr] val 对val值设置内在限制,-mf选项限制分配给val的最大块数目;-mr选项限制记录的最大数目。这两个功能是Bell实验室版awk的扩展功能,在标准awk中不适用。
    awk模式和操作
    awk脚本是由模式和操作组成的。
模式

模式可以是以下任意一个:

/正则表达式/:使用通配符的扩展集。
关系表达式:使用运算符进行操作,可以是字符串或数字的比较测试。
模式匹配表达式:用运算符(匹配)和!(不匹配)。
BEGIN语句块、pattern语句块、END语句块:参见awk的工作原理
操作
操作由一个或多个命令、函数、表达式组成,之间由换行符或分号隔开,并位于大括号内,主要部分是:

变量或数组赋值
输出命令
内置函数
控制流语句
awk脚本基本结构

awk 'BEGIN{ print "start" } pattern{ commands } END{ print "end" }' file

一个awk脚本通常由:BEGIN语句块、能够使用模式匹配的通用语句块、END语句块3部分组成,这三个部分是可选的。任意一个部分都可以不出现在脚本中,脚本通常是被 单引号 或 双引号 中,例如:

awk 'BEGIN{ i=0 } { i++ } END{ print i }' filename
awk "BEGIN{ i=0 } { i++ } END{ print i }" filename

awk的工作原理

awk 'BEGIN{ commands } pattern{ commands } END{ commands }'
  • 第一步:执行BEGIN{ commands }语句块中的语句;
  • 第二步:从文件或标准输入(stdin)读取一行,然后执行pattern{ commands }语句块,它逐行扫描文件,从第一行到最后一行重复这个过程,直到文件全部被读取完毕。
  • 第三步:当读至输入流末尾时,执行END{ commands }语句块。

BEGIN语句块 在awk开始从输入流中读取行 之前 被执行,这是一个可选的语句块,比如变量初始化、打印输出表格的表头等语句通常可以写在BEGIN语句块中。

END语句块 在awk从输入流中读取完所有的行 之后 即被执行,比如打印所有行的分析结果这类信息汇总都是在END语句块中完成,它也是一个可选语句块。

pattern语句块 中的通用命令是最重要的部分,它也是可选的。如果没有提供pattern语句块,则默认执行{ print },即打印每一个读取到的行,awk读取的每一行都会执行该语句块。

示例
echo -e "A line 1nA line 2" | awk 'BEGIN{ print "Start" } { print } END{ print "End" }'
Start
A line 1
A line 2
End

当使用不带参数的print时,它就打印当前行,当print的参数是以逗号进行分隔时,打印时则以空格作为定界符。在awk的print语句块中双引号是被当作拼接符使用,例如:

echo | awk '{ var1="v1"; var2="v2"; var3="v3"; print var1,var2,var3; }'
v1 v2 v3

双引号拼接使用:

echo | awk '{ var1="v1"; var2="v2"; var3="v3"; print var1"="var2"="var3; }'
v1=v2=v3

{ }类似一个循环体,会对文件中的每一行进行迭代,通常变量初始化语句(如:i=0)以及打印文件头部的语句放入BEGIN语句块中,将打印的结果等语句放在END语句块中。

awk内置变量(预定义变量)
说明:[A][N][P][G]表示第一个支持变量的工具,

[A]=awk、[N]=nawk、[P]=POSIXawk、[G]=gawk

$n 当前记录的第n个字段,比如n为1表示第一个字段,n为2表示第二个字段。
$0 这个变量包含执行过程中当前行的文本内容。
[N] ARGC 命令行参数的数目。
[G] ARGIND 命令行中当前文件的位置(从0开始算)。
[N] ARGV 包含命令行参数的数组。
[G] CONVFMT 数字转换格式(默认值为%.6g)。
[P] ENVIRON 环境变量关联数组。
[N] ERRNO 最后一个系统错误的描述。
[G] FIELDWIDTHS 字段宽度列表(用空格键分隔)。
[A] FILENAME 当前输入文件的名。
[P] FNR 同NR,但相对于当前文件。
[A] FS 字段分隔符(默认是任何空格)。
[G] IGNORECASE 如果为真,则进行忽略大小写的匹配。
[A] NF 表示字段数,在执行过程中对应于当前的字段数。
[A] NR 表示记录数,在执行过程中对应于当前的行号。
[A] OFMT 数字的输出格式(默认值是%.6g)。
[A] OFS 输出字段分隔符(默认值是一个空格)。
[A] ORS 输出记录分隔符(默认值是一个换行符)。
[A] RS 记录分隔符(默认是一个换行符)。
[N] RSTART 由match函数所匹配的字符串的第一个位置。
[N] RLENGTH 由match函数所匹配的字符串的长度。
[N] SUBSEP 数组下标分隔符(默认值是34)。
示例

echo -e "line1 f2 f3nline2 f4 f5nline3 f6 f7" | awk '{print "Line No:"NR", No of fields:"NF, "$0="$0, "$1="$1, "$2="$2, "$3="$3}'
Line No:1, No of fields:3 $0=line1 f2 f3 $1=line1 $2=f2 $3=f3
Line No:2, No of fields:3 $0=line2 f4 f5 $1=line2 $2=f4 $3=f5
Line No:3, No of fields:3 $0=line3 f6 f7 $1=line3 $2=f6 $3=f7

使用print NF可以打印出一行中的最后一个字段,使用NF可以打印出一行中的最后一个字段,使用NF可以打印出一行中的最后一个字段,使用(NF-1)则是打印倒数第二个字段,其他以此类推:

echo -e "line1 f2 f3n line2 f4 f5" | awk '{print $NF}'
f3
f5
echo -e "line1 f2 f3n line2 f4 f5" | awk '{print $(NF-1)}'
f2
f4

打印每一行的第二和第三个字段:

awk '{ print $2,$3 }' filename

统计文件中的行数:

awk 'END{ print NR }' filename

以上命令只使用了END语句块,在读入每一行的时,awk会将NR更新为对应的行号,当到达最后一行NR的值就是最后一行的行号,所以END语句块中的NR就是文件的行数。
一个每一行中第一个字段值累加的例子:

seq 5 | awk 'BEGIN{ sum=0; print "总和:" } { print $1"+"; sum+=$1 } END{ print "等于"; print sum }'

总和:
1+
2+
3+
4+
5+
等于
15
将外部变量值传递给awk
借助 -v选项 ,可以将外部值(并非来自stdin)传递给awk:

VAR=10000
echo | awk -v VARIABLE=$VAR '{ print VARIABLE }'

另一种传递外部变量方法:

var1="aaa"
var2="bbb"
echo | awk '{ print v1,v2 }' v1=$var1 v2=$var2

当输入来自于文件时使用:

awk '{ print v1,v2 }' v1=$var1 v2=$var2 filename

以上方法中,变量之间用空格分隔作为awk的命令行参数跟随在BEGIN、{}和END语句块之后。

awk运算与判断
作为一种程序设计语言所应具有的特点之一,awk支持多种运算,这些运算与C语言提供的基本相同。awk还提供了一系列内置的运算函数(如log、sqr、cos、sin等)和一些用于对字符串进行操作(运算)的函数(如length、substr等等)。这些函数的引用大大的提高了awk的运算功能。作为对条件转移指令的一部分,关系判断是每种程序设计语言都具备的功能,awk也不例外,awk中允许进行多种测试,作为样式匹配,还提供了模式匹配表达式(匹配)和!(不匹配)。作为对测试的一种扩充,awk也支持用逻辑运算符。

算术运算符
运算符 描述

  • 加,减
  • / & 乘,除与求余

    • ! 一元加,减和逻辑非
      ^ *** 求幂
      ++ – 增加或减少,作为前缀或后缀
      例:
awk 'BEGIN{a="b";print a++,++a;}'
0 2

注意:所有用作算术运算符进行操作,操作数自动转为数值,所有非数值都变为0

赋值运算符
运算符 描述
= += -= *= /= %= ^= **= 赋值语句
例:

a+=5; 等价于:a=a+5; 其它同类
逻辑运算符
运算符 描述
|| 逻辑或
&& 逻辑与

例:

awk 'BEGIN{a=1;b=2;print (a>5 && b<=2),(a>5 || b<=2);}'
0 1

正则运算符
运算符 描述
~ ~! 匹配正则表达式和不匹配正则表达式
例:

awk 'BEGIN{a="100testa";if(a ~ /^100*/){print "ok";}}'

ok
关系运算符
运算符 描述
< <= > >= != == 关系运算符
例:

awk 'BEGIN{a=11;if(a >= 9){print "ok";}}'

ok
注意:> < 可以作为字符串比较,也可以用作数值比较,关键看操作数如果是字符串就会转换为字符串比较。两个都为数字才转为数值比较。字符串比较:按照ASCII码顺序比较。

其它运算符:
运算符 描述
$ 字段引用
空格 字符串连接符
?: C条件表达式
in 数组中是否存在某键值
例:

awk 'BEGIN{a="b";print a=="b"?"ok":"err";}'
ok
awk 'BEGIN{a="b";arr[0]="b";arr[1]="c";print (a in arr);}'
0
awk 'BEGIN{a="b";arr[0]="b";arr["b"]="c";print (a in arr);}'
1

运算级优先级表
!级别越高越优先
级别越高越优先

awk高级输入输出
读取下一条记录
awk中next语句使用:在循环逐行匹配,如果遇到next,就会跳过当前行,直接忽略下面语句。而进行下一行匹配。net语句一般用于多行合并:

cat text.txt
a
b
c
d
e
awk 'NR%2==1{next}{print NR,$0;}' text.txt
2 b
4 d

当记录行号除以2余1,就跳过当前行。下面的print NR,$0也不会执行。下一行开始,程序有开始判断NR%2值。这个时候记录行号是:2 ,就会执行下面语句块:‘print NR,$0’

分析发现需要将包含有“web”行进行跳过,然后需要将内容与下面行合并为一行:

cat text.txt
web01[192.168.2.100]
httpd            ok
tomcat               ok
sendmail               ok
web02[192.168.2.101]
httpd            ok
postfix               ok
web03[192.168.2.102]
mysqld            ok
httpd               ok
0
awk '/^web/{T=$0;next;}{print T":t"$0;}' test.txt
web01[192.168.2.100]:   httpd            ok
web01[192.168.2.100]:   tomcat               ok
web01[192.168.2.100]:   sendmail               ok
web02[192.168.2.101]:   httpd            ok
web02[192.168.2.101]:   postfix               ok
web03[192.168.2.102]:   mysqld            ok
web03[192.168.2.102]:   httpd               ok

简单地读取一条记录
awk getline用法:输出重定向需用到getline函数。getline从标准输入、管道或者当前正在处理的文件之外的其他输入文件获得输入。它负责从输入获得下一行的内容,并给NF,NR和FNR等内建变量赋值。如果得到一条记录,getline函数返回1,如果到达文件的末尾就返回0,如果出现错误,例如打开文件失败,就返回-1。

getline语法:getline var,变量var包含了特定行的内容。

awk getline从整体上来说,用法说明:

当其左右无重定向符|或<时: getline作用于当前文件,读入当前文件的第一行给其后跟的变量var或$0(无变量),应该注意到,由于awk在处理getline之前已经读入了一行,所以getline得到的返回结果是隔行的。
当其左右有重定向符|或<时: getline则作用于定向输入文件,由于该文件是刚打开,并没有被awk读入一行,只是getline读入,那么getline返回的是该文件的第一行,而不是隔行。
示例:

执行linux的date命令,并通过管道输出给getline,然后再把输出赋值给自定义变量out,并打印它:

awk 'BEGIN{ "date" | getline out; print out }' test

执行shell的date命令,并通过管道输出给getline,然后getline从管道中读取并将输入赋值给out,split函数把变量out转化成数组mon,然后打印数组mon的第二个元素:

awk 'BEGIN{ "date" | getline out; split(out,mon); print mon[2] }' test

命令ls的输出传递给geline作为输入,循环使getline从ls的输出中读取一行,并把它打印到屏幕。这里没有输入文件,因为BEGIN块在打开输入文件前执行,所以可以忽略输入文件。

awk 'BEGIN{ while( "ls" | getline) print }'

关闭文件
awk中允许在程序中关闭一个输入或输出文件,方法是使用awk的close语句。

close("filename")

filename可以是getline打开的文件,也可以是stdin,包含文件名的变量或者getline使用的确切命令。或一个输出文件,可以是stdout,包含文件名的变量或使用管道的确切命令。

输出到一个文件
awk中允许用如下方式将结果输出到一个文件:

echo | awk '{printf("hello word!n") > "datafile"}'

echo | awk '{printf("hello word!n") >> "datafile"}'

设置字段定界符
默认的字段定界符是空格,可以使用-F “定界符” 明确指定一个定界符:

awk -F: '{ print $NF }' /etc/passwd

awk 'BEGIN{ FS=":" } { print $NF }' /etc/passwd

在BEGIN语句块中则可以用OFS=“定界符”设置输出字段的定界符。

流程控制语句
在linux awk的while、do-while和for语句中允许使用break,continue语句来控制流程走向,也允许使用exit这样的语句来退出。break中断当前正在执行的循环并跳到循环外执行下一条语句。if 是流程选择用法。awk中,流程控制语句,语法结构,与c语言类型。有了这些语句,其实很多shell程序都可以交给awk,而且性能是非常快的。下面是各个语句用法。

条件判断语句
if(表达式)
语句1
else
语句2
格式中语句1可以是多个语句,为了方便判断和阅读,最好将多个语句用{}括起来。awk分枝结构允许嵌套,其格式为:

if(表达式)
{语句1}
else if(表达式)
{语句2}
else
{语句3}
示例:

awk 'BEGIN{
test=100;
if(test>90){print "very good";}else if(test>60){print "good";}else{print "no pass";}
}'

每条命令语句后面可以用; 分号 结尾。

循环语句
while语句
while(表达式)
{语句}
示例:

awk 'BEGIN{
test=100;
total=0;
while(i<=test){total+=i;i++;
}
print total;
}'
5050

for循环
for循环有两种格式:

格式1:

for(变量 in 数组)
{语句}
示例:

awk 'BEGIN{
for(k in ENVIRON){print k"="ENVIRON[k];
}}'
TERM=linux
G_BROKEN_FILENAMES=1
SHLVL=1
pwd=/root/text
...
logname=root
HOME=/root
SSH_CLIENT=192.168.1.21 53087 22

注:ENVIRON是awk常量,是子典型数组。

格式2:

for(变量;条件;表达式)
{语句}
示例:

awk 'BEGIN{
total=0;
for(i=0;i<=100;i++){total+=i;
}
print total;
}'
5050
do循环
do
{语句} while(条件)

例子:

awk 'BEGIN{
total=0;
i=0;
do {total+=i;i++;} while(i<=100)print total;
}'
5050
其他语句

break 当 break 语句用于 while 或 for 语句时,导致退出程序循环。
continue 当 continue 语句用于 while 或 for 语句时,使程序循环移动到下一个迭代。
next 能能够导致读入下一个输入行,并返回到脚本的顶部。这可以避免对当前输入行执行其他的操作过程。
exit 语句使主输入循环退出并将控制转移到END,如果END存在的话。如果没有定义END规则,或在END中应用exit语句,则终止脚本的执行。
数组应用
数组是awk的灵魂,处理文本中最不能少的就是它的数组处理。因为数组索引(下标)可以是数字和字符串在awk中数组叫做关联数组(associative arrays)。awk 中的数组不必提前声明,也不必声明大小。数组元素用0或空字符串来初始化,这根据上下文而定。

数组的定义

数字做数组索引(下标):

Array[1]="sun"
Array[2]="kai"

字符串做数组索引(下标):

Array["first"]="www"
Array"[last"]="name"
Array["birth"]="1987"

使用中print Array[1]会打印出sun;使用print Array[2]会打印出kai;使用print[“birth”]会得到1987。

读取数组的值

{ for(item in array) {print array[item]}; }

col

过滤控制字符

补充说明

col命令 是一个标准输入文本过滤器,它从标注输入设备读取文本内容,并把内容显示到标注输出设备。在许多UNIX说明文件里,都有RLF控制字符。当我们运用shell特殊字符>和>>,把说明文件的内容输出成纯文本文件时,控制字符会变成乱码,col命令则能有效滤除这些控制字符。

语法

col(选项)

选项
  • -b:过滤掉所有的控制字符,包括RLF和HRLF;
  • -f:滤掉RLF字符,但允许将HRLF字符呈现出来;
  • -x:以多个空格字符来表示跳格字符;
  • -l<缓冲区列数>:预设的内存缓冲区有128列,用户可以自行指定缓冲区的大小

comm

两个文件之间的比较

补充说明

comm命令 可以用于两个文件之间的比较,它有一些选项可以用来调整输出,以便执行交集、求差、以及差集操作。

  • 交集:打印出两个文件所共有的行。
  • 求差:打印出指定文件所包含的且不相同的行。
  • 差集:打印出包含在一个文件中,但不包含在其他指定文件中的行。
语法

comm(选项)(参数)

选项

-1:不显示在第一个文件出现的内容;
-2:不显示在第二个文件中出现的内容;
-3:不显示同时在两个文件中都出现的内容。

参数
  • 文件1:指定要比较的第一个有序文件;
  • 文件2:指定要比较的第二个有序文件。

csplit

将一个大文件分割成小的碎片文件

补充说明

csplit命令 用于将一个大文件分割成小的碎片,并且将分割后的每个碎片保存成一个文件。碎片文件的命名类似“xx00”,“xx01”。csplit命令是split的一个变体,split只能够根据文件大小或行数来分割,但csplit能够根据文件本身特点来分割文件。

语法

csplit(选项)(参数)

选项
  • -b<输出格式>或–suffix-format=<输出格式>:预设的输出格式其文件名称为xx00,xx01等,用户可以通过改变<输出格式>来改变输出的文件名;
  • -f<输出字首字符串>或–prefix=<输出字首字符串>:预设的输出字首字符串其文件名为xx00,xx01等,如果制定输出字首字符串为“hello”,则输出的文件名称会变成hello00,hello、01…
  • -k或–keep-files:保留文件,就算发生错误或中断执行,与不能删除已经输出保存的文件;
  • -n<输出文件名位数>或–digits=<输出文件名位数>:预设的输出文件名位数其文件名称为xx00,xx01…如果用户指定输出文件名位数为“3”,则输出的文件名称会变成xx000,xx001等;
  • -q或-s或–quiet或——silent:不显示指令执行过程;
  • -z或–elide-empty-files:删除长度为0 Byte文件。
参数

文件:指定要分割的原文件;
模式:指定要分割文件时的匹配模式。

实例

示例测试文件 server.log

cat server.log
SERVER-1
[con] 10.10.10.1 suc
[con] 10.10.10.2 fai
[dis] 10.10.10.3 pen
[con] 10.10.10.4 suc
SERVER-2
[con] 10.10.10.5 suc
[con] 10.10.10.6 fai
[dis] 10.10.10.7 pen
[con] 10.10.10.8 suc
SERVER-3
[con] 10.10.10.9 suc
[con] 10.10.10.10 fai
[dis] 10.10.10.11 pen
[con] 10.10.10.12 suc

需要将server.log分割成server1.log、server2.log、server3.log,这些文件的内容分别取自原文件中不同的SERVER部分

ed

单行纯文本编辑器

补充说明

ed命令 是单行纯文本编辑器,它有命令模式(command mode)和输入模式(input mode)两种工作模式。ed命令支持多个内置命令,常见内置命令如下:

  • A:切换到输入模式,在文件的最后一行之后输入新的内容;
  • C:切换到输入模式,用输入的内容替换掉最后一行的内容;
  • i:切换到输入模式,在当前行之前加入一个新的空行来输入内容;
  • d:用于删除最后一行文本内容;
  • n:用于显示最后一行的行号和内容;
  • w:<文件名>:一给定的文件名保存当前正在编辑的文件;
  • q:退出ed编辑器。
语法

ed(选项)(参数)

选项
  • -G或——traditional:提供兼容的功能;
  • -p<字符串>:指定ed在command mode的提示字符;
  • -s,-,–quiet或——silent:不执行开启文件时的检查功能;
  • –help:显示帮助;
  • –version:显示版本信息。
参数

文件:待编辑的文件。

egrep

在文件内查找指定的字符串

补充说明

egrep命令 用于在文件内查找指定的字符串。egrep执行效果与grep -E相似,使用的语法及参数可参照grep指令,与grep的不同点在于解读字符串的方法。egrep是用extended regular expression语法来解读的,而grep则用basic regular expression 语法解读,extended regular expression比basic regular expression的表达更规范。

语法

egrep(选项)(查找模式)(文件名1,文件名2,……)

实例

显示文件中符合条件的字符。例如,查找当前目录下所有文件中包含字符串"Linux"的文件,

ex

启动vim编辑器的ex编辑模式

补充说明

在 ex 模式下启动vim文本编辑器。ex执行效果如同vi -E,适用于法及参数可参照vi指令,如要从Ex模式回到普通模式,则在vim中输入:vi或:visual即可。

语法

ex(参数)

参数

文件:指定待编辑的文件。

fgrep

为文件搜索文字字符串

补充说明

fgrep命令 是用来搜索 file 参数指定的输入文件(缺省为标准输入)中的匹配模式的行。fgrep 命令特别搜索 Pattern 参数,它们是固定的字符串。如果在 File 参数中指定一个以上的文件 fgrep 命令将显示包含匹配行的文件。

fgrep 命令于 grep 和 egrep 命令不同,因为它搜索字符串而不是搜索匹配表达式的模式。fgrep 命令使用快速的压缩算法。$, *, &

fmt

读取文件后优化处理并输出

补充说明

fmt命令 读取文件的内容,根据选项的设置对文件格式进行简单的优化处理,并将结果送到标准输出设备。

语法

fmt(选项)(参数)

选项
  • -c或–crown-margin:每段前两列缩排;
  • -p<列起始字符串>或-prefix=<列起始字符串>:仅合并含有指定字符串的列,通常运用在程序语言的注解方面;
  • -s或–split-only:只拆开字数超出每列字符数的列,但不合并字数不足每列字符数的列;
  • -t或–tagged-paragraph:每列前两列缩排,但第1列和第2列的缩排格式不同;
  • -u或–uniform-spacing:每列字符之间都以一个空格字符间隔,每个句子之间则两个空格字符分隔;
  • -w<每列字符数>或–width=<每列字符数>或-<每列字符数>:设置每列的最大字符数。
参数

指定要优化格式的文件。

fold

控制文件内容输出时所占用的屏幕宽度

补充说明

fold命令 用于控制文件内容输出时所占用的屏幕宽度。fold命令会从指定的文件里读取内容,将超过限定列宽的列加入增列字符后,输出到标准输出设备。若不指定任何文件名称,或是所给予的文件名为“-”,则fold指令会从标准输入设备读取数据。

语法

fold(选项)(参数)

选项
  • -b或——bytes:以Byte为单位计算列宽,而非采用行数编号为单位;
  • -s或——spaces:以空格字符作为换列点;
  • -w<每列行数>或–width<每列行数>:设置每列的最大行数。
参数

文件:指定要显示内容的文件。

ispell

检查文件中出现的拼写错误

补充说明

ispell命令 用于检查文件中出现的拼写错误。

语法

ispell(参数)

参数

文件:指定要进行拼写检查的文件。

join

两个文件中指定栏位内容相同的行连接起来

补充说明

join命令 用来将两个文件中,制定栏位内容相同的行连接起来。找出两个文件中,指定栏位内容相同的行,并加以合并,再输出到标准输出设备。

语法

join(选项)(参数)

选项
  • -a<1或2>:除了显示原来的输出内容之外,还显示指令文件中没有相同栏位的行;
  • -e<字符串>:若[文件1]与[文件2]中找不到指定的栏位,则在输出中填入选项中的字符串;
  • -i或–ignore-case:比较栏位内容时,忽略大小写的差异;
  • -o<格式>:按照指定的格式来显示结果;
  • -t<字符>:使用栏位的分割字符;
  • -v<1或2>:更-a相同,但是只显示文件中没有相同栏位的行;
  • -1<栏位>:连接[文件1]指定的栏位;
  • -2<栏位>:连接[文件2]指定的栏位。
参数

文件1:要进行合并操作的第1个文件参数;
文件2:要进行合并操作的第2个文件参数。

joe

强大的纯文本编辑器

补充说明

joe命令 是一款功能强大的纯文本编辑器,拥有众多编写程序和文本的优良特性。

语法

joe(选项)(参数)

选项
  • -force:强制在最后一行的结尾处加上换行符号;
  • -lines<行数>:设置行数;
  • -lightoff:选取的区块在执行完区块命令后,就会恢复成原来的状态;
  • -autoindent:自动缩排;
  • -backpath:<目录>:指定备份文件的目录;
  • -beep:编辑时,若有错误即发出哔声;
  • -columns<栏位>:设置栏数;
  • -csmode:可执行连续查找模式;
  • -dopadding:是程序跟tty间存在缓冲区;
  • -exask:在程序中,执行“Ctrl+k+x”时,会先确认是否要保存文件;
  • -force:强制在最后一行的结尾处加上换行符号;
  • -help:执行程序时一并显示帮助;
  • -keepup:在进入程序后,画面上方为状态列;
  • -marking:在选取区块时,反白区块会随着光标移动;
  • -mid:当光标移出画面时,即自动卷页,使光标回到中央;
  • -nobackups:不建立备份文件;
  • -nonotice:程序执行时,不显示版本信息;
  • -nosta:程序执行时,不显示状态列;
  • -noxon:尝试取消“Ctrl+s”和“Ctrl+q”键的功能;
  • -orphan:若同时开启一个以上的文件,则其他文件会置于独立的缓冲区,而不会另外开启编辑区;
  • -pg<行数>:按“PageUp”或“PageDown”换页时,所要保留前一页的行数;
  • -skiptop<行数>:不使用屏幕上方指定的行数。
参数

文件:指定要编辑的文件。

jed

主要用于编辑代码的编辑器

补充说明

jed命令 是由Slang所开发,其主要用用途是编辑程序的源代码。它支持彩色语法加亮显示,可以模拟emacs,EDT,wordstar和Brief编辑器。

语法

jed(选项)(参数)

选项
  • -2:显示上下两个编辑区;
  • -batch:以批处理模式来执行;
  • -f<函数>:执行Slang函数;
  • -g<行数>:移到缓冲区中指定的行数;
  • -i<文件>:将指定的文件载入缓冲区;
  • -n:不要载入jed.rc配置文件;
  • -s<字符串>:查找并移到指定的字符串。
参数

文件:指定待编辑的文件列表。

实例

以上下两个编辑区的方式,开启 mysource.c 原始代码文件。若要切换编辑区,可利用稍后介绍的命令,开启操作命令,开启功能表后,按 3 ,再按 2 ,即可切换编辑区:

jed -2 mysource.c

操作

有些Emacs的组合键和jed菜单组合键冲突例如Alt+f在Emacs中应该是“前进一个单词”,而在jed中则是“文件菜单” 想使用Emacs风格的组合键的话,编辑/usr/share/jed/lib/menus.slc找到如下段落:

unsetsetkey ("selectmenubar", "\em");
unsetsetkey ("@\emF", "\ef");
unsetsetkey ("@\emE", "\ee");
unsetsetkey ("@\emo", "\eo");
% Mode menu unsetsetkey ("@\emS", "\es");
unsetsetkey ("@\emB", "\eb");
unsetsetkey ("@\emi", "\ei");
unsetsetkey ("@\emH", "\eh");
unset_setkey ("@\emy", "\ey");

可以根据自己的需要修改,也可以简单的注释掉;使用菜单可以用F10键。

由于Jed可模拟多种编辑器,其各自按键指令也有所不同。这里以模拟 Emacs 为例,说明在编辑器中的操作方法。

文件

/usr/share/jed/lib/*.sl 这是默认的运行jed slang的文件。
/usr/share/jed/lib/site.sl 这是默认的启动文件。
/etc/jed.rc 这是全局系统配置文件。
~/.jedrc 这是用户配置文件。

grep

强大的文本搜索工具

补充说明

grep (global search regular expression(RE) and print out the line,全面搜索正则表达式并把行打印出来)是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹配的行打印出来。用于过滤/搜索的特定字符。可使用正则表达式能多种命令配合使用,使用上十分灵活。

选项
-a --text

look

显示文件中以指定字符串开头的任意行

补充说明

look命令 用于显示文件中以指定字符串开头的任意行。

语法

look(选项)(参数)

选项
  • -a:使用另一个字典文件web2,该文件也位于/usr/dict目录下;
  • -d:只对比英文字母和数字,其余一概忽略不予比对;
  • -f:忽略字符大小写差别;
  • -t<字尾字符串>:设置字尾字符串。
参数

字符串:指定要查找的字符串;
文件:指定要查找的目标文件。

pico

功能强大全屏幕的文本编辑器

补充说明

pico命令 是功能强大全屏幕的文本编辑器。pico的操作简单,提供了丰富的快捷键。常用的快捷键如下:

  • Ctrl+G:获得pico的帮助信息;
  • Ctrl+O:保存文件内容,如果是新文件,需要输入文件名;
  • Ctrl+R:在当前光标位置插入一个指定的文本文件内容;
  • Ctrl+Y:向前翻页;
  • Ctrl+V:向后翻页;
  • Ctrl+w:对文件进行搜索;
  • Ctrl+K:剪切当前文件行到粘贴缓冲区;
  • Ctrl+U:粘贴缓冲区中的内容到当前光标所在位置;
  • Ctrl+C:显示当前光标位置;
  • Ctrl+T:调用拼写检查功能,对文档进行拼写检查;
  • Ctrl+J:段落重排;
  • Ctrl+X:退出,当文件内容发生改变时,提供是否保存修改。
语法

pico(选项)(参数)

选项
  • -b:开启置换的功能;
  • -d:开启删除的功能;
  • -e:使用完整的文件名称;
  • -f:支持键盘上F1、F2…功能键;
  • -g:显示光标;
  • -h:在线帮助;
  • -j:开启切换的功能;
  • -k:预设pico在使用剪下命令时,会把光标所在的列的内容全部删除;
  • -m:开启鼠标支持的功能,您可用鼠标点选命令列表;
  • -n<间隔秒数>:设置多久检查一次新邮件;
  • -o<工作目录>:设置工作目录;
  • -q:忽略预设值;
  • -r<编辑页宽>:设置编辑文件的页宽;
  • -s<拼字检查器>:另外指定拼字检查器;
  • -t:启动工具模式;
  • -v:启动阅读模式,用户只能观看,无法编辑文件的内容;
  • -w:关闭自动换行,通过这个参数可以编辑内容很长的列;
  • -x:关闭页面下方的命令列表;
  • -z:让pico可被Ctrl+z中断,暂存在后台作业里;
  • +<列表编号>:执行pico指令进入编辑模式时,从指定的列数开始编辑。
参数

文件:指定要编辑的文件。

sed

功能强大的流式文本编辑器

补充说明

sed 是一种流编辑器,它是文本处理中非常中的工具,能够完美的配合正则表达式使用,功能不同凡响。处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”(pattern space),接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下一行,这样不断重复,直到文件末尾。文件内容并没有 改变,除非你使用重定向存储输出。Sed主要用来自动编辑一个或多个文件;简化对文件的反复操作;编写转换程序等。

sed的选项、命令、替换标记

命令格式
sed [options] 'command' file(s)
sed [options] -f scriptfile file(s)

选项

  • -e
参数

文件:指定待处理的文本文件列表。

sed命令

 **a\**  在当前行下面插入文本。**i\**  在当前行上面插入文本。**c\**  把选定的行改为新的文本。**d**  删除,删除选择的行。**D**  删除模板块的第一行。**s**  替换指定字符**h**  拷贝模板块的内容到内存中的缓冲区。**H**  追加模板块的内容到内存中的缓冲区。**g**  获得内存缓冲区的内容,并替代当前模板块中的文本。**G**  获得内存缓冲区的内容,并追加到当前模板块文本的后面。**l**  列表不能打印字符的清单。**n**  读取下一个输入行,用下一个命令处理新的行而不是用第一个命令。**N**  追加下一个输入行到模板块后面并在二者间嵌入一个新行,改变当前行号码。**p**  打印模板块的行。**P** (大写) 打印模板块的第一行。**q**  退出Sed。**b lable**  分支到脚本中带有标记的地方,如果分支不存在则分支到脚本的末尾。**r file**  从file中读行。**t label**  if分支,从最后一行开始,条件一旦满足或者T,t命令,将导致分支到带有标号的命令处,或者到脚本的末尾。**T label**  错误分支,从最后一行开始,一旦发生错误或者T,t命令,将导致分支到带有标号的命令处,或者到脚本的末尾。**w file**  写并追加模板块到file末尾。  **W file**  写并追加模板块的第一行到file末尾。  **!**  表示后面的命令对所有没有被选定的行发生作用。  **=**  打印当前行号码。  

sort

将文件进行排序并输出

补充说明

sort命令 是在Linux里非常有用,它将文件进行排序,并将排序结果标准输出。sort命令既可以从特定的文件,也可以从stdin中获取输入。

语法

sort(选项)(参数)

选项
  • -b:忽略每行前面开始出的空格字符;
  • -c:检查文件是否已经按照顺序排序;
  • -d:排序时,处理英文字母、数字及空格字符外,忽略其他的字符;
  • -f:排序时,将小写字母视为大写字母;
  • -i:排序时,除了040至176之间的ASCII字符外,忽略其他的字符;
  • -m:将几个排序号的文件进行合并;
  • -M:将前面3个字母依照月份的缩写进行排序;
  • -n:依照数值的大小排序;
  • -o<输出文件>:将排序后的结果存入制定的文件;
  • -r:以相反的顺序来排序;
  • -t<分隔字符>:指定排序时所用的栏位分隔字符;
  • +<起始栏位>-<结束栏位>:以指定的栏位来排序,范围由起始栏位到结束栏位的前一栏位。
参数

文件:指定待排序的文件列表。

实例

sort将文件/文本的每一行作为一个单位,相互比较,比较原则是从首字符向后,依次按ASCII码值进行比较,最后将他们按升序输出。

tr

将字符进行替换压缩和删除

补充说明

tr命令 可以对来自标准输入的字符进行替换、压缩和删除。它可以将一组字符变成另一组字符,经常用来编写优美的单行命令,作用很强大。

语法

tr(选项)(参数)

选项
  • -c或——complerment:取代所有不属于第一字符集的字符;
  • -d或——delete:删除所有属于第一字符集的字符;
  • -s或–squeeze-repeats:把连续重复的字符以单独一个字符表示;
  • -t或–truncate-set1:先删除第一字符集较第二字符集多出的字符。
参数

字符集1:指定要转换或删除的原字符集。当执行转换操作时,必须使用参数“字符集2”指定转换的目标字符集。但执行删除操作时,不需要参数“字符集2”;
字符集2:指定要转换成的目标字符集。
实例
将输入字符由大写转换为小写:

echo "HELLO WORLD" | tr 'A-Z' 'a-z'
hello world

‘A-Z’ 和 ‘a-z’都是集合,集合是可以自己制定的,例如:‘ABD-}’、‘bB.,’、‘a-de-h’、‘a-c0-9’都属于集合,集合里可以使用’\n’、‘\t’,可以可以使用其他ASCII字符。

使用tr删除字符:

echo "hello 123 world 456" | tr -d '0-9'
hello  world

将制表符转换为空格:

cat text | tr '\t' ' '

字符集补集,从输入文本中将不在补集中的所有字符删除:

echo aa.,a 1 b

uniq

报告或忽略文件中的重复行

补充说明

uniq命令 用于报告或忽略文件中的重复行,一般与sort命令结合使用。

语法

uniq(选项)(参数)

选项
  • -c或——count:在每列旁边显示该行重复出现的次数;
  • -d或–repeated:仅显示重复出现的行列;
  • -f<栏位>或–skip-fields=<栏位>:忽略比较指定的栏位;
  • -s<字符位置>或–skip-chars=<字符位置>:忽略比较指定的字符;
  • -u或——unique:仅显示出一次的行列;
  • -w<字符位置>或–check-chars=<字符位置>:指定要比较的字符。
参数

输入文件:指定要去除的重复行文件。如果不指定此项,则从标准读取数据;
输出文件:指定要去除重复行后的内容要写入的输出文件。如果不指定此选项,则将内容显示到标准输出设备(显示终端)。
实例
删除重复行:

uniq file.txt
sort file.txt | uniq
sort -u file.txt

只显示单一行:

uniq -u file.txt
sort file.txt | uniq -u

统计各行在文件中出现的次数:

sort file.txt | uniq -c

在文件中找出重复的行:

sort file.txt | uniq -d

vi

功能强大的纯文本编辑器

补充说明

vi命令 是UNIX操作系统和类UNIX操作系统中最通用的全屏幕纯文本编辑器。Linux中的vi编辑器叫vim,它是vi的增强版(vi Improved),与vi编辑器完全兼容,而且实现了很多增强功能。

vi编辑器支持编辑模式和命令模式,编辑模式下可以完成文本的编辑功能,命令模式下可以完成对文件的操作命令,要正确使用vi编辑器就必须熟练掌握着两种模式的切换。默认情况下,打开vi编辑器后自动进入命令模式。从编辑模式切换到命令模式使用“esc”键,从命令模式切换到编辑模式使用“A”、“a”、“O”、“o”、“I”、“i”键。

vi编辑器提供了丰富的内置命令,有些内置命令使用键盘组合键即可完成,有些内置命令则需要以冒号“:”开头输入。常用内置命令如下: