【vim程序编辑器与shell】

文章目录


一、vim编辑器

1.启动与退出vim

(1)进入vim

vim 文件名

(2)退出

:w 保存

:w filename 另存为filename

:wq! 保存退出

:wq! filename 注:以filename为文件名保存后退出

:q! 不保存退出

:x 应该是保存并退出,功能和:wq!相同

2.vim的工作模式

1.2.1编辑模式下的命令

进入vim之后,处于编辑模式,此时等待编辑命令输入而不是文本输入。

常用操作

  1. 移动

  2. 查找

  3. 替换

  4. 删除

  5. 复制

  6. 粘贴

  7. 其他

1.2.2插入模式下的命令

在编辑模式下按下"i"(insert)可以进入插入模式,在插入模式下,可以进行编辑内容,若要退出编辑模式,可按"Esc"键。

1.2.3命令模式下的命令

在编辑模式下,按":"键可以进入命令模式,此时会在最后一行显示":"作为命令模式的提示符,等待用户输入命令。若想再次回到编辑模式,可以按退格键将输入的命令全部删除后,再按一下退格键,即可回到编辑模式。

二、shell

1.shell语言

  • 一种脚本
  • 能够用更简洁、更高效的语句完成相对复杂的功能
  • Shell编程有很多C语言和其他语言的特性,然而又没有其他语言那么复杂。

2.shell脚本的建立与执行

(1)建立

vim 文件名

(2)执行

  • 输入定向的执行方式
    用输入重定向的方式让shell从给定文件中读入命令行并进行相应处理。

格式: sh < 脚本名字

  • 以脚本的名作为shell参数的执行方式
    脚本名作为shell命令的参数。此种方式的好处是将参数值传递给程序中的命令

格式: sh 脚本名

  • 修改为可执行权限后直接执行方式
    脚本也可以直接执行。需要先将文件的属性改为可执行。而由文本编辑器建立的shell脚本通常对用户是没有设定执行权限的,这就需要利用chmod将它改为可执行权限。

(1)利用chmod命令增加可执行权限

chmod +x 脚本名

(2)在提示符后面输出./脚本名运行shell程序

3.shell变量

  • 一种标志
  • 可以代表数值、字符串等信息
  • 名字可以由数字、字母和下划线组成,以字母或下划线开头
  • 环境变量:定制shell的运行环境,并保证shell命令的正确执行
环境变量 含义
$0 shell程序名
$1-$9 从第一个至第九个命令行参数的值
$* 所有命令行参数的值
$# 命令行参数的总数
$$ 当前进程的进程ID
$? 最后执行的一条命令的退出状态,0为返回成功,非0为失败
$! 在后台运行的最后一个进程的进程ID
  • 用户自定义变量:用户自定义变量在shell脚本中使用,拥有临时的存储空间;其值可以改变,变量可被设置为只读,也可被传递给定义它们的shell脚本中的命令;用户定义的shell变量名是由字母或下划线开头的字母、数字和下划线序列,并且大小写字母意义不同。

自定义变量字符串赋值:变量名=字符串

注意:

1.赋值语句中,赋值号"="两边没有空格

2.如果在给变量的值中含有空格、制表位或者换行符,那么就应该用双引号把这个字符串括起来

例:myname="zhang空格san"

引用$myname时为zhang san,如果不用双引号括起来,myname的值为zhang

3.变量作为某个长字符串的一部分,长字符串的结尾就可以利用直接引用方式,变量名出现在一个长字符串开头或者中间,应该用{}把变量名括起来。

4.特殊字符

(1)引号

  1. 双引号
    除了$、倒引号和反斜线仍保留其特殊功能外,其余字符都作为普通字符对待。
  2. 单引号
    由单引号括起来的所有字符或者字符串都作为普通字符出现,特殊字符失去了原来特殊意义。
  3. 倒引号
    倒引号括起来的字符串被shell解释为命令行,在执行时,shell会先执行命令行,并以它的标准输出结果取代整个倒引号部分。

(2)注释符

用"#"号注释

(3)反斜杠符

\ 转义符,把特殊字符变成普通字符。

5.shell的输入输出命令

(1)输入read命令

  • 标准的输入命令
  • 可以利用read命令由标准输入读取数据,然后赋给指定的变量
  • 利用read命令可以交互式的为变量赋值,输入数据时,数据间以空格或制表符作为分隔符。

