Linux命令教程第三期

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6


前言

第三期了 ( •̀ ω •́ )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 N F 可以打印出一行中的最后一个字段使用 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从管道中读取并将输入赋值给outsplit函数把变量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=<输出格式>:预设的输出格式其文件名称为xx00xx01等用户可以通过改变<输出格式>来改变输出的文件名;
  • -f<输出字首字符串>或–prefix=<输出字首字符串>:预设的输出字首字符串其文件名为xx00xx01等如果制定输出字首字符串为“hello”则输出的文件名称会变成hello00hello、01…
  • -k或–keep-files:保留文件就算发生错误或中断执行与不能删除已经输出保存的文件;
  • -n<输出文件名位数>或–digits=<输出文件名位数>:预设的输出文件名位数其文件名称为xx00xx01…如果用户指定输出文件名位数为“3”则输出的文件名称会变成xx000xx001等;
  • -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所开发其主要用用途是编辑程序的源代码。它支持彩色语法加亮显示可以模拟emacsEDTwordstar和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分支从最后一行开始条件一旦满足或者Tt命令将导致分支到带有标号的命令处或者到脚本的末尾。
 **T label**  错误分支从最后一行开始一旦发生错误或者Tt命令将导致分支到带有标号的命令处或者到脚本的末尾。
 **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编辑器提供了丰富的内置命令有些内置命令使用键盘组合键即可完成有些内置命令则需要以冒号“:”开头输入。常用内置命令如下:

  • Ctrl+u:向文件首翻半屏;
  • Ctrl+d:向文件尾翻半屏;
  • Ctrl+f:向文件尾翻一屏;
  • Ctrl+b:向文件首翻一屏;
  • Esc:从编辑模式切换到命令模式;
  • ZZ:命令模式下保存当前文件所做的修改后退出vi;
  • :行号:光标跳转到指定行的行首;
  • 😒:光标跳转到最后一行的行首;
  • x或X:删除一个字符x删除光标后的而X删除光标前的;
  • D:删除从当前光标到光标所在行尾的全部字符;
  • dd:删除光标行正行内容;
  • ndd:删除当前行及其后n-1行;
  • nyy:将当前行及其下n行的内容保存到寄存器?中其中?为一个字母n为一个数字;
  • p:粘贴文本操作用于将缓存区的内容粘贴到当前光标所在位置的下方;
  • P:粘贴文本操作用于将缓存区的内容粘贴到当前光标所在位置的上方;
  • /字符串:文本查找操作用于从当前光标所在位置开始向文件尾部查找指定字符串的内容查找的字符串会被加亮显示;
  • ?name:文本查找操作用于从当前光标所在位置开始向文件头部查找指定字符串的内容查找的字符串会被加亮显示;
  • abs/F/T:替换文本操作用于在第a行到第b行之间将F字符串换成T字符串。其中“s/”表示进行替换操作;
  • a:在当前字符后添加文本;
  • A:在行末添加文本;
  • i:在当前字符前插入文本;
  • I:在行首插入文本;
  • o:在当前行后面插入一空行;
  • O:在当前行前面插入一空行;
  • :wq:在命令模式下执行存盘退出操作;
  • :w:在命令模式下执行存盘操作;
  • :w:在命令模式下执行强制存盘操作;
  • :q:在命令模式下执行退出vi操作;
  • :q:在命令模式下执行强制退出vi操作;
  • :e文件名:在命令模式下打开并编辑指定名称的文件;
  • :n:在命令模式下如果同时打开多个文件则继续编辑下一个文件;
  • :f:在命令模式下用于显示当前的文件名、光标所在行的行号以及显示比例;
  • :set number:在命令模式下用于在最左端显示行号;
  • :set nonumber:在命令模式下用于在最左端不显示行号;
语法

vi(选项)(参数)

选项
  • +<行号>:从指定行号的行开始先是文本内容;
  • -b:以二进制模式打开文件用于编辑二进制文件和可执行文件;
  • -c<指令>:在完成对第一个文件编辑任务后执行给出的指令;
  • -d:以diff模式打开文件当多个文件编辑时显示文件差异部分;
  • -l:使用lisp模式打开“lisp”和“showmatch”;
  • -m:取消写文件功能重设“write”选项;
  • -M:关闭修改功能;
  • -n:不实用缓存功能;
  • -o<文件数目>:指定同时打开指定数目的文件;
  • -R:以只读方式打开文件;
  • -s:安静模式不现实指令的任何错误信息。
参数

文件列表:指定要编辑的文件列表。多个文件之间使用空格分隔开。

扩展

vi编辑器有三种工作方式:命令方式、输入方式和ex转义方式。通过相应的命令或操作在这三种工作方式之间可以进行转换。

命令方式

在Shell提示符后输入命令vi进入vi编辑器并处于vi的命令方式。此时从键盘上输入的任何字符都被作为编辑命令来解释例如a(append表示附加命令i(insert表示插入命令x表示删除字符命令等。如果输入的字符不是vi的合法命令则机器发出“报警声”光标不移动。另外在命令方式下输入的字符即vi命令并不在屏幕上显示出来例如输入i屏幕上并无变化但通过执行i命令编辑器的工作方式却发生变化:由命令方式变为输入方式。

输入方式

通过输入vi的插入命令i、附加命令a、打开命令o、替换命令s、修改命令(c或取代命令r可以从命令方式进入输入方式。在输入方式下从键盘上输入的所有字符都被插入到正在编辑的缓冲区中被当做该文件的正文。进入输入方式后输入的可见字符都在屏幕上显示出来而编辑命令不再起作用仅作为普通字母出现。例如在命令方式下输入字母i进到输入方式然后再输入i就在屏幕上相应光标处添加一个字母i。

由输入方式回到命令方式的办法是按下Esc键。如果已在命令方式下那么按下Esc键就会发出“嘟嘟”声。为了确保用户想执行的vi命令是在命令方式下输入的不妨多按几下Esc键听到嘟声后再输入命令。

ex转义方式

vi和ex编辑器的功能是相同的二者的主要区别是用户界面。在vi中命令通常是单个字母如a,x,r等。而在ex中命令是以Enter;键结束的命令行。vi有一个专门的“转义”命令可访问很多面向行的ex命令。为使用ex转义方式可输入一个冒号:。作为ex命令提示符冒号出现在状态行通常在屏幕最下一行。按下中断键通常是Del键可终止正在执行的命令。多数文件管理命令都是在ex转义方式下执行的例如读取文件把编辑缓冲区的内容写到文件中等。转义命令执行后自动回到命令方式。例如:

:1,$s/I/i/g 按Enter键
则从文件第一行至文件末尾$将大写I全部替换成小写i。vi编辑器的三种工作方式之间的转换

wc

统计文件的字节数、字数、行数

补充说明

wc命令 统计指定文件中的字节数、字数、行数并将统计结果显示输出。利用wc指令我们可以计算文件的Byte数、字数或是列数若不指定文件名称或是所给予的文件名为“-”则wc指令会从标准输入设备读取数据。wc同时也给出所指定文件的总统计数。

语法

wc(选项)(参数)

选项
-c 

总结

第三期完成了小游戏:扫描下面二维码并解密
在这里插入图片描述

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6
标签: linux