(2)输出echo命令

  • 其后面的参数在标准输出上输出
  • 各参数间以空格分开,以换行符终止

6.位置参数

(1)用echo输出位置参数

powershell 复制代码
# vim test2
echo $1 $2 $3 $4 $5 $6 $7 $8 $9 $0

# 执行
sh test2 a b c d e f g
输出:a b c d e f g test2

(2)用set命令给位置参数赋值

powershell 复制代码
#vim test3
echo $1 $2 $3
set m1 m2 m3
echo $1 $2 $3

# 执行
sh test3 a b c
#输出:
a b c
m1 m2 m3

(3)位置参数多于9个时

Shell中规定,shell参数最多不超过9个,如果多于9个,需要用shift命令移动位置参数,每执行一次,把参数整体向左移动一位,但$1不会取代$0的值,不能将$0移走。

shift n #向左移动n位,没有默认为1

powershell 复制代码
# vim test4
echo $1 $2 $3 $4 $5 $6 $7 $8 $9
shift
echo $1 $2 $3 $4 $5 $6 $7 $8 $9
shift 4
echo $1 $2 $3 $4 $5 $6 $7 $8 $9

# 执行
sh test4 a b c d e f g h i
# 输出:
test4 a b c d e f g h i
test4 b c d e f g h i
test4 f g h i

7.命令运行判断依据:&& 和 ||

$0:命令回传值,0为成功,非0位失败。Linux可以通过回传值判断后续的命令是否运行。

命令执行情况 说明
cmd1&&cmd2 若cmd1运行完毕且正确运行(?=0),则开始运行cmd2; 若cmd1运行完毕且为错误(?≠0),则cmd2不运行
cmd1||cmd2 若cmd1运行完毕且正确运行(?=0),则cmd2不运行; 若cmd1运行完毕且为错误(?≠0),则开始运行cmd2

例:如果不管/tmp/abc存在与否,都要创建/tmp/abc/hehe文件

ls /tmp/abc || mkdir /tmp/abc && touch /tmp/abc/hehe

三、正则表示法

正则表示法就是处理字符串的方法,它以"行"为单位来进行字符串的处理。正则表示法透过一些特殊符号的辅助,可以轻易达到查找/删除/替换某些特定字符串的工作。

使用grep结合正则表达式处理。

grep [-A] [-B] [--color=auto] '查找字符串' filename

-n:加上行号

-v:反向选择

-i:不区分大小写

-A:后面可加数字,为after的意思,除了列出该行外,后续的n行也列出来。

-B:后面可加数字,为befor的意思,除了列出该行外,前面的n行也列出来。

--color:可将搜寻出的正确数据用特殊颜色标记。

以sample.txt为例。

powershell 复制代码
[root@RHEL7-1 ~]# cat  /root/sample.txt
"Open Source" is a good mechanism to develop programs.
apple is my favorite food.
Football game is not use feet only.
this dress doesn't fit me.
However, this dress is about $ 3183 dollars.^M
GNU is free air not free beer.^M
Her hair is very beauty.^M
I can't finish the test.^M
Oh! The soup taste good.^M
motorcycle is cheap than car.
This window is clear.
the symbol '*' is represented as start.
Oh!     My god!
The gd software is a library for drafting programs.^M
You are the best is mean you are the no. 1.
The world <Happy> is the same with "glad".
I like dog.
google is the best tools for search keyword.
goooooogle yes!
go! go! Let's go.
# I am Bobby

1.查找指定字符串

grep [参数] '字符串' 文件

2.利用中括号[]来搜寻集合字符

从[]中选取特定字符,注意[]不管有几个字符,都只代表一个字符。

反向选择[^list]

中括号表示范围[a-zA-Z0-9]

3.行首与行尾字节^ $

^word 匹配行首

注意:在[]内为反向选择,在[]外为匹配行首

例:开头以小写字母的行列出

例:不想要开头是英文字母

word$ 匹配行尾

特别地,^$ 表示空白行

4.任意一个字符"."和重复字节"*"

  • . :代表一个任意字符。
  • *:代表重复前一个字符0次到无穷多次的意思,为组合形态。与之前的匹配不同。
  • 问号(?)代表匹配单个字符;
  • 中括号[]代表匹配其中任意一个字符,[]内加上数字[0-9]代表匹配0~9之间的单个数字的字符,而中括号内加上字母[abc]则是代表匹配a、b、c三个字符中的任意一个字符。

例:假设需要找出"g??d"的字符串,即共有4个字符,开头是"g"而结束是"d"。

o*:代表的是"拥有空字符或一个o以上的字符"。

oo*:第一个o必须要存在,第二个o则是可有可无的多个o, 所以,含有o、oo、ooo、oooo等,都可以被列出来。至少一个o以上的字符串。

ooo*:至少两个o以上的字符串

例:找出至少包含两个"o"的行。

例:如果想要字符串开头与结尾都是g,但是两个g之间仅能存在至少一个o,即gog、goog、gooog等?

特别地,".*"代表0个或多个任意字符

5.限定连续RE字符范围{}

限制一个范围区间内的重复字符数

字符{n,m}

三种形式:{n};{n,};{n,m}

例:找出含有两个"o"的字符串的行

例:找出g后面接2个o以上的goooo...g呢?除了可以使用gooo*g外,也可以用{}。

例:找出g后面接2~5个o,然后再接一个g的字符串。

四、输出输出重定向

  • 输入重定向是指把文件导入到命令中
  • 输出重定向则是指把原本要输出到屏幕的数据信息写入到指定文件中
  • 在日常的学习和工作中,相较于输入重定向,我们使用输出重定向的频率更高,所以又将输出重定向分为了标准输出重定向和错误输出重定向两种不同的技术,以及清空写入与追加写入两种模式。

标准输入重定向(STDIN,文件描述符为0):默认从键盘输入

标准输出重定向(STDOUT,文件描述符为1):默认输出到屏幕。

错误输出重定向(STDERR,文件描述符为2):默认输出到屏幕。

类别 操作符 含义
输入重定向 < 将命令中接收输入的途径由默认的键盘更改(重定向)为指定的文件
输出重定向 > 将命令的执行结果重定向输出到指定的文件中(先清空),命令进行输出重定向后执行结果不显示在屏幕上
>> 将命令执行的结果重定向并追加到指定文件的末尾保存
错误重定向 2> 清空指定文件的内容,并保存标准错误输出的内容到指定文件中
2>> 向指定文件中追加命令的错误输出,而不覆盖文件中的原有内容
输出与错误组合重定向 &> 将标准输出和错误输出的内容全部重定向到指定文件
&>> 将标准输出和错误输出的内容全部以追加方式重定向到指定文件

例:接下来使用输入重定向把readme.txt文件导入给wc -l命令,统计一下文件中的内容行数。

powershell 复制代码
[root@linuxprobe ~]# wc -l < readme.txt
2                                                             

例:将命令输出重定向到文件

powershell 复制代码
#将标准输出重定向到文件
ls /etc/ > etcdir
#将标准输出重定向追加到文件
ls /etc/sysconfig/ >> etcdir
#将错误输出重定向到文件
nocmd 2> errfile
#将标准输出和错误输出重定向到文件
ls afile bfile &> errfile                                                             

五、管道符

把前一个命令原本要输出到屏幕的标准正常数据当作是后一个命令的标准输入。

命令A | 命令B|命令C|...

相关推荐
原机小子16 分钟前
探索Vim的窗口艺术:窗口拆分功能全解析
linux·编辑器·vim
一颗星的征途5 小时前
宝塔-Linux模板常用命令-centos7
linux·运维·服务器
打打打劫6 小时前
Linux字符设备驱动
linux
cssl-虞老师6 小时前
Ubuntu安装Docker
linux·ubuntu·docker
Xu-小安安6 小时前
linux less命令详解
linux·less
huhy~7 小时前
PDI-kettle工具连接本地虚拟机Ubuntu上的数据库
linux·数据库·ubuntu
w_outlier7 小时前
gcc/g++的四步编译
linux·c++·gcc·g++
AllenLeungX7 小时前
Linux 安装 sftp
linux·运维·服务器
lendq7 小时前
k8s-第九节-命名空间
linux·容器·kubernetes
陪我养猪吧7 小时前
Linux 服务器环境搭建
linux·服务器·redis·mysql·nginx·jdk·maven