admin 管理员组

文章数量: 887019

〇、计算机发展简史

程序:指令+数据

缓存用于两个数的操作的时候临时存放其中一个数

最早的计算机诞生于美国宾夕法尼亚大学

早期计算机无操作系统是单任务的,因为早期的输入空间不是磁盘,而是磁带,程序运行起来之后就会形成一个进程,没运行就是一个文件

后面发展为多进程,加了一个时间管理程序,将CPU进行分时间管理调度,任何程序要运行都要经过时间管理程序,设置有多进程,管理进程不能死(后面多任务管理框架融入内核)

内核出现使程序员不用在意底层原理,后面系统和硬件结合,但输出要打印机,dos界面是单任务的系统,windows第一次搞的时候不能多任务,unix对网络的兼容管理最好

1、操作系统组成

冯诺依曼计算机五大部件

  1. 运算器——各类运算
  2. 控制器——控制总线的使用权限,完成寻址,控制对内存的读写访问
  3. 存储器——内存(RAM,随机访问存储器)、寄存器(用于锁存数据)、缓存(缓存数据,分为一级,二级,三级缓存)
  4. 输入——下达指令、提供数据到内存(CPU去内存读取——内存是扁平化地址,不像磁盘一样可以进行分区)
  5. 输出——输出数据加工结果

运算器只作运算,控制器用于控制

寻址顺序:一级缓存、二级缓存、三级缓存、内存

寄存器比高速缓存快

高级语言——汇编器(汇编语言)—— 编译器(0、1)

内存地址寄存器寻址,提出到内存缓冲区,指令寄存器经控制单元解读之后送到CPU

2、指令&指令集

程序指令是下达命令的指令,CPU用于具体执行指令

指令集

  • 普通指令:运算一些不会影响其他用户的指令
  • 特权指令:运算一些管理硬件的指令

CPU的写入读取都在内存当中,程序的指令加数据都会直接放到内存当中

程序需要有入口,指令就会向CPU说明指令的存储地址在哪儿,然后取出关联数据,然后放到运算器中进行计算

多条指令获取下一条指令的地址——寄存器锁存数据,常见的为指令指针寄存器PC,指令执行完之后,PC+1,继续执行下一条

3、程序三大结构

三大结构:顺序、循环、选择 

一、循环语句

#!/bin/bash
for i int 'seq  1  20'   //seq  打印1~20
do    //开始
    let S+=$i   //执行加运算
done  //结束
echo $S

二、选择语句

#!/bin/bash
if  [10 -eq 11]  //lt小于
then 
    echo yes;
else
    echo no;
fi
    
  • 内核加一些程序封装为光盘,然后安装展开放到磁盘
  • CPU不会轻易损耗,可用很久
  • vi和vim都是文本编辑器,vim是vi的升级版
  • bin和sbin用于存放可执行的命令
  • pstree用于查看进程之间的关联关系,可追踪调用你的进程和之前调用过的所有的进程
  • 在终端输入zsh,shell可以直接连接到修改shell的程序,可以直接修改
  • 终端是管理员的权限的话,方括号外面是#,普通用户是$,su 可切换用户,如su root就可以切换到管理员身份(sudo表示以管理员的身份执行命令)
  • ~ 表示当前的工作目录,格式为用户名nosery@主机名localhost ~(表示家目录)pwd 可用于显示当前工作所在的家目录,root的家目录和普通用户的家目录不是一个目录

配置文件的修改能修改配置,vim也可用于写脚本——etc是专门存放配置文件的文件夹 ,/ 是根目录,标准化目录不能修改,标准化越多越通用

CPU的运算速度比内存快

内存的运算速度有3600、6400,但是CPU的主频都是GHz

eg:4GHz的主频——每秒执行40亿次的运算

编程语言发展史 - 知乎

高级语言——汇编语言——低级语言

二进制语言——低级语言——通用管理程序(管理下面的驱动给应用使用,不是多任务的,所以不是内核)—— 库(接口集成为一个库)——应用程序——高级语言

写API调用库,就可以找到接口和库直接去调用即可

高级语言更多的篇幅在介绍环境

linux的根目录:32位机子在 /user/lib,64位机子目录名是 lib64

.so是linux的动态库,dll是windows的动态链接库

编译是利用编译程序从源语言编写的源程序产生目标程序的过程,是把高级语言变成计算机可以识别的2进制语言

编译程序就是把一个源程序翻译成目标程序,工作过程可分为五个阶段

词法分析;词法分析;语义检查和中间代码生成;代码优化;目标代码生成

(主要是进行词法分析和语法分析(即源程序分析),若发现有语法错误则给出提示信息)

库分为动态库和静态库

  • 静态库就是执行的时候要把程序copy一份才能使用
  • 动态库是使用的时候引用过来,使用的时候要加载
  • 共享库——调用程序,但是如果另一台电脑如果没有这个库,就引用不了,程序就执行不了,但是多个程序要使用同一个共享库的时候,需要排队,因为库只有一个,同一时间只能被一个程序调用

计算机语言有高级、低级之分,区别在于是否接近自然语言

应用、系统之分,主要区别在于运算速度是否够快

  • 系统语言:C、C++
  • 应用语言:python、java、go
通用管理程序
  • 通用管理程序用于管理所有的底层资源,抽象出来共给上层程序使用,发展到最后就是操作系统
  • 驱动用于驱动硬件设备,也就是硬件管脚的初始化程序
  • 驱动可分离出来用于管理各种各样的器件,由于他不在乎硬件的具体结构,所以具有通用性

操作系统进化史 - 知乎

操作系统=内核+各种各样的应用程序(内核用于驱动调遣)

计算机运行的话:源码——> 编译 ——> 二进制

【多任务管理】

压榨CPU性能——多线程多进程的出现

(程序运行起来叫进程)后来出现多任务管理器

CPU:按时间分片,多个程序同时推进

内存:随机存储,使用虚拟内存实现

  1. 第一个操作系统——unix操作系统,后来由于版权问题一直在打官司,windows和linux就发展起来了(有些工具如果不在unix、linux系统的话就不能使用了)
  2. 后来出现dos系统、结合PC电脑占领市场
  3. 打印机公司研发图形界面,windows诞生,但由于是单任务的,所以只能执行一个任务,运行了shell就不能运行别的任务了,修改dos之后才能完成多任务的处理,所以不如unix系统那么平顺
  4. 服务器操作系统——linux(1991年8月)
  5. GUN——倡导开源的组织,要开放源代码,linux加入之后就开源了,所有之前在unix系统能用的东西,在linux也可以使用(类unix系统),在linux系统下uname -a,最后会有个(内核版本号-时间)GUN/linux,最后就简称为了linux(常见分支:centos、ubuntu、redhat、debian等)
  6. 发行版就会使用一些内核,加上操作系统,然后打包起来供用户下载使用
  7. 程序一般放在 /bin ,可执行程序的一般放在/bin /sbin /user/bin /usr/bin等目录下,且一些重要的目录是完全不能动的
  8. Liunx可用于安卓、飞机卡牌、智能手表等

一、虚拟机的实现

虚拟化内存,磁盘和内存都是用真实的内存和磁盘,但CPU是模拟的,主要思想是使用软件来模拟硬件来实现的,内存磁盘由使用量决定,可以分配很大但是使用不大

二、虚拟机网络配置

关于虚拟机VMware内系统如何与物理机网络连接教程 - 知乎

 4、网络配置

IP获取方式——动态(DHCP)&静态(STATIC)

1、一般来说,路由器对物理机的IP是DHCP动态分配的,也可以设置为静态IP

安装完VM之后会自己配置虚拟网卡(可在网络连接上查看网卡),上网方式有 —— 桥接、NAT(VMnet8)、仅主机(VMnet1)、自定义

2、不同IP通信都要通过网关

桥接模式:将物理机的IP嫁接过来使用,但是经过网关的时候,会认为是两台机器,因为分配的IP是同在一个C段的不同IP

配置文件里面的UUID是唯一的网卡名称,onboot:开机是否启用

桥接配置静态IP:IP要在同一个C段,网关和子网掩码要和物理机一样

3、IP分为ABCD四类

内网的C类IP网段是192.168.xx.0(1是网关,255是广播地址,2~254是能用的),24位掩码(常为255.255.255.0),ping命令用于查看主机是否存活,配置IP的时候要使用ping不同的IP,如果通了说明局域网内有人使用这个IP,就不能使用这个IP了

4、校园网用不了桥接模式

因为对路由来说都是在同一个局域网里,需要再搞一个号作一个拨号认证,录入信息之后增加IP之后才能使用,物理机拨号了虚拟机也要拨号

5、NAT模式(使用VMnet8)关于虚拟机VMware内系统如何与物理机网络连接教程 - 知乎

NAT地址转换实现上网,需要配置一个虚拟路由:虚拟网络编辑器,管理员登录,点NAT模式

(如果在安装系统之前就要使用网络的话,可以使用DHCP服务自动分配网络地址,需配置IP段,子网和网关需在一个网段,配置的网关最后要在系统的网络配置文件里面也修改了)

NAT分DNAT(目标地址转换)和SNAT(源地址转换)—— 在虚拟机网卡上转换

NAT配置的IP访问同段主机(局域网互访)不需要网关,访问别的则需要经过网关,网关再转发给虚拟网卡,虚拟网卡完成地址转换(把数据包给物理机网卡,物理机网卡以自己名义发到公网)

【收发包过程】

发包是做源地址转换,接包是做目标地址转换

  • 发包:地址转换要在发给物理机网卡之前做好转换,不然物理机无法接收,也就是说,虚拟机网卡发给物理机网卡的时候,应该和物理机网卡处于同一网段,接收虚拟机数据包的时候应该是和虚拟机在同一网段
  • 收包:接收外网包的时候,则是在物理机的网卡上做转换,转换为和虚拟机一样的网段然后转发过去

(内网IP:192.168.xx.xx   公网:182.168.xx.xx)

路由用于作网络信息的传输枢纽,有路由没网卡上不了网,但有网卡没路由可以上网

内网里面会有一个边界路由,一个路由可以连多个网卡,路由也会在不同的IP段上跳转

(公网有路由和服务器)

内网的IP不会被路由,公网的地址会被路由,NAT地址转换在边界路由上做,其他路由只负责转发

IP传递经过的路由的路径称为路由表——私有地址不路由,就是说,在发上公网之前的路由路径不会被记录

内网上网:如果内外网在同一个网段的话,可以发包,但是不能收包,因为内网不路由,数据包找不到具体的路径到发包的IP,所以接收不到数据包——故上网需要在边界路由上NAT进行地址转换,经过其他路由的时候直接转发,源地址和目标地址都不改变,直到发到目标地址处

回包的时候公网路由直接转发,在边界路由上,进行目标地址转换,最后转给发包的IP地址

ip138 可以查询自己的出口地址,数据包进入公网使用的IP是出口IP,如果出口IP被封杀的话,整个局域网都不能访问它的资源——因为局域网最终进入公网的IP只有一个

网络——多台主机使用介质(同轴电缆、双绞线、无线、光纤等)连接起来形成网络

xshell也可用于执行cmd的命令

6、仅主机模式

只能主机和虚拟机通信,不能跨主机

虚拟机间单独通信——VMnat0

7、IP地址(ICANN分配)深入理解IP地址_Luke Ewin的博客-CSDN博客

主机位全0为网络地址,全为1是广播地址(向整个网域里面发放信息)

由三点四个段组成,一段8位,共32位,每段0~255

127.0.0.1:回环地址,用于本机数据的循环测试

  • A类地址网络标识:0,前1×7位是网络地址,IP到2^7=128.0.0.0
  • B类地址网络标识:10,前2×7位是网络地址,IP到2^7+2^6=192.0.0.0
  • C类地址网络标识:110,前3×7位是网络地址,IP到2^7+2^6+2^5=224.0.0.0
【主机数计算】

n 表示子网掩码中网络号的长度(1~32),通过 n 的个数确定子网的主机数 = 2^(32-n)-2(去掉全0标志地址和全1的广播地址的2个地址)

各类IP的网络数和主机数
网络号数每个网络号的主机数
A类2^7−2=1262^24−2=16777214
B类2^14−1=163832^16−2=65534
C类2^21−1=20971512^8−2=254

5、计算机通信原理

早期计算机通信使用的是MAC地址,是写入到网卡上的物理地址,每台主机加入到局域网内,就要发一个广播包,然后所有机器都会收到新加入的主机的MAC地址(数据包流向的具体机器)

为了避免广播风暴(通信的时候回广播询问目标的MAC地址,如果运行的程序过多,或者局域网内的主机太多的话,就会有大量的广播信息在局域网里面传输,正常的命令信息无法传播和执行,最终导致局域网瘫痪),且早期使用的同轴电缆的传输速度并不快,加入主机太多的话,传输的信息就会被广播包淹没,早期数据包由MAC、IP、PORT组成

MAC地址

硬件地址或物理地址,是唯一标识网络设备的地址,烧录在网卡的EPROM中,不可更改

数据传输中的MAC地址:

  1. 初始发包
    • 当一台主机(如PC)需要向另一台主机发送数据时,首先会封装数据包。在数据链路层,数据包需要包含源MAC地址(发送主机的MAC地址)和目标MAC地址。然而,在大多数情况下,源主机只知道目标主机的IP地址,而不知道其MAC地址
    • 此时,源主机会发送一个ARP(地址解析协议)请求,询问局域网内所有设备:“谁知道XXX.XXX.XXX.XXX(目标IP地址)的MAC地址是什么?”这个ARP请求是以广播形式发送的,局域网内的所有设备都会收到,但只有知道目标IP地址对应MAC地址的设备(通常是路由器或目标主机本身)会回复
  2. ARP响应与数据包发送
    • 当路由器或目标主机收到ARP请求后,会回复一个包含目标MAC地址的ARP响应给源主机
    • 源主机收到ARP响应后,将目标MAC地址添加到数据包中,并通过局域网发送给路由器(如果目标主机不在同一局域网内)
  3. 路由器转发
    • 路由器接收到数据包后,会根据路由表决定下一跳的目的地。此时,路由器会再次使用ARP协议(如果需要的话)来解析下一跳设备的MAC地址
    • 路由器将源MAC地址更改为自己的MAC地址,将目标MAC地址更改为下一跳设备的MAC地址,然后将数据包转发出去
  4. 数据包在网络中的传输
    • 数据包在网络中经过多个路由器转发时,每次转发都会重复上述过程:路由器会更改数据包的源MAC地址为自己的MAC地址,查询并设置新的目标MAC地址(下一跳设备的MAC地址),然后将数据包继续转发
    • 最终,当数据包到达目标主机所在的局域网时,目标主机将直接接收并处理这个数据包

在数据传输过程中,MAC地址确实用于指示“下一步到哪儿去”。通过ARP协议和路由器转发机制,数据包能够在网络中准确地找到目标主机并成功传输。每个路由器在转发数据包时都会更改源MAC地址和目标MAC地址以确保数据包能够正确地到达下一跳设备

由于路由不转发广播包,所以隔绝了内外网,广播信息就只会在局域网里面传播

通信的话就要知道MAC、IP、PORT,但是由于广播包是不能路由的,所以不会知道目标的MAC地址,此时出现了ARP协议——用于根据IP获取MAC地址,要通信的话,就会广播问目标的MAC地址,此时只有目标IP正确的话,才能收到这条广播并回复

【判断两IP是否在同一网段】

主机在通信时判断源IP和目标IP是否在同一个子网或网段

只需将ip地址与子网掩码先转化为二进制

然后做与运算:如果得出的结果一样,则这两个ip地址是同一个子网或网段中

IP和子网掩码相与就会得到它是哪个网段——实质上在C类IP就是IP第三段

MAC地址用于写下一跳,也就是说,下一步到哪儿去

传输的时候,先问路由的MAC,局域网的所有主机都可以收到,但只有路由可以回复,发包的时候,首先写的MAC就是路由的MAC,然后路由接受到数据包之后,查看是否有目标的MAC地址,没有的话发广播问目标的MAC地址是多少,然后源MAC变为路由的,目标MAC变为下一个路由的MAC,数据包经过每一个路由都会改变源MAC和目标MAC,最后由目标端口扫描接收

主机间的通信是进程间的通信,通信要使用端口(本质上就是进程的端口),但ARP很容易被欺骗攻击(只能局域网内使用)

为了方便通信,通常广播之后找到的MAC地址都会被缓存表收纳,下次使用的时候就会直接使用

ARP是个传闻协议,不会核实信息的真假,控制网域的一台主机,可以伪造成路由,然后欺骗主机,主机就会修改MAC的缓存表,然后所有的发送的内容都会被伪造路由截获然后修改

ARP欺骗原理及实现_Naive`的博客-CSDN博客

中间人攻击(流量劫持)

proc文件夹是内核映射过来的文件夹,用于修改内核的工作方式,kali在使用 dsniff 软件包的 arpspoof -t 192.xxx.xxx.xxx -r 192.xxx.xxx.1 -r 表示伪造成该网段的路由,然后主机就会修改它的MAC缓存表,将信息发给该伪造路由之后,如果要维持通信(测试的话,可以简单的ping一下)的话,要在根目录 echo 1 > /proc/sys/net/ipv4/ip_forward ,在该文件写1,就会开启转发,转发——实现主机不断网,但可劫持流量(echo:回显,使用的应当是单引号)

ls  / : 列出根下的文件,proc、sys是内核映射过来的文件,关机就会消失

七层参考模型

(现在用的是四层模型)—— 说明了计算机通信的原理

协议:规定了程序用于实现什么协议,如 http 就是用于搭建网站的协议在Centos7中搭建http服务器_centos搭建http代理_小蝈蝈丶的博客-CSDN博客

linux系统history可以查看使用过的命令,使用 ! 命令号,就可以快速执行该命令

OSI七层模型 (详细讲解,看这一篇就够了)_itpeilibo的博客-CSDN博客

  • 物理层:网线,同轴电缆等介质
  • 链路层:提供介质访问和链路管理,也就是MAC地址所在层,MAC用于访问介质,所以要走网线等介质出去
  • 网络层:用于进行IP选址和路由选择,能不能跨网段——能不能路由
  • 传输层:用于建立,管理和维护端到端的连接,有UDP(不可靠连接)和TCP(较可靠)协议
  • 会话层:建立和维护会话
  • 表示层:数据的加密解密和格式转化
  • 应用层就是各种应用程序,或者说是各种协议

协议就是规定程序基于什么实现的东西,如http就可由Apache、nginx、tomcat、IIS协议(可以用于搭建网站)实现 

启动端口

安装http:yum -y install httpd

启动80端口:  lsof -i :80(查看哪些进程在使用80端口)

                        systemctl  start httpd(开放80端口,大多数情况下由管理员执行此命令)

会话层协议TCP、UDP:TCP有三次握手,在线才会发送;UDP则是随便发,能接到就接到,接不到就算了

传输模型

应用层发起会话,表示层进行加密或者格式转化,然后会话层向系统申请一个会话,传输层打开一个传输的链接,网络层用于给数据包加报文头,数据链路层加 数据+TCP报文(有源端口和目标端口)+IP报文+MAC地址(在同一网段就直接发,不在就根据配置的路由到公网),物理层(路由根据TCP报文建立连接,确定在线之后建立TCP连接之后再发送http的报文,过去之后一层层解析):

  • 应用层:这是用户直接与之交互的层面,如HTTP、FTP等协议都在这一层。应用层负责发起会话,例如,当您在浏览器中输入网址并按下回车键时,应用层就会发起一个HTTP会话

  • 表示层:这一层负责数据的格式化和加密。例如,如果应用层发送的是文本数据,表示层可能会将其转换为二进制格式,或者对数据进行加密处理

  • 会话层:会话层负责建立、管理和终止会话。例如,当应用层发起一个HTTP会话时,会话层会负责向系统申请一个会话ID,以便跟踪和管理这个会话

  • 传输层:传输层负责数据的可靠传输。例如,TCP协议就在这一层,它会确保数据被正确地分割、传输和重组。当会话层请求建立一个会话时,传输层会打开一个传输链接

  • 网络层:网络层负责数据的路由和转发。例如,IP协议就在这一层。当传输层发送数据时,网络层会给数据包加上一个IP报文头,以便路由器知道如何转发这个数据包

  • 数据链路层:数据链路层负责在同一网络内的节点之间传输数据。例如,以太网协议就在这一层。当网络层发送一个数据包时,数据链路层会给它加上一个以太网帧头,这个帧头包含了源MAC地址和目标MAC地址

  • 物理层:物理层负责实际的物理传输,如电缆、光纤或无线电波等。例如,当数据链路层发送一个以太网帧时,物理层会将其转换为电信号或光信号,并通过物理介质发送出去

三次握手之后,接受到的包由端口(进程)进行处理,因为主机不理解http协议,也就是说,应用层发出的包,应该到目标的应用层解析之后才能被理解

七层防火墙——通常指的就是应用层的防火墙

发送的源端口一般是随机的,但接受端口一般是80端口(web服务端口)

IP属于点到点通信,端口是进程到进程的通信

  • arping属于二层命令,只能在内网ping,不能路由;
  • ping命令则是三层命令,可以ping通外网,但看不了端口,因为ping在三层,端口是在第四层
  • nmap就是四层命令,可以路由,可以得到协议,也可以得到MAC地址

Linux Nmap命令解析(Nmap指令)(功能:主机发现、ping扫描、arp扫描、端口扫描、服务版本检测、操作系统识别等)_nmap linux版本-CSDN博客

三层容易被禁IP,二层只能局域网

SSL协议处于第六层和第七层之间,使得应用层和表示层都能够使用,最早由网景公司研发

 【套接字】

https://wwwblogs/Auion-idiot/p/16784977.html

套接字是网络环境中进程间通信的API(应用程序编程接口),也是可以被命名和寻址的通信端点,还是由IP地址和端口号结合以提供向应用层进程传送数据包的机制

最常见的三种是流式套接字(SOCK_STREAM)、数据报套接字(SOCK_DGRAM)和原始套接字(SOCK_RAW):

1. 流式套接字(SOCK_STREAM)

例子:TCP连接

流式套接字基于TCP(传输控制协议)实现,提供双向、有序、可靠的数据传输服务。当使用流式套接字进行通信时,数据会像流一样被发送和接收,保证了数据的完整性和顺序性。TCP连接是流式套接字的一个典型应用,例如,当我们在浏览器中访问一个网页时,浏览器和服务器之间就是通过TCP连接进行数据传输的

特点

  • 面向连接:通信双方必须先建立连接,然后才能进行数据传输
  • 有序性:发送的数据按照顺序到达接收方
  • 可靠性:TCP协议通过确认机制、重传机制等保证数据的可靠传输

2. 数据报套接字(SOCK_DGRAM)

例子:UDP通信

数据报套接字基于UDP(用户数据报协议)实现,提供无连接的数据传输服务。与流式套接字不同,数据报套接字不保证数据的顺序性、可靠性和无重复性,但它具有较小的开销和较高的传输效率。UDP通信是数据报套接字的一个典型应用,常用于实时性要求较高但不要求数据绝对可靠传输的场景,如视频直播、在线游戏等

特点

  • 无连接:通信双方不需要建立连接,直接发送数据报
  • 无序性:发送的数据报可能不按顺序到达接收方
  • 不可靠性:UDP协议不保证数据的可靠传输,可能出现数据丢失、重复或乱序的情况

3. 原始套接字(SOCK_RAW)

例子:新网络协议测试

原始套接字允许程序开发人员对底层的网络传输机制进行控制,直接访问IP层或更低层次的协议。原始套接字通常用于新的网络协议的实现和测试,因为它可以接收和发送包含IP头的原始数据包。然而,由于原始套接字可以绕过操作系统的网络协议栈直接发送和接收数据包,因此它也可能被用于网络攻击等恶意行为

特点

  • 直接访问底层协议:原始套接字允许直接访问IP层或更低层次的协议
  • 灵活性高:可以用于实现和测试新的网络协议
  • 风险性:由于可以绕过操作系统的网络协议栈,因此可能存在安全风险

彻底弄懂套接字-CSDN博客

服务端:

  1. ​ 初始化socket对象
  2. ​ socket对象与服务端的IP和端口绑定(bind)
  3. ​ 对端口进行监听(listen)

客户端:

  1. ​ 初始化socket对象
  2. ​ 连接服务器(connect)
  3. ​ 如果连接成功,客户端与服务端的连接就建立了

连接成功后:

  1. ​ 客户端发送数据请求
  2. ​ 服务端接收请求并处理请求
  3. ​ 讲回应数据发送给客户端,客户端读取数据
  4. ​ 关闭连接,一次交互结束

socket套接字-CSDN博客

hash值——文件使用MD5特征加密之后就是哈希值

以下内容以Linux系统的centos为例讲解


一、Linux系统基础

linux系统里面一切皆文件,一切文件都必须从根目录开始访问才能访问到

ls .        当前目录         ls . .        上级目录


安装使用Nano编辑器

CentOS:执行yum -y install nano

Debian/Ubuntu/LinuxMint:执行apt-get install -y nano

Linux如何使用Nano编辑器-CSDN博客

1、系统内核

程序运行起来形成的进程对硬件资源是独享的,为了实现多个程序在底层的硬件资源的运行,出现了通用管理软件——内核

内核用于进程管理、网络管理、文件系统管理、驱动程序管理、网络管理等,内核只是一个平台,不会提供任何服务,只负责系统调度,由于系统调用过于底层,使用系统调用开发程序非常麻烦,因此出现了库

2、库文件

库是把底层的资源整合封装为功能再向计算机提供

库是可执行的程序,但它没有执行入口,不能单独执行,所以必须要有上层程序调用它才能执行,此时程序的入口就是库的入口,有些程序也有库,于是用第三方程序也能调用此程序

库分为动态库和静态库(程序也是),动态库是把库的位置关联到程序里面,在程序安装编译的时候就要去找这个库,库名错了就会报错,运行程序的时候就会一起把这个库加载到内存里面

静态库是把库整个复制一份嵌入到程序里面,成为了程序的一部分,双击打开就可以直接使用

动态库&静态库
  • 静态库不能共享,动态库可以共享,所以动态库也被称为共享对象(linux的动态共享库 .so:shared object;windows的动态共享库  .dll:dynamic Link library)
  • 程序使用动态库链接的是该库的入口,静态库则是使用的时候就copy一份,第二次再copy……

以C语言为例,动态库就是标准库,静态库就是用户自定义的库——动态库引用即可,静态库要定义具体的内容

3、shell及启动

shell脚本

#!/bin/bash —— 确定执行入口(内核)

回到家目录命令 —— cd ~/

本质上shell是个程序,是在操作系统最顶层的程序,用于为使用者提供操作界面(相当于一个命令解析器),shell本身是个命令接口,当用户输入命令的时候,shell能够收到用户的命令并对命令进行处理(由shell送到内核),处理完毕之后将处理结果返回给用户(通常也返回到shell),如输出到显示器或者写入到文件

shell分GUI接口(图形结构)、CLI(命令行)接口

在linux里面shell使用的是x-windows、cs(客户端-服务器)架构,其中windows是图形协议

1、图形界面的类型有:

  • Gnome:使用C开发
  • KDE:使用C++开发
  • XFace:比较适合使用在嵌入式平台上的轻量型桌面

2、命令界面类型

  • bash:使用最广泛,功能也是最强大的、开源的shell,是绝大部分linux默认的
  • sh、shell、csh、zsh、ksh、tcsh

在终端输入的命令最终都由bash执行,bash本身也是一个可执行的程序,所以bash也存放在专门存放可执行程序的bash里面

查看安装的shell —— echo $SHELL

列出所有安装的shell —— cat /etc/shells,每安装一个就会多一个

更换shell —— 一般shell会关联用户,也就是说用户登录到界面的时候,会打开特定的shell:vim /etc/passwd,会显示各个用户登录的时候对应打开的shell的类型

同时它又是一种程序设计语言 —— 作为命令语言,它交互式解释和执行用户输入的命令或者自动地解释和执行预先设定好的一连串的命令;作为程序设计语言,它定义了各种变量和参数,并提供了许多在高级语言中才具有的控制结构,包括循环和分支

shell启动

shell本身也是一个可执行的程序,在用户登录成功验证密码的时候才加载shell

多用户登录的时候会开启多个进程,但是只有一个shell(程序只会打开一个,但有多个进程界面)

主机看来计算机上只会有程序和进程,执行多个任务的时候,通用管理程序都会打开虚拟内存

虚拟内存只有执行的程序和内核在,没有其他的程序(进程也可以理解为是程序的副本,是程序copy到内存执行的)

所以内核不会意识到其他的进程,不会数据共享

所以多任务操作系统要解决的就是——内存中多个进程运行的时候,数据不会被颠覆,因为多个进程同时使用同一块内存的时候就会发生内存的颠覆问题,所以就有了虚拟内存,此时只会有内核和要运行的程序,虚拟内存通过内核映射到不同的真实物理内存的,所以就不会互相干扰

虚拟内存的存储单元称为页面,物理内存的存储单元称为页框,对应关系由内核管理的

bash的生命周期是用户登录到用户退出的这段时间

bash支持不同用户登陆到系统

不同用户的工作环境可以设定为不同的,通常来说,除了管理员,其他用户的工作环境都是一样的,bash支持用户自定义自己的工作环境

父shell和子shell

shell提供了用户输入命令的接口,但通过这个接口,又可以再打开一个shell,后面这个shell就是一个子shell

可以通过在命令行输入pstree查看所有进程之间的父子关系,也就是说,如果多次打开bash,那么每一个后面的shell都是前一个的子shell,每一个exit都可以退出一个shell,直到退出终端界面

从进程角度看:bash之间不会都意识到这种父子关系,每个shell都是独立于其他shell的

4、bash及其特性

本质上是个shell(外壳,计算机的最顶层,能够实现用户与计算机的交互,也可以说是一种接口)

人机交互接口
  • GUI接口(图形界面的shell,linux使用的协议是x-window,具体有Gnome、KDE、XFace:适合嵌入式平台的轻量级桌面,kali使用的就是这个——风格不同)centos的Gnome有四个工作区,可随意切换,其余的GUI接口可能也有这些工作区,不过布局会不一样,风格不一样:kali的XFace的工作区就在上面
  • CLI接口:命令行接口的shell
bash的特性
  • 支持历史命令,用户当前执行过的命令,可以通过上下键翻找之前执行过的命令
  • 支持tab补全命令,只按一次tab如果没反应的话,可以连着按两次,(按一下就出来:说明只匹配到了一个命令)就会查找补全之后的命令的可能的命令,然后问你是否查看,按yes即可列出所有的可能的命令,一屏没列完的话,回车再列一行,空格多列一屏
  • 支持tab补全路径,可以敲出首字母按tab键补全,如果要查看当前路径下的所有目录可以连续按两下tab,就可以查看目录下的文件

如果要补全命令的话,按完tab查看之后要重新输入之前的内容,如果要查看补全路径的话还可以接着往下写

# 管道符

有些命令不能直接处理一些数据,就可以通过管道让它执行。管道的本质是对上一个命令的不完全的处理结果进行二次加工

①、history命令

bash退出终端的时候,执行过的所有命令会以隐藏文件的方式保存到当前用户所在的家目录当中,文件名一般为 .bash_history ,再次登录的时候就会从家目录读取该文件,并加载到缓存区里面

history(默认记录1000条 echo $HISTSIZE 可查看,从头开始顺序删除之前执行过的命令)

history可以查看所有的历史命令,-c 的话就可以清空所有的历史执行命令,单独删除某命令的话,可以使用history -d 行号,删除某行的命令,该行的命令就会变成 history -d 行号

history -w 就是将当前执行过的所有的历史命令保存到一个隐藏文件 .history (.带点的文件就是隐藏文件)ls -a 可以查看所有的隐藏文件

eg:历史命令会存储一些更改密码的命令,可以-c全清,或使用rm -rf 直接删除.history文件,也可以通过-d删除之前执行过的某一个命令

env命令可以查看环境当中的所有变量,tab也可以补全创建过的变量

 # 技巧

  • ! [ history里面命令的行号 ]     可以执行对应的命令
  • ! [ - history里面命令的行号 ]   可以执行倒数第几行的命令,中间无空格
  • !!   表示执行上一条命令
  • ! $ 表示调用上一条的命令的最后一个参数,也可以使用 cd 切换到上一个参数所在目录下面
  • cd [space] 按一下esc键,按一下 . 也能调出来上一条命令的最后一个参数
  • !xxxx  匹配最近的一条以xxxx开头的命令,并执行
②、alias命令(别名)

alias可以查看原本有的命令的别名,可以方便使用,设置的话alias  a=abcdefg

设置完成之后,也可以使用alias查看设置好的别名,执行的话,执行a就相当于abcdef

但只是在进程里面临时修改,永久修改的话要去修改文件

  • 全局定义:修改 /etc/bashrc,在文件中加入alias  a=abcdefg即可,然后 source /etc/bashrc 重新启动,此处的修改针对所有的用户,只要登录就可以使用该别名
  • 个人定义: 修改 ~/.bashrc ,在文件中加入 alias  a=abcdefg即可,然后使用source /etc/bashrc 重新启动,只是在当前用户下有效

上线提醒:可以写一些提醒用户登录的命令文件到alias文件下面,因为这个文件是用户登录之后就会加载的一个文件,写到该文件下,用户一登录就可以按照文件收到提醒

③、取消别名:unalias

不使用别名

        ①使用绝对路径:/bin/ls ,直接敲的话是用的就是别名;

        ②或者使用反斜杠 \转义之后也可以不使用别名,如 \ ls,和直接敲绝对命令或者使用别名执行 ls 一样

只敲别名能执行是因为系统会在path路径下挨个找有没有这个命令,使用 echo $PATH 可以查看路径下的环境变量,都找不到的就会显示未找到命令,找到之后就不再找了,直接执行找到的命令

查找命令的绝对路径

可以使用which可以查找命令的具体路径,如 which ls就会显示它有别名,以及它的具体的路径是什么

6、元数据

在Linux的文件系统中,元数据(metadata)是用来描述一个文件的特征的系统数据。这些数据主要包括文件的类型、大小、所有者、权限、时间戳、硬链接数、数据块分配情况等

元数据对于文件系统的正常运行至关重要,因为它们帮助系统识别和管理文件

Linux的文件系统中的元数据主要由以下几个关键部分组成:

  1. inode(索引节点):每个文件或目录都有一个唯一的inode号码来标识它。inode存储了文件的类型、所有者、权限、时间戳、数据块分配情况等信息。通过inode,文件系统可以快速地查找和访问文件的相关信息,而不必遍历整个文件系统。
  2. dentry(目录项):用于在目录中查找文件和子目录的元数据结构。它将目录名和inode号码关联起来,当文件系统访问目录时,会将目录中每个文件和子目录的名字以及它们对应的inode号码读入内存中的dentry缓存中,以提高文件系统的访问效率。
  3. superblock(超级块):存储了文件系统的整体信息,如文件系统的类型、大小、状态、魔数等。

元数据的管理方式可以分为集中式和分布式两种:

  • 大多数集群文件系统都采用集中式的元数据管理,因为实现简单,一致性维护容易,但集中式管理存在单一失效点问题,若该服务器失效,整个系统将无法正常工作
  • 分布式元数据管理的好处是解决了集中式管理的单一失效点问题,而且性能不会随着操作频繁而出现瓶颈。但其实现复杂,一致性维护复杂,对性能有一定影响

此外,日志文件系统(journaling file systems)可以保护元数据免受系统崩溃时的数据不一致问题。对文件系统元数据的更改都被保存在一份单独的日志里,当发生系统崩溃时可以根据日志正确地恢复数据

7、Linux系统文件类型

Linux系统中的文件类型多种多样,常见的有以下几种

  1. 普通文件:这是最常见的文件类型,包括我们编写的文本文件、程序文件、可执行文件等。普通文件又可以分为文本文件和二进制文件。文本文件通常由ASCII字符构成,如报告、脚本命令文本文件等。二进制文件则是系统可以识别和执行的文件,如可执行程序文件
  2. 目录文件:目录文件是一种特殊的文件,它包含了其他文件的名字以及指向与这些文件有关的信息。目录文件的内容就是目录中的文件名和子目录,目录文件是内核组织文件系统的基本节点
  3. 设备文件:设备文件是与系统外设以及存储等相关的一些文件,通常都在/dev目录下。设备文件提供了对设备(如磁盘)的访问。设备文件没有大小 设备文件又可以分为字符设备文件和块设备文件。字符设备文件提供了对设备不带缓冲区的访问,每次访问长度可变。块设备文件提供对设备(如磁盘)带缓冲的访问,每次访问以固定的长度单位进行
  4. 链接文件:链接文件是一种特殊的文件,它实际上是指向一个真实存在的文件链接,类似于Windows下的快捷方式。链接文件又可以分为硬链接文件和符号链接文件(也称为软链接)。硬链接文件和原始文件指向同一个索引节点,而软链接文件则包含指向另一个文件或目录的路径信息
  5. 管道文件:管道文件主要用于不同进程间的信息传递。当两个进程需要进行数据或信息传递时,可以使用管道文件。一个进程将需要传递的数据或信息写入管道的一端,另一进程则从管道的另一端取得所需的数据或信息

d:driectory        b:block        c:character        l:link        p:pipe        s:socket

块设备文件、字符设备文件

套接字文件:linux通信

linux套接字-CSDN博客

套接字是一种进程间通信的机制,不同于传统的进程间通信方式(如管道、信号、消息队列等),它可以在不同的主机之间进行进程通信,包括本地主机和远程主机。在Linux系统中,套接字被看作是一种特殊的文件,通常位于/tmp或/usr/tmp目录下。每个套接字文件都有一个唯一的名称,其他进程可以通过这个名称来访问、连接和进行数据通信。套接字文件的存在使得进程间通信变得更加灵活和方便

套接字可以分为多种类型,包括流式套接字(SOCK_STREAM)、数据报套接字(SOCK_DGRAM)等。流式套接字提供可靠的、面向连接的通信服务,类似于TCP协议;而数据报套接字则提供无连接的、不可靠的通信服务,类似于UDP协议

在Linux系统中,套接字编程是实现进程间通信的主要方式之一。许多常见的网络服务,如WWW服务、FTP服务、TELNET服务等,都是基于套接字编程来实现的。通过使用套接字接口,开发者可以轻松地实现不同进程之间的数据交换和通信

目录和文件夹的区别
  • 目录是一种特殊的文件,称为目录文件,它包含了文件系统中其他文件和目录的引用或指针。目录的主要作用是保存文件系统的结构,它类似于一个索引,目录并不直接包含文件的内容,而是包含了文件的元数据(如文件名、大小、创建日期等)以及文件在存储介质上的位置信息
  • 文件夹则是一个更具体的概念,通常用于图形用户界面(GUI)中。文件夹可以被视为一个容器,用于组织和存储文件和子文件夹。在GUI中,文件夹通常以图标的形式呈现,用户可以通过点击文件夹来访问其中的文件和子文件夹。文件夹提供了一种直观的方式来组织和浏览文件系统

在很多情况下,目录和文件夹可以互换使用。在Linux和UNIX等操作系统中,目录是文件系统的基本组成部分,而文件夹则更多地被视为图形用户界面中的概念。然而,在一些其他的操作系统和文件系统中,文件夹可能被实现为特殊类型的目录,或者目录和文件夹可能被完全融合为一个统一的概念

目录读写须先有执行权限

执行权限(x)对于目录而言,意味着用户可以进入目录,即遍历或搜索目录。具体来说,拥有执行权限的用户可以使用cd命令将工作目录改为该目录

因此,对目录的读写操作确实需要先拥有执行权限。只有拥有执行权限,用户才能进入目录,进而进行读取或写入操作。如果只有读或写权限而没有执行权限,用户将无法进入目录,也就无法读取或写入其中的文件

8、常见的目录文件

/etc :目录是配置文件目录,系统上大多数的服务程序的配置文件都放在这个目录下面

/home :用户家目录,每一个用户的家目录通常默认为/home/username  ,用户目录不能与其他的用户同名,username对应相对的用户名称

/root :root管理员用户的家目录,管理员的家目录直接在root,不是在home目录

/lib :库文件和内核模块文件,库文件分为两种:静态库和动态库

        /lib/modules:内核模块文件

静态库是 .a 结尾的,动态库是 .so 结尾的,windows系统的动态库是 .dll 结尾的

  • /lost+found:此文件不是目录,但是每个新建的分区都会有,用于存储文件系统在机器突然断电时未及时保存的文件,再次上电之后可以在此文件夹里面找回
  • /media:挂载点目录,常用于挂载移动设备
  • /mnt:挂载点目录,常用于挂载额外的文件系统
  • /misc:杂项,默认目录为空
  • /opt:可选目录,早期是用于安装第三方软件,kali的第三方软件的安装目录就是这个, centos等目前并不安装到此目录
  • /proc:伪文件系统,基于内存,用于存储内核及进程相关信息,该目录原本是为空的,单系统启动了以后,该目录并不为空,用于存储内核映射文件,大多数的文件都是内核可调参数,和内核工作的统计数据,要想改变操作系统的根本工作属性,可以通过更改该目录下的文件实现

在Linux系统中,伪文件系统(pseudo-filesystems)并不是实际存储数据的设备,而是为内核和用户空间程序提供特定接口的文件系统。它们通常用于访问内核的数据结构、进程间通信、配置信息等

ls /proc 可以查看内存当中正在运行的所有的进程,内容包括:进程号、环境变量及进程的状态信息等

 /tmp:临时存储目录,到一定时间会自动删除,所有用户都能在此目录下面创建文件,但是只有创建的用户才能删除这个文件,使用crontab创建一个计划任务

Linux中Crontab(定时任务)命令详解及使用教程_linux crontab-CSDN博客

自动创建的文件是使用vim创建编辑的:格式是前五个星号是时间的设定,分别是分钟、小时、日期、月份和星期,如下所示就是每分钟执行一次,写 "hello world" 到opt的hello.txt文件里面

*/1    *    *    *    *    /bin/bash "hello world">>/opt/hello.txt

 /var 目录:

Linux的/var目录是一个非常重要的系统目录,用于存储系统运行时产生的各种可变数据,包括日志文件、缓存文件、锁文件、进程ID等。这个目录通常会被挂载在单独的分区上,以避免磁盘空间不足或故障的影响

/var目录下包含许多子目录,每个子目录都有其特定的用途。以下是一些常见的子目录及其说明:

  1. /var/lib:系统正常运行时需要改变的文件通常保存在这里。例如,数据库(如MySQL)的运行和存储文件就放在这个目录下
  2. /var/local:保存安装的程序的可变数据,通常是系统管理员安装的程序
  3. /var/lock保存锁定文件。许多程序在使用这个目录中的锁定文件后,会表明它们正在使用某个特定的设备或文件,其他程序在注意到这个锁定文件后,将不会试图使用这个设备或文件
  4. /var/log保存各种程序的日志文件。这包括系统启动日志、应用程序日志、安全日志等。一些重要的用户登录日志和系统日志也保存在这里,例如/var/log/wtmp记录所有的登入和登出,/var/log/lastlog记录每个用户最后的登入信息,/var/log/btmp记录错误的登入尝试/var/log/httpd 记录访问日志access_log、错误日志error_log(清空日志文件:echo[空]-> /var/log/httpd/access_log)
  5. /var/run:保存系统正在运行时产生的各种临时文件,这些文件通常在下次系统引导前有效。它通常是一个指向/run目录的链接
  6. /var/cache:存储应用程序的缓存数据
  7. /var/spool:存储应用程序中的spool数据
  8. /var/tmp:存储系统重启时留存的临时数据
  9. /var/opt:存储opt目录里面的变化的数据

此外,/var/cache目录用于存储各种应用程序的缓存文件,例如包管理器的软件包缓存、DNS服务器的域名解析缓存等

总之,/var目录是Linux系统中一个非常重要的目录,它保存了系统运行时产生的各种可变数据,对于系统的正常运行和故障诊断都非常重要

/bin:存放二进制的可执行文件,通常存放用户命令

linux的可执行文件格式是 .elf 文件,windows的可执行文件的格式是 .exe 文件

/sbin:存放可执行命令,通常存放管理命令

/usr:存放只读文件

/usr/local:用于安装第三方软件

linux中软链接和硬链接的区别

存储方式

  • 硬链接:硬链接是文件系统中的一个索引节点(inode)的多个引用。当创建一个硬链接时,实际上是创建了一个新的目录项,它指向与原始文件相同的inode。因此,硬链接并不占用额外的磁盘空间,因为它们是对同一数据的引用
  • 软链接:软链接是一个特殊的文件,它包含了对另一个文件或目录的路径的引用。这个路径可以是绝对路径或相对路径。当您访问软链接时,实际上是在访问其指向的文件或目录。因此,软链接确实会 磁盘空间,因为它存储了路径信息

Unix/Linux系统中的inode总结 - 知乎

跨文件系统

  • 硬链接:硬链接仅限于同一文件系统内。因为硬链接是通过inode引用的,而不同文件系统可能具有不同的inode编号和分配方式
  • 软链接:软链接可以跨文件系统。因为它们只是存储了一个路径,所以不受限于特定的文件系统

链接不存在的文件

  • 硬链接:硬链接不能链接到一个不存在的文件。当您尝试创建一个指向不存在的文件的硬链接时,系统会显示错误。
  • 软链接:软链接可以指向一个不存在的文件或目录。当您尝试访问这样的软链接时,系统会显示一个错误,说明链接的目标不存在

链接目录

  • 硬链接:硬链接不能用于目录。在Linux中,目录是一个特殊的文件,它包含了对其他文件和目录的引用。由于硬链接是对inode的直接引用,而目录的inode包含了许多其他文件和目录的引用,因此不能简单地为目录创建一个硬链接。
  • 软链接:软链接可以用于目录。您可以创建一个指向目录的软链接,并像访问普通目录一样使用它。

总之,硬链接和软链接都是Linux中强大的工具,但它们在使用和限制上有一些重要的区别。

这些文件类型在Linux系统中扮演着不同的角色,使得Linux系统能够灵活地管理和访问各种不同类型的文件,需要注意的是,Linux系统中一切皆文件,包括设备、目录等都被视为文件进行处理

二、Linux命令

  • sh:早期的shell,后面称为bsh
  • bash:使用最广泛的、功能最强大的、开源的shell,是大多 linux 使用的shell,是sh的增强版
  • csh:近似C语言,支持编程

查看命令行类型 —— echo  $SHELL,不同的命令行的类型功能强大区分不同

 1、命令的组成

Kali忘记root密码怎么办_林中静月下仙的博客-CSDN博客

命令执行要在shell里面指出一个可执行的文件路径,ls 和 /bin/ls 的效果相同,因为此时有环境变量,可使用 echo $PATH 查看环境变量(开机自动加载),在linux下执行程序必须要制定一个绝对路径,否则会找不到,在终端输入,shell会交给内核,如果没有绝对路径,内核找不到目标

没有绝对路径也能执行的原因——内核会挨个找每一个环境变量的下面有没有目标文件夹,找到一个就不会再找了,然后就会加载这个文件或者程序

命令就是程序,命令执行前会判断,如果一个程序不可信的话,内核就会返回一个错误,此错误任然通过shell界面输出

命令格式

命令(command)选项(options)参数(arguments)—— 三者之间都有空格

有些命令执行不需要选项和参数,有些必须都要加才能执行

在命令提示符下输入的必须是个命令,或者可执行程序的路径,或者是脚本的路径和名字

命令又分为内置命令和第三方命令

  • 凡是在 echo $PATH里面看到的命令都属于第三方的命令,内置命令是shell本身的功能,是没有路径的(天生就有,删除所有的文件夹还是存在的——可使用which cd的命令来查看此命令是否是内置命令)—— 安装某一个可执行文件生成的命令就是第三方命令:man命令用于查看帮助信息(使用q退出查看界面)——可使用 man bash 查看内建命令;man ls就可以查看ls的选项和用途;type 可以查看命令归属和类型whatis:显示命令的简要描述

选项用于修改命令的执行的方式及特性,选项可以有多个,且有长短之分

  • 短选项用一个 - 即可(短选项通常为单个字母,多个短选项之间不需要空格,如果有空格会认为后面的那个是个参数或者目标,也可以一个选项一个 -
  • 长选项要用两个 -- 才可以(长选项必须一个选项一个 --

选项参数决定具体执行的数目,方式等——短选项的话可以直接跟在选项的后面(中间有空格),长选项的话要使用=来连接,如 --xxxx=12

  • 短选项赋值——tail -n 20 :后面可以直接跟参数
  • 长选项赋值——alias --color=auto :后面必须要跟 = 才可以

ping 192.168.98.7 -c 2 -w 4:ping该IP两次,四秒内没有回复就断开

ping 命令详解_ping命令-CSDN博客

参数是命令生效的对象,命令接受的参数的个数也是各不相同的,一个命令可以跟多个参数如:ls  /opt/  /root/ 就会分开列出两个文件夹的内容

 ①、linux命令的帮助

——凡是命令都有帮助

Linux Shell 内部命令与外部命令 - 知乎

  • 内部命令:bash自带的命令,没有路径,直接放在shell里面, 如help、if 等:在bash下找不到的就是内建命令bash内部命令 - 百度文库
  • 外部命令:安装软件之后带有的命令称为外部命令

内部命令只能 help echo、help cd 、help help 去看,外部命令可以使用 ls --help 或者 -h 去看

命令手册manual:以文档方式存放,使用方法:man ls,会列出目录内容,提要,格式,描述

man bash 查看bash的使用帮助可以查看内建命令和运算符,Q退出

linux的格式说明

[ ] 表示里面的内容可加可不加,[ ] 里面有管道符的话表示多选一

<>表示里面的内容必须加,如果不加就会报错

{ }表示分组

.. 表示可以出现多个

-a 表示会显示所有的文件,包括以点号开头的文件

②、命令级别

1:用户命令                    2:系统调用

3:库调用                        4:特殊文件

5: 配置文件格式            6:游戏        

7:杂项/其他                    8:管理命令

当不同的命令级别出现同名命令——用于对命令进行区分

  • man read,显示的是级别为1的用户命令read
  • man 2 read,就是查看系统调用的read
  • man 3 read ,库调用在的read

tty命令用于查看当前使用的虚拟终端第几个,man tty 可以查看命令的文件

ls  /dev 查看磁盘设备文件

info和man的功能也差不多,eg:info cd

whatis command :查看命令在哪个章节

创建文件 touch {1..9}.txt可以创建多个txt文件

 2、命令行通配

  • * :可以通配多个字符
  • ?:只能通配一个字符
  • ls [ acf ].txt [ ]表示命令展开,可以通配一些字符,如ls [ a-z 1-9 ].txt——通配所有的小写字母和数字的文件
  • touch {1..9}.txt:使用的是 { } 创建文件 1.txt …… 9.txt ,两位数也可以创建
  • 其他匹配(在通配符前面加上^表示匹配除了列出的字符之外的字符

【括号和花括号】

[ ] 用于匹配,也就是读操作;{ } 用于创建,也就是写操作

[ ] 内只能匹配一位,匹配多位要使用多个 [ ]

①、光标的快速跳转
  1. ctrl+A:跳转到命令的开头,ctrl+E:跳转到命令的结尾处
  2. ctrl+U:光标位置到行首的全部删除,ctrl+K:光标位置到行尾的全部删除
  3. 按照单词跳转:ctrl+左右箭头,向左右一次跳转一个单词,直至行首或者行尾
  4. 快速清屏:ctrl+L或者clear也可
  5. 字号放缩:ctrl 加 #,加+或者- 实现信号的放缩
  6. 快速打开另一个命令行窗口:ctrl + shift + T,快速删除终端窗口:ctrl + shift + D

打开命令行界面

②、切换用户
  • 全切换 su - root:工作目录,环境变量都会切换, su -l  root 也是全切换
  • 半切换 su root:工作目录和环境变量都使用当前用户的

③、修改密码——passwd

在命令行里面直接使用passwd命令可更改当前登录的用户的登录没密码

3、命令替换

命令替换有两种方式——反引号或者$在反引号里面和$里面的执行优先级更高

  • 直接用作打印函数的时候换行打印——seq 1 100,一个数一行
  • 使用echo `seq 1 100`(反引号),制表位连着打印所有的数(先执行seq生成1~100,然后给echo打印出来)
  • echo $(seq 1 100) 和上式的效果一样

反引号和$的作用

  • 反引号用于替换命令:先执行反引号里面的命令,然后把输出结果作为另一个命令的输入参数
  • $ 符号用于替换变量:将命令中带有 $ 的作为变量解释并替换

Linux--seq命令_linux seq-CSDN博客

4、ls命令

ls 命令是 Linux 系统中最常用的命令之一,它是 "list" 的缩写。这个命令用于列出目录中的文件和子目录。当不带任何参数时,ls 会显示当前目录下的文件和文件夹。ls 命令有很多选项和参数,可以根据需要进行调整以获取更多或更详细的信息。以下是一些常用的选项和参数:

  • -a:显示所有文件和目录,包括以点(.)开头的隐藏文件。
  • -l:以长格式显示文件和目录的详细信息,包括权限、所有者、组、大小、最后修改时间等。别名为 l l(可以使用which l l 来查看它的全名
  • -h:以人类可读的格式显示文件大小(例如 KB、MB、GB)。
  • -r:逆序显示文件和目录。
  • -R:递归显示目录及其子目录的内容。
  • -d:仅显示目录名称,而不显示目录下的内容。
  • -i:显示文件和目录的 inode 号。
  • -F:在可执行文件后面添加 *,在目录后面添加 /,在符号链接后面添加 @,以区分不同类型的文件。
  • -1:每行只显示一个文件或目录。

使用 ls -l 命令查看的是设备文件的话,是看不见大小的,可以看见的是设备文件对应的设备号

ls -l 命令显示被软连接的次数、文件大小

  • 在执行权限的后面,还会显示被软链接的次数,一般:目录文件被软链接的次数为2次
  • 在后面创建时间的前面还会显示文件的大小,使用ls -l 默认显示字节数,使用ls -lh 则会转化k或者M(取决于文件的大小到k还是到M)

5、type查看命令类型

在Linux系统中,type命令是一个内建于bash shell中的命令,用于显示指定命令的类型。当在Linux终端中输入一个命令时,系统会在特定的路径下搜索可执行文件。如果找到了,就会执行该命令。type命令可以告诉用户这个命令是内部命令还是外部命令

centos内部命令会回显是什么的内嵌,外部命令则会显示该命令的路径

命令的类型可以是以下几种:

  • alias:别名,用户或系统为常用命令定义的简化名称。
  • keyword:关键字,Shell保留字,不能作为命令或变量名使用。
  • function:函数,Shell函数,用户或系统定义的命令集合。
  • builtin:内建命令,Shell内建命令,直接由Shell解释执行的命令。
  • file:文件,磁盘文件,外部命令,可执行文件的路径。
  • unfound:没有找到,指定的命令不存在。

使用type命令的语法是type [参数] [命令],其中[参数]是可选的,用于控制命令的行为,[命令]是要查询的命令名称

例如,输入type ls会输出ls is aliased to 'ls --color=auto',表示ls命令是一个别名,实际执行的是ls --color=auto命令。而输入type cat会输出cat is /bin/cat,表示cat命令是一个外部命令,其可执行文件位于/bin目录下

需要注意的是,type命令只能用于bash shell中,其他shell可能不支持该命令。此外,type命令只能显示指定命令的类型,不能显示命令的具体功能或使用方法。如果需要了解命令的详细信息,可以使用man命令或查看命令的帮助文档

6、引用(需成对出现)

  • " " :弱引用,可以实现变量的替换,把变量名替换为变量的值
  • '  '  :强引用,不会替换变量,不会执行特殊意义的字符——单引号内容原样输出,双引号的内容会替换执行

7、添加和删除挂载点

在linux系统之中,一切皆文件,所以系统称为文件管理系统,linux的入口称为根目录,可以添加挂载点作为第二分区(类似于windows下的D、E盘)

在Linux系统中,添加和删除挂载点通常涉及以下几个步骤:

Ⅰ、添加挂载点:

1. 创建挂载点目录:首先,需要在文件系统中选择一个位置来创建新的挂载点。这通常是通过在所选目录下创建一个新目录来实现的。例如,可以使用以下命令在/mnt目录下创建一个名为my_mount_point的目录:

sudo mkdir /mnt/my_mount_point

这将创建一个新的空目录,用作后续挂载操作的挂载点。
2. 挂载文件系统:创建挂载点后,可以使用mount命令将文件系统挂载到该挂载点上。首先,需要知道要挂载的设备或分区的名称。例如,如果要将名为/dev/sdb1的分区挂载到刚创建的挂载点上,可以使用以下命令:

sudo mount /dev/sdb1 /mnt/my_mount_point

这将把/dev/sdb1分区挂载到/mnt/my_mount_point目录上。如果分区有特定的文件系统类型(如ext4、vfat等),您可能还需要使用-t选项指定文件系统类型
3. 验证挂载:挂载完成后,您可以使用df -h命令查看已挂载的文件系统列表,并确保您的文件系统已成功挂载到指定的挂载点上。

Ⅱ、删除挂载点:

在Linux中,删除挂载点实际上是指卸载已挂载的文件系统。这可以通过使用umount命令来实现。请注意,卸载文件系统之前,请确保没有进程正在使用该文件系统上的文件或目录

卸载已挂载的文件系统

sudo umount /mnt/my_mount_point

这将卸载位于/mnt/my_mount_point目录上的文件系统。如果卸载成功,可以使用df -h命令再次检查已挂载的文件系统列表,以确认文件系统已被成功卸载

请注意,在卸载文件系统之前,务必确保没有用户或进程正在访问该文件系统上的任何文件或目录,否则可能会遇到“device is busy”错误

如果遇到这种情况,可以使用fuserlsof命令查找正在使用该文件系统的进程,并先停止这些进程

常见的挂载点目录及其用途:

  1. /mnt:这是一个通用的挂载点目录,通常用于临时挂载文件系统,如CD-ROM、USB驱动器或其他外部设备。在/mnt目录下,可以创建子目录来挂载特定的设备或分区

  2. /media:这个目录通常用于挂载可移动媒体设备,如USB驱动器、相机存储卡等。与/mnt类似,可以在/media下创建子目录来挂载特定的设备

  3. /opt:这个目录通常用于存放第三方软件和应用程序。有些软件包可能需要在安装时挂载到/opt目录下

  4. /srv:这个目录用于存放服务器特定的数据,如Web服务器的内容、FTP服务器的文件等。根据服务器的类型和配置,可以在/srv下创建相应的子目录来挂载相关的文件系统

  5. /var:这个目录用于存放经常变动的文件,如日志文件、数据库文件、临时文件等。虽然/var不是专门用于挂载点,但某些情况下,特定的子目录(如/var/www用于Web服务器的内容)可能需要挂载额外的文件系统

  6. /usr/local:这个目录用于存放从源代码编译安装的程序。与/opt类似,有时可能需要将特定的文件系统挂载到/usr/local

选择挂载点目录时,通常要考虑文件系统的用途、访问权限和安全性等因素。例如,/mnt/media目录通常用于普通用户可访问的设备,而/srv/var目录可能需要特殊的权限配置

此外,还有一些其他的挂载点目录,如/proc(用于存储内核和进程信息,通常是自动挂载的)、/sys(用于导出内核对象,也是自动挂载的)等。这些目录通常不需要手动挂载,而是由系统自动处理

linux系统查看所有的挂载点

Linux必需的分区(磁盘:sd)

使用此命令后一般可以查看到以下三个目录挂载点

  1. boot(存放系统内核的分区,启动的时候第一时间就能找到,只放内核——200M)
  2. swap(交换分区,当内存不够的时候使用,不需要分区,是分配的一些空间,内存不够用的时候,拿出来一些不常用的放到此区间——8~16G)
  3. /(根分区)

环境变量在登录的时候加载,修改之后要重新登录——环境变量可以在文件永久修改或者临时修改使用一下

CPU在内存里面,操作系统放在硬盘,开机的时候就会在硬盘里面读取出来文件设置工作方式或者其他配置

修改内存(修改的是内存从硬盘里面copy过来的设置),修改磁盘(硬盘)的话要重新启动再启动(服务、或者系统)修改后的配置,如不同身份之后要使用的shell不同


三、文件管理命令

命令是个可执行程序的,内置命令(不同shell带的命令是不同的),存储命令(由于安装第三方库之后才能有的命令)centos7 由于有环境变量可以直接执行命令,shell会自动到路径里去找

一切文件都必须在根目录下去找,添加分区之后,也需要挂载到根目录下面才可以找到

实质上,就是放在根目录下的磁盘里面

【tree&pstree】

tree以树状结构查看目录下的所有内容(使用之前要使用yum安装)

pstree以树状结构查看进程,可以显示进程的父子关系

1、创建文件

默认,新创建的文件的权限为644(即rw-r--r--),而新创建的目录的权限为755(即rwxr-xr-x)

  • touch filename.txt :在命令行中创建一个文件
  • echo "Hello, world!" > filename.txt :使用echo创建一个带内容的文件
  • vi filename.txt :使用vi编辑器创建一个文件

创建一个使用当前的时间为名字的文件: "file-年-月-日-时-分-秒.txt"

(使用date可以查看当前的时间:2023年 12月 3 日 星期天 21:23:23 CST)

date +%F

date +%F-%H

date +%F-%H-%M

date +%F-%H-%M-%S

可以使用 touch file-`date +%F-%H-%M-%S`.txt 创建文件,或者: touch "file-`date +%F-%H-%M-%S`.txt "——此处使用的引号是反引号,不是单引号

——外围不能使用单引号,因为单引号内的所有内容都是强引用,不会转义

可以使用 --help 查看帮助文档

①、touch

touch命令主要用于修改文件或目录的访问时间等

如果文件不存在,touch命令默认会创建一个新的空文件;如果文件存在,则会更新时间戳(三个时间都会更新为命令执行的时间)

  • -a--time=atime--time=access--time=use:只更改文件的访问时间
  • -c--no-create:不创建任何新文件。若指定的文件不存在,该命令不会创建新文件
  • -d:使用指定的日期时间,而非当前的时间。后面可以跟具体的日期时间值,如"202307191200"表示2023年7月19日12时0分
  • -f:此参数将忽略不予处理,仅负责解决BSD版本touch指令的兼容性问题
  • -m--time=mtime--time=modify:只更改变动时间
  • -r:把指定文件或目录的日期时间,设置成和参考文件或目录的日期时间相同。例如,touch -r file1 file2会将file2的时间属性设置为与file1相同
  • -t:使用指定的日期时间,而非当前的时间。与-d不同,-t后面需要跟的是形如[[CC]YY]MMDDhhmm[.ss]的时间戳格式

此外,touch命令还有其他一些参数和功能,可以通过touch --help查看帮助信息获取更多详细的使用说明

更改文件时间戳

改访问时间为当前时间,但是此时最近改动时间也会变

touch -a 1.txt

只改变访问时间或者更改时间

touch -a -t 202310231030.00 example.txt  # 仅设置访问时间  
touch -m -t 202310231030.00 example.txt  # 仅设置修改时间

可以使用touch命令改变文件的访问时间和修改时间,但是改不了最后一个状态更改时间

【设置文件显示格式】
touch -t YYYYMMDDHHMM.SS 文件名

其中:

  • YYYY 是4位数的年份
  • MM 是2位数的月份
  • DD 是2位数的日期
  • HH 是24小时制的小时数
  • MM 是分钟数
  • SS 是秒数

例如,如果你想将文件example.txt的访问和修改时间设置为2023年10月23日的10:30:00,你可以使用以下命令:

touch -t 202310231030.00 example.txt

请注意,你必须确保提供的日期和时间是正确的,因为touch命令会根据你提供的时间来设置文件的时间戳

②、echo、vim
  • echo命令:echo命令主要用于将指定的字符串输出到终端或文件中。通过将输出重定向到一个文件,可以创建一个包含指定内容的文件。例如,要创建一个名为test.txt的文件并写入“Hello, World!”字符串,可以使用命令“echo 'Hello, World!' > test.txt”。
  • vi/vim命令:vi和vim是Linux系统中最常用的文本编辑器之一,也可以用来创建文件。使用vi或vim创建文件时,需要输入“vi 文件名”或“vim 文件名”命令,然后输入要写入文件的内容并保存。

2、查看文件

cat、tac、more、less、head、tail 等用于查看纯文本

stat查看文件的时间信息

stat命令在Linux系统中用于显示文件或文件系统的状态信息。它可以提供比ls -l命令更详细的信息,包括文件的访问时间、修改时间、状态改变时间等

stat 文件名

例如:

stat out.txt

输出可能如下:

File: "out.txt" 
Size: 2918 Blocks: 8 IO Block: 4096 普通文件 
Device: 803h/2051d Inode: 3022338 Links: 1 
Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root) 
    0表示特殊权限
Access: 2017-07-18 03:29:28.000000000 +0800 
Modify: 2017-07-18 03:28:54.000000000 +0800 
Change: 2017-07-18 03:28:54.000000000 +0800

在这个输出中,你可以看到以下信息:

  • 文件名:这是你要查看的文件的名字
  • 大小:文件的大小,以字节为单位
  • :文件占用的块数
  • IO Block:I/O块的大小
  • 类型:文件的类型(例如,普通文件、目录、字符设备、块设备等)
  • 设备:文件所在的设备编号
  • 索引节点:文件的索引节点号inode
  • 链接:文件的硬链接数
  • 访问:文件的访问权限,以数字形式和人类可读形式显示
  • Uid:文件所有者的用户ID和用户名
  • Gid:文件所有者的组ID和组名
  • 访问时间:文件最后一次被访问的时间
  • 修改时间:文件最后一次被修改的时间
  • 状态改变时间:文件的元数据或内容最后一次被改变的时间

使用echo在bash里面修改,最近访问时间不会改变,修改时间和状态改变时间都会变

使用vim修改的话,则三个时间都会改变,使用vim查看的话就只有访问时间会改变

可以使用touch命令改变文件的访问时间和修改时间,但是改不了最后一个状态更改时间

①、cat、tac

查看过程:命令被调入内存,然后向系统发起文件的查看,然后把命令和数据都加载到内存里面,然后CPU才能开始执行指令,最后把数据处理之后输出

但过大的文件由于缓存的问题,如果文件需要50屏,但内存只能放20屏,那么此时前面的文件就看不到了

(还有标准错误输出)

连接文件并在标准输出上显示,但是查看大文件的时候会造成一定的困难:因为查看文件需要先在内存中加载出来,如果文件太大的话,可能一次加载不了那么多(一次最多加载50屏), 所以会显示不全

cat调入到内存运行的时候,会发起磁盘调用,去得到文件,格式是指令+数据,完成命令之后马上就回退出,cat可以连接多个目标 

  • cat /etc/issue   /etc/fstab  —— 可以同时打开查看两个文件,但是文件比较的时候可能看不到头部的内容 
  • 相同路径下的同一个目录查看——切换目录 cd /etc/,然后查看文件 —— cat issue 1.jpg
  • 同一个目录下的两个文件同时查看——cat /etc/{issue,fstab} —— 命令展开
  • 查看文件时显示行号 —— cat -n /etc/issue
  • 查看多个文件时连续显示行号 —— cat -n /etc/{issue,fstab}
  • 显示行尾符号 —— cat -E /etc/{issue,fstab} ,使用后会显示 $ 等隐藏符号,供内核识别,一般看不到,内核根据符号换行或空格,一般来说,命令中的 $ 内核是不会识别的——如果搬移过来的文件串行的话,可以使用此命令查看隐藏符号分布(主要原因是不同的操作系统的换行符不一样,所以会导致串行也可使用 -A 显示所有的行尾符号(此命令更常用)
【linux和windows的脚本转换】

由于linux系统和windows系统的回车符不一样,所以在windows系统下写的脚本在linux系统下会报错,如果要使用windows下写的脚本的话,转换脚本1.sh要使用:

转换命令:dos2unix 1.sh
下载命令:yum -y install dos2unix

也有从linux转windows的命令:unix2dos,也能转化为mac:unix2mac

tac

顾名思义,就是把文件倒过来看,选项一样,只是倒序显示

②、more、less

more

用于分屏显示,会在屏幕的左下方显示当前查看的文件的进度条(根据屏幕大小显示进度)

回车向后翻一行,空格向后翻一屏;B键向前翻一屏,但翻到最底下就不能再往前翻了

没有翻完要退出:按Q键即可

less

回车向后翻一行,空格向后翻一屏;B键向前翻一屏,K向前翻一行

less检索查找
  • 在查找页面左下角输入一个 /bin ,就可查找到打开文件里面的所有bin——此时可以使用N键跳到下一个关键字,B键跳到上一个关键字
  • ?bin 的搜索方向和 /bin 是不一样的—— / 向后查找,?向前查找
  • Q退出
③、head、tail

head

查看文件头部内容,默认查看前十行

head -n 20 /etc/passwd (或 head -20 /etc/passwd )查看前20行(20为选项n的参数

查看行号:head -n 20 /etc/passwd | cat -n

tail

查看尾部内容,默认十行,tail -20 /etc/passwd 查看尾部的20行

-f 参数可动态查看,如果后面还有输入的话自动刷新显示

watch 0.1 每隔0.1秒执行一个命令watch 0.1 echo 1 >> 1.txt,此时动态查看文件内容 tail -f 1.txt

只查看15行:head -15 /etc/passwd | tail -1 /etc/passwd

(先查看头部的15行,然后将处理结果只看最后一行得到15行)
重定向命令>>

数据输出有标准输出和标准错误输出

  • 输入重定向:指的是重新指定设备来代替键盘作为新的输入设备
  • 输出重定向:指的是重新指定设备来代替显示器作为新的输出设备

在Linux中,重定向命令用于将命令的输出重定向到文件或其他设备。常见的重定向命令有以下几种:

1、 输出重定向:将命令的输出重定向到文件中

示例:将命令的输出重定向到文件output.txt中

        command > output.txt

2、 追加重定向:将命令的输出追加到文件末尾

示例:将命令的输出追加到文件output.txt中  

        command >> output.txt

3、 错误重定向:将命令的错误输出重定向到文件中

示例:将命令的错误输出重定向到文件error.txt中

        command 2> error.txt

4、 错误追加重定向:将命令的错误输出追加到文件末尾

示例:将命令的错误输出追加到文件error.txt中

        command 2>> error.txt

 5、 输入重定向:将文件的内容作为命令的输入

示例:将文件input.txt的内容作为命令的输入   

        command < input.txt

6、  输入输出重定向:将命令的输出作为另一个命令的输入

示例:将命令1的输出作为命令2的输入
        command1 | command

命令:vim 1.sh
-------------------------------------
脚本:
#!/bin/bash   -----bash脚本格式-------
for i in 'seq 1 100'
do
sleep 1  ---运行太快的话休眠等待一下---
echo $i >> 1.txt
done
-------------------------------------
然后esc,:wq 退出
使用bash 1.sh执行,就会打印1~100

3、文本处理

①、cut

用于给文件切片,linux使用cat列出的时候以 :分割

  • 查看 /etc/passwd 里面的第一段(未指定分隔符,整体回显):cut  -f1 /etc/passwd
  • 查看 /etc/passwd 里面的第一段,以冒号作为分隔符(取第一个冒号之前的内容):cut -d : -f1 /etc/passwd
  • 同时切两列:cut -d : -f1,3 /etc/passwd (逗号分割,1、3是选项参数)
  • 同时切三列:cut -d : -f1-3 /etc/passwd (逗号分割,1-3是选项参数)
  • 使用空格分割:cut -d ' ' /etc/passwd ——由于空格是命令分割的参数,所以应该是用单引号引起此字符以便和其他的命令中的分隔符区分

单引号是强引用,双引号是弱引用

单引号属于强引用,它会忽略所有被引起来的字符的特殊处理,被引用起来的字符会被原封不动的使用——但不允许引用单引号自身

而双引号属于弱引用,它会对一些被引起来的字符进行特殊处理。简单来说,单引号直接输出内部字符串,不解析特殊字符;双引号内则会解析特殊字符

反引号用来包含一个命令字符串的,其中的命令会先执行,得到的结果会返回到层命令再执行——与$(command)类似


通配符 * 可用于匹配,但如果加单引号之后就代表只是一个字符,不具有通配符的意义

②、sort

用于对文件内容复制到内存,进行排序然后显示,不会对原来的文件内容修改

根据ASCII码的次序进行的排序(a~z,0~9),列从小到大,行从小到大——默认顺序是升序,按照字符排序

  • 升序:sort  -n  1.txt(数值升序——n:number)
  • 降序:sort  -r  1.txt (字符降序——r:char)
  • sort  -nr  1.txt  &  sort  -rn 1.txt (nr一起用——按照数值降序)
  • sort  1.txt(不加参数,默认字符升序,1~9->小写字符->大写字符
  • sort  -u  1.txt (按照字符升序后去重,可配合上述参数一起使用)
  • sort  -t :-k  3  -n  1.txt  (-t :冒号为分隔符;-k 对指定列排序,但是全部内容都显示)
  • sort  -f  1.txt (忽略大小写,按照数值升序排列,1~9->大写字符->小写字符

参数有 -f 互略大小写排序,-k 指定列排序,-n 按照数值升序,-r 按照字符降序,-t 指定分隔符

后续要进行其他操作可使用管道符 |  ——如以冒号为分隔符,切割出第三列:cut -d :-f3

(cut -d :-f3  1.txt |sort 先切出要排序的列,然后默认按照数值升序更简单)

数值&数字:数值里面有量的概念,数字只是一个字符,数字10表示10,字符10 表示幺零

  • 按照字符进行排序,挨个比较首字符确定基本顺序,首字符相同的再进行比较
  • 按照数字比较,直接比较数值的大小
③、uniq

默认去除重复的文本,把相邻且重复的行列去掉,不相邻就不去掉,默认升序排序

sort -u是只要重复就会去掉

  • uniq -d 1.txt  (只显示重复的项)
  • uniq -D 1.txt  (显示所有相邻的重复的行,有几行重复显示几行)
  • uniq -c 1.txt   (显示文本中相邻的每一项出现的次数,不相邻的分开显示)

可用于统计同一个IP在短时间内访问服务器的次数,如果很多,大概率就是恶意攻击(排查日志,找出问题比较大的IP)

4、文本统计

①、wc

用于统计文本中多少行,多少个单词,多少个字符,空格也算是字符——空白行有空格则计数,没有空格视为空

  • wc  1.txt  (返回值 line,word,len)
  • wc -l   1.txt   (统计行数)
  • wc -w  1.txt  (统计单词数)
  • wc -c   1.txt  (统计字节数)
  • wc -L   1.txt   (统计一行里面最长的字节是多少)
  • 统计文件中有多少行 —— ls /etc/  |wc -l

命令ls和ll区别

ls 是最基本的列出目录内容的命令。它返回目录中的文件和子目录的列表

ll:ll 命令是 ls -l 的一个别名,功能上等同于 ls -l,即以长格式(详细信息)列出目录内容

(行,单词(按空格或者回车作为分隔符),字节(字节数按最多的那个算,再乘以数量))

②、tr

Linux的tr命令CSDN博客

用于以字符值的形式进行转换和删除,不能指定文本源,需要键盘输入或管道输入,也可管道输出

  • -d: 删除字符串
  • -s: 删除所有重复出现字符序列,只保留第一个,即将重复出现字符串压缩为一个字符串

tr 是 Linux 中的一个常用命令,全称是 "Text Replacer",主要用于进行文本字符的替换、压缩和删除操作。它可以从标准输入中读取数据,执行相应的转换处理,并将结果输出到标准输出设备

 tr -【参数】 【第一字符集】 【第二字符集】

  • -c--complement:取代所有不属于第一字符集的字符
  • -d--delete:删除所有属于第一字符集的字符
  • -s--squeeze-repeats:把连续重复的字符以单独一个字符表示
  • -t--truncate-set1:先删除第一字符集较第二字符集多出的字符

[a-z] 表示 a到z之间的所有小写字母,[A-Z] 表示A到Z之间的所有大写字母,[0-9] 表示数字0到9。此外,还可以使用八进制数(\octal)来表示有效的ASCII字符,或者使用 *n 的形式表示字符重复出现指定次数n

  1. 删除:echo "hello 123 world 456" | tr -d '0-9' 将输出 "hello world"
    删除空白行:cat zzz.txt | tr -s "\n"
    将a以外的字符换为X:cat zzz.txt | tr -c a X
  2. 替换:cat text | tr '\t' ' ' 将把文本中的制表符替换为空格
    abc换为ABC:cat 1.txt | tr -t abc ABC
  3. 将输出 "1 2 3 4",即只保留了数字和空格
    删除不在字符集中的字符:echo "aa.,a 1 b#$bb 2 c*/cc 3 ddd 4" | tr -d -c '0-9 ' 
  4. 将把文件1.txt中的所有小写字母转换为大写字母

    将字符串中的小写字母转换为大写字母:cat 1.txt | tr a-z A-Z 

或者直接使用tr命令,但需输入重定向

替换abc为ABC:tr -t abc ABC < 1.txt

需要注意的是,tr 命令只改变输出显示效果,不改变实际输入源内容。在替换、删除文件内容时需要重定向输出

Linux中正则匹配grep详解-CSDN博客

标准输出重定向和错误输出重定向

ls  /root aaa ——显然根目录没有aaa这个文件,所以会有一个标准输出和一个标准错误输出

  • 标准输出重定向——ls  /root aaa 1>2.txt —— 标准输出流前面应该是1,但是可省略
  • 标准错误输出重定向——ls  /root aaa 2> 3.txt ,其中 2> 为标准格式,专用于输出标准错误
  • 全部重定向 —— ls  /root aaa &> 4.txt ,&>  把输出全部重定向到文件 4.txt 中

程序是要有输入的,一般输入可从键盘输入,cat 回车之后就会等待数据的输入,然后回车会输出输入的东西——这属于手动输入

有些命令支持从磁盘中导入数据,有些不支持导入数据(如 tr 命令),此时可使用输入重定向从此盘里面读取数据

tr -d 'a-z' < /etc/passwd  (将文件作为标准输入供给命令tr,删除文件中所有的小写a-z,然后再输出到显示器)

5、删除文件

  1. 基本用法

    • rm 文件名:删除指定的文件
    • rm 文件1 文件2 ... :删除多个指定的文件
  2. 【删除目录】

    • 要删除一个目录及其下的所有文件和子目录,需要使用-r(或-R--recursive)参数。例如,rm -r 目录名
    • 如果要强制删除,不询问任何提示,可以加上-f(或--force)参数。例如,rm -rf 目录名
  3. 参数说明

    • -f强制删除,不提示任何信息
    • -i:交互式删除,删除前会询问用户是否确定由于别名的存在,有时使用rm删除文件的时候,会询问是否删除该文件或目录,但默认不会询问,询问时回y/n
    • -r-R:递归删除,用于删除目录及其下的所有文件和子目录
    • -v详细显示进行的步骤,即显示被删除的文件或目录的名称
  4. 注意事项

    • 使用rm命令时,特别是带有-r-f参数时,要格外小心,因为删除的文件或目录通常无法恢复
    • 在删除重要文件或目录之前,最好先备份,或者使用ls命令查看一下要删除的内容,确保不会误删

6、复制、移动

①、复制文件

如果复制文件不指定路径的时候,则会复制到当前目录下面

  • -f:强制复制,即使目标文件已存在也不会提示
  • -i:在复制前询问是否覆盖已存在的文件
  • -r-R:递归复制,用于复制目录及其内容
  • -l:创建硬链接,而非复制文件
  • -s:创建符号链接(软链接),而非复制文件
  • -u:仅当源文件比目标文件新,或当目标文件不存在时,才复制文件
  • -v:详细显示命令执行的操作
  • -p / -a:保证文件的属主权限(包括权限、所有者、群组等)不变

复制文件并改名

  • cp 1.txt  /opt/ —— 复制1.txt 到/opt/目录
  • cp 1.txt  /opt/2.txt —— 复制1.txt 到/opt/目录,并改名为2.txt

复制多个文件

  • cp 2.txt 3.txt /opt/ —— 复制2.txt和3.txt文件到/opt/目录

备份多个文件的时候,目标地址必须是一个目录

备份文件

  • cp 1.txt{,.bak}  —— 复制得到 1.txt.bak 文件
  • cp 1.txt 1.txt.bak —— 复制产生1.txt 的备份文件1.txt.bak(复制前后的名称需不同

用于在修改文件的时候作备份,防止修改错误

默认情况下:如果复制目标文件夹有同名文件,则会询问是否覆盖,如果没有询问的话,大概率是有别名的缘故

如果要复制目录的话,则需要加 -r 参数递归复制目录及其下面的文件

Linux系统中,默认情况下,cp复制文件的时候不会改变文件的权限

但是root复制别的用户的文件的时候,权限会变为root

要想此时的权限不变的话,可以使用 cp -p 复制文件

使用 stat 命令查看复制后的文件有:

  • atime:与原文件相同,或者如果你立即访问了文件,则为当前时间。
  • mtime:与原文件相同。
  • ctime:通常是复制操作后的当前时间,因为元数据被复制了。

但是,如果在复制文件时使用了某些选项或者目标文件夹不允许复制,可能会出现权限改变的问题。例如,如果使用了-a选项进行复制,那么文件的属性(包括权限、所有者、群组等)将会保持不变,但是最后修改日期将会变成复制时的日期

因此,在使用cp命令复制文件时,需要注意目标文件夹的权限设置以及是否使用了正确的选项来保持文件的属性不变。如果需要更改目标文件的权限,可以使用chmod命令进行修改。

②、移动文件

在Linux中,移动文件可以使用mv命令。mv命令用于将文件或目录从一个位置移动到另一个位置,或者重命名文件或目录。当移动文件时,你可以指定源文件的路径和目标路径

基本语法

mv [选项] 源文件 目标路径

主要选项

  • -f:强制移动,即使目标位置已存在同名文件也不提示
  • -i:在移动前询问是否覆盖已存在的文件
  • -u:仅当源文件比目标位置的文件新,或当目标位置的文件不存在时,才移动文件
  • -v:详细显示命令执行的操作

使用示例

        1.移动单个文件

mv source.txt target_directory/

这会将source.txt文件移动到target_directory/目录下

        2.移动文件并询问是否覆盖

mv -i source.txt target_directory/

如果target_directory/下已经存在名为source.txt的文件,系统会询问是否要覆盖它

        3.强制移动并覆盖已存在的文件

mv -f source.txt target_directory/

这会将source.txt文件移动到target_directory/下,不会询问任何提示,直接覆盖已存在的文件

注意事项

  • 如果目标位置是一个已经存在的目录,文件会被移动到该目录下,并保持其原有的名称
  • 如果目标位置是一个已经存在的文件,并且你试图将另一个文件移动到这个位置,那么默认会覆盖这个文件
  • 在使用mv命令时,特别是当使用-f选项时,一定要小心,因为它会无提示地覆盖目标位置的任何内容
  • mv命令同样适用于移动隐藏文件和带有空格的文件名,只需要在文件名前加上.或用引号将文件名括起来即可

【install创建、复制文件,复制目录】

"install" 是一个常用的 Unix/Linux 命令,用于复制文件或目录,并可以在复制过程中进行一些设置,如设置文件权限、所有权等。它经常被用来安装软件,因为安装程序通常需要将文件复制到特定的系统目录,并设置适当的权限和所有权

一、安装(安装文件)

当你使用 install 命令来“安装”一个文件时,你实际上是在将文件从一个位置复制到另一个位置,并可能改变其属性

基本语法是:

install [选项] 源文件 目标文件

例如,如果你想要复制一个文件 example.txt/usr/local/bin/ 目录,并设置它为可执行文件,你可以这样做:

install -m 755 example.txt /usr/local/bin/

在这里,-m 755 选项设置了文件的权限为 755(即,所有者有读/写/执行权限,而组和其他用户有读/执行权限)

二、复制文件

你也可以使用 install 命令来简单地复制文件,而不改变其权限或所有权。例如:

install source.txt destination.txt

这会将 source.txt 复制到 destination.txt,并保持其原始权限和所有权不变

复制到同一目录下可以改名

三、复制目录

install 命令也可用来复制整个目录。使用 -d 选项可创建一个新的目录结构,类似于 cp -r

install -d /path/to/destination/dir/ /path/to/source/dir/*

这会复制 source/dir/ 下的所有文件和子目录到 destination/dir/,但不会复制 source/dir/ 目录本身

四、目录管理命令

【pwd查看当前目录】

【文件目录的命名规则】

  1. 名称长度不能超过255个字符
  2. 不能使用 / 作文件名
  3. 命名区分大小写

1、创建目录

默认,新创建的文件的权限为644(即rw-r--r--),而新创建的目录的权限为755(即rwxr-xr-x)

  1. 创建单个目录

    mkdir directory_name

    这将在当前目录下创建一个名为directory_name的新目录

  2. 创建多个目录

    mkdir dir1 dir2 dir3

    这将在当前目录下创建多个目录,分别是dir1dir2dir3

  3. 创建多级目录

    mkdir -p parent_directory/child_directory/grandchild_directory

    使用-p选项,mkdir会创建所有必要的父目录,以确保最终目录可以被创建。在这个例子中,即使parent_directorychild_directory不存在,它们也会被创建

  4. 设置目录权限

    mkdir -m 755 directory_name

    使用-m选项和相应的权限数字(如755),你可以在创建目录时设置其权限。在这个例子中,directory_name的权限将被设置为所有者可读、可写、可执行,而组用户和其他用户只有读和执行的权限

  5. 打印显示目录创建过程

    mkdir -v directory_name

    使用-v选项,mkdir会在创建目录时打印出更多信息,包括正在创建的目录的名称

请注意,创建目录需要适当的权限。如果你没有足够的权限在某个位置创建目录,你可能会收到一个错误消息。在这种情况下,你可以尝试使用sudo来以超级用户权限运行mkdir命令:

sudo mkdir directory_name

这将要求你输入用户的密码,然后以超级用户权限执行命令

目录创建举例:

  1. 在 /mnt/test/r 目录下面创建多个目录 r 和 y:mkdir -pv /mnt/test/r/{ r , y }        (pv:创建父目录,并逐步显示目录创建的过程)
  2. 在 /mnt/test/ 目录下,先创建 s 和 y 目录,在 s 目录下创建 r :mkdir -pv /mnt/test/{ s/ r , y } 
  3. 在 /mnt/test/ 目录下,先创建 s 和 y 目录,在 y 目录下创建 u:mkdir -pv /mnt/test/{ s , y / u } 
  4. 在 /mnt/test/ 目录下,先创建 s 和 y 目录,然后分别创建创建 i:mkdir -pv /mnt/test/{ s , y } / i
  5. 在 /mnt/test/ 目录下,创建a_b,a_c,b_b,b_c:mkdir -pv /mnt/test/{ a , b } _ { b , c }

2、删除目录

在Linux系统中,删除目录的命令主要有rmrmdir

  • rmdir命令:用于删除空目录,不能删除非空目录。如要删除一个名为"MyDocuments"的空目录,你可以使用命令rmdir MyDocuments
  • rm命令:这个命令通常用于删除Linux中的文件,但也可以通过添加参数来删除目录。例如,要递归地删除目录(包括其所有子目录和文件),你可以使用-r-R选项。如果目录是受写保护的,它会提示你是否继续删除目录和目录中的文件作为一个整体。如果你希望强制删除而不被提示,可以使用-f选项。例如,要删除一个名为"MyDocuments"的目录及其所有内容,你可以使用命令rm -rf MyDocuments/

请注意,使用rm命令删除目录时要特别小心,因为删除后无法恢复

此外,你还可以使用find命令结合rm命令来删除满足特定条件的目录。例如,要删除当前目录中的所有空目录,你可以使用命令 find . -type d -empty -delete

  • rmdir命令:用于删除空目录
  • rm命令:通过添加-r-R选项来递归删除目录及其内容,使用-f选项可以强制删除而不被提示
  • find命令结合rm命令:可以根据特定的搜索标准删除目录:
先根据名字查看是否是需要删除的目录:find . -type d -name "exampleDir" -print

然后再删除:find . -type d -name "exampleDir" -exec rm -r {} \;

还可根据别的标准去删除

删除所有空目录:find . -type d -empty -exec rmdir {} \;
-empty 选项用于搜索空目录。rmdir 命令用于删除空目录,因此这里不需要 -r 选项。

删除修改时间早于 7 天的目录:find . -type d -mtime +7 -exec rm -r {} \;
-mtime +7 表示目录的修改时间必须早于 7 天前。

删除大小超过 10MB 的目录:find . -type d -size +10M -exec rm -r {} \;
-size +10M 表示目录的大小必须超过 10MB。

删除权限不是 755 的目录:find . -type d ! -perm 755 -exec rm -r {} \;
! -perm 755 表示目录的权限不是 755。

3、切换目录

用于切换目录:cd /opt/ 切换到opt目录 ,直接 cd 或者 cd~ 可回到家目录(~代表的就是家目录),不知道目录的路径,可使用 cd ~ abc,可直接进入abc目录

  • 切回上一级目录可用 cd[空格]- :回到跳转前的目录,再 cd[空格] - :则会回到刚才的目录
  • cd .. 回到当前目录的上一级目录
  • (ls . 表示看当前目录,ls . . 表示看上一级目录)—— 相当于快捷键
  • cd ../..切换到上一级的的上一级目录

pwd打印当前路径

4、复制目录

基本语法

cp [选项] 源文件或目录 目标文件或目录

主要选项

  • -f:强制复制,即使目标文件已存在也不会提示
  • -i:在复制前询问是否覆盖已存在的文件
  • -r-R:递归复制,用于复制目录及其内容
  • -l:创建硬链接,而非复制文件
  • -s:创建符号链接(软链接),而非复制文件
  • -u:仅当源文件比目标文件新,或当目标文件不存在时,才复制文件
  • -v:详细显示命令执行的操作

使用示例

  1. 复制单个文件

    cp source.txt destination.txt
  2. 复制多个文件到目录

    cp file1.txt file2.txt directory/
  3. 递归复制目录

    cp -r sourcedir/ destinationdir/
  4. 强制复制并覆盖已存在的文件

    cp -f source.txt destination.txt
  5. 复制文件并询问是否覆盖

    cp -i source.txt destination.txt
【注意事项】
  • 如果目标文件已经存在,并且没有使用 -f 选项,cp 命令通常会询问是否覆盖该文件
  • 如果目标是一个目录,cp 命令会将源文件或目录复制到该目录下
  • 如果源文件是一个目录,并且没有使用 -r-R 选项,cp 命令会报错
  • cp 命令可以处理绝对路径和相对路径

5、移动目录

移动目录时,需要确保目标位置不存在与要移动的目录同名的目录,否则默认会覆盖它

基本语法

mv [选项] 源目录 目标目录

主要选项

  • -f:强制移动,即使目标位置已存在同名目录或文件也不提示
  • -i:在移动前询问是否覆盖已存在的目录或文件
  • -u:仅当源目录比目标目录新,或当目标目录不存在时,才移动目录
  • -v:详细显示命令执行的操作

使用示例

        1.移动单个目录

mv sourcedir targetdir/

这会将sourcedir目录移动到targetdir/目录下,并且sourcedir会被重命名为targetdir/sourcedir

        2.移动目录并询问是否覆盖

mv -i sourcedir targetdir/

如果targetdir/下已经存在名为sourcedir的目录,系统会询问你是否要覆盖它

        3.强制移动并覆盖已存在的目录

mv -f sourcedir targetdir/

这会将sourcedir目录移动到targetdir/下,不会询问任何提示,直接覆盖已存在的目录

注意事项

  • 如果目标位置是一个已经存在的目录,并且你移动的是一个目录,那么源目录会被移动到目标目录下,并且保持其原有的名称
  • 如果目标位置是一个已经存在的文件,而你试图将一个目录移动到这个位置,那么默认会覆盖这个文件,并且将目录命名为这个文件的名称
  • 在使用mv命令时,一定要小心,特别是当你使用-f选项时,因为它会无提示地覆盖目标位置的任何内容

五、vim编辑器应用

【vim教程】

vimtutor  命令,调出官方的中文教程,q退出

linux一切皆文件,修改参数可直接修改配置文件(liunx不是像windows视为图形化界面,命令调整更快更便捷)

【vim三种模式】

三种模式分别为——编辑模式、输入模式、末行模式,切换如下

输入模式不能直接切换到末行模式

  1、编辑模式(命令模式)

  在命令模式下,可执行Vim命令:复制、粘贴、搜索、替换等 —— 一打开vim编辑器就处于此模式,所有操作都会对整个文件进行操作,在此模式下打开的文件,按H键左移,L键右移,Z键往下,K键上移,但是此时的所有操作都是对文本的命令,而不会对文本本身做出修改

        编辑模式下dd会删除一行,p会粘贴——删除后自动放到粘贴板上,使用p就会恢复过来

   在编辑模式下产生修改之后可以使用zz保存并退出

  2、输入模式(插入模式)

  在此模式下,所有输入都会被认为是文本。可在命令模式下输入" a / i / o "( A / I / O ),以进入输入模式,回编辑模式按esc键即可,接着按:可以到末行模式

     i  表示在当前光标所在处的前方插入; a 表示在当前光标所在处的后方插入;    o 表示在光标所在下面新建一行,在行首插入

     I 在当前光标所在的行首开始插入;     A 在光标所在的行的行尾开始插入;        O 表示在所在行的上面新建一行,在行首插入

  3、末行模式

  在末行模式下,可执行命令:保存文件、退出编辑器等。可在命令模式下输入" :",以进入末行模式

【vim的三种模式的切换】

  1. vi是可视化接口(Visual Interface)
  2. gedit是个图形化的文本编辑器,在终端里面可以直接打开该编辑器

vim是一个文本编辑器(也可用于写脚本),是可视化接口的vi的增强版只编辑纯ASCII的文档(字符串文档),但不会有任何的修饰符,如艺术字等,vim只能作纯文本,甚至没有标题

  • vim是vi的升级版,语法有特殊颜色显示,如果不显示可能有错但必须是以.sh结尾的文件,或者系统中比较重要的文件
  • vim是全屏编辑器,一打开就是全屏;属于模式化编辑器,不同模式下的击键的意义是不同的(具体模式如下所示)

1、vim的使用(vim手册)

vim手册在vim编辑器下输入命令:vimtutor,可查看vim的官方教程手册,q退出

vim + 文件名,打开后的左下角就显示文件名;如果是vim + 路径,打开后左下角就显示文件的路径,左下角还会显示行数和字节数,右下角会显示当前光标所在位置是第几行,第几个字符,光标在中间会显示百分比,在文件的前面、后面会显示顶端、底端

①、文件的打开、关闭

一、打开文件

  • 光标定位:vim +20 passwd ,+ 号指定光标所处的位置
  • 跳到最后一行:vim + passwd
  • 指定内容的地方:vim + /root  passwd ( / 为匹配模式分隔符,找到该关键字就会高亮显示)
  • 编辑两个文件:vim + root  passwd(同时打开,但找不到的话就会报错)

vim + 文件名,如果文件存在就会直接打开,但是不存在的话会打开一个同名的空白文件,如果退出的时候没有保存就不会保存

二、关闭文件

关闭文件要在末行模式下结束(参数的前面要加冒号)

  • w  :保存但不退出
  • w! :强制保存
  • q  :退出,未编辑可直接退出,编辑之后退出要强制退出,否则会报错
  • q! :表示强制退出
  • wq:保存并退出(x 也可保存并退出),wq!强制保存退出
  • 在编辑模式下,按两下ZZ,也会保存并退出

root的权限很大,大到可以杀死所有进程和自己

在终端重复打开同一文件会使进程操作同一个文件,此时就会产生交换文件

  1. vi(vim)写文件,没有保存就关闭,会自动生成一个后缀为.swp的交换文件(隐藏文件),保存了前面写的内容
  2. 先利用R恢复,再删除这个交换文件

第一种

  • ls –a   列出所有的文件

  • rm .xxx.swap -rf   删除临时的交换文件

第二种

  • jobs 可查看当前后台的作业有多少个

  • fg 查看当前的进程名,有多个的话,可以使用%指定查看第几个

②、文件加密、解密

一、文件加密

在末行模式下 : X,回车,此时会让你输入密码,然后再次输入,确认密码

打开该文件的时候就要输入密码才能查看,否则不能进行任何操作

二、文件解密

在输入密码正确的前提下,进入文件之后,末行模式下 : X,回车,两次输入密码均不输入,然后回车保存退出,文件就不会有密码了

③、光标移动

  • 编辑模式下光标的移动:由于上下键受限的时候,可以使用L、H左右移动,Z、K上下移动
  • 输入模式移动:要使用上下左右的箭头键
  • 末行模式下:直接按数字就会跳转到对应行的行
  • 翻屏:ctrl+f 向下翻一屏(page down)空格键也可翻一屏;ctrl+b 向上翻一屏(page up);ctrl+d 向下翻0半屏;ctrl+u 向上翻半屏
  • 删除一行:dd——也可配合数字:5dd,删除5行

—————————————————以下内容仅作了解—————————————————

  • 一次移动若干字符:先按要移动的字符数,然后按要移动的方向(按10,然后L或者按向左的箭头,向左移动十个字符)
  • 移动若干单词:编辑模式下:按W表示移动到与下一个单词中间的分隔符;按E表示移动到当前单词的词尾(按数字+W——移动到该行第几个单词的词首);按B表示移动到当前光标的单词的词首(单词的第一个字母)
  • 行内移动:移动到光标所在的行首按0;行尾直接按$;按一下 ^ 表示移动到本行的第一个非空白符(0是绝对行首)
  • 行间移动:大写的G表示移动到最后一行;小写的gg跳到首行——配合数字均可以跳到该行行首,末行模式下使用冒号+行号也可以直接快速回到那一行
  • 屏内移动:按H移动到屏幕显示的第一行内容;M回到屏幕显示的内容的中间;L移动到屏幕显示的最后一行
  • 删除字符:x向后删除字符(删掉所在位置的后面的内容);大写X向前删除(删掉所在位置的前面的内容)—— 也可配合数字5x:向后删除5个字符
  • 末行模式删除多行:要清楚当前所在的行 ——  . , $+5d :从当前行往下再删5行;. , $d :从当前行删除到最后一行;. , $-3d :从当前行删除到倒数第三行;

④、剪贴、替换、删除

一、剪贴命令

无具体剪贴命令,只有d,可以理解为删除,也可理解为剪切——删除的时候会放入内存的缓存当中,按p就会粘贴到当前光标的下方

y是复制,yy是复制一行,p是粘贴到行的上方,P粘贴到行的下方,y5y就是复制5行

二、替换删除

在编辑模式下(命令行),按c加左箭头可以删除前面的字符,上下左右均可(上下删除只删除内容,不删除空行)

在光标所在处替换所指内容

  • r + 按想替换的内容可替换 —— 一次只能换一个
  • R 可以替换后面的所有
  • u 可以撤销之前的操作,最多支持50次的回撤操作,配合数字可以多撤销一些——10u:一下撤销10次操作(编辑模式下
  • 恢复撤销了的撤销:ctrl+r (撤销撤多了)
  • 重复前一次的编辑操作 —— 点号  .

⑤、可视化、查找

一、可视化模式下的选择

按一下v可一个一个选;V可以一整行一整行的选;ctrl+v 可视块选取(可以从中间选一个矩形块出来)选中之后可以执行删除操作,删除所有选中的内容,如果光标和鼠标选择的不一样,优先删除鼠标选择的内容

注释:井号#在linux系统中表示注释

快速注释多行——编辑模式下:ctrl+v 选中要注释的行首,然后按一下 I(大写),按一下#,然后连续按两下esc

删除:选中要删除的内容后按d即可删除

二、查找(末行模式下)—— / 向下查找,?向上查找

查找并替换(末行模式)s 只能在光标所在行里面查找

  • s/root/abc ——查找光标所在行的root,然后将匹配到的行里面的第一个换成abc
  • s/root/abc/g ——表示将光标所在行的所有root全部替换为abc
  • 1,5s/root/abc/g ——查找第一行和第五行的root,然后替换为abc
  • %s/root/abc/g ——全文查找并替换root为abc
  • %s/\/root/\/bin/g——\ 转义 / 为根目录的一部分,实现全文根目录替换,也可以使用+作为格式的连接符:%s+/root+/bin+g

⑥、多文件编辑

vim opt passwd,同时打开两个文件,进入编辑模式之后,退出的时候就会提醒还有一个文件未编辑,有几个文件,退出的话就要按几个退出,或者使用 qall 即可退出所有文件的编辑

一、多个文件之间的切换——窗口拆分

  • 水平:ctrl+w,然后放开,按x——水平拆分,然后ctrl+w,放开,按上下箭头可以选中编辑上面的窗口或者下面的窗口,qall 全部退出
  • 垂直:ctrl+w,然后放开,按v——垂直拆分,然后ctrl+w,放开,按左右箭头可以选中编辑左边的窗口或者右边的窗口,qall 全部退出      

二、多文件分窗口编辑

  • vim -o opt passwd  —— 水平拆分,然后ctrl+w,放开,按上下箭头可以选中编辑上面的窗口或者下面的窗口
  • vim -O opt passwd  —— 垂直拆分

⑦、另存、填充

一、另存

另存为——编辑模式下,: w  /opt/1.txt,就会把1.txt 写入opt目录下面

部分另存为—— :1,20 w  /opt/1.txt, 1~20行保存为opt目录下面的1.txt

二、填充

某文件下填充另一个文件的内容——编辑模式下 : r  issue,就会复制过来;向复制一部分的话,把那部分另存为,然后复制过来即可        

⑧、与shell交互

末行模式下 : ! ifconfig 就可以在文件编辑的时候查看IP信息,看完回车就会返回原来的编辑界面,这样就不需要关闭文件,查看IP,然后再打开文件进行编辑了

2、vim高级使用技巧

  • 查找的时候高亮显示的话——可以使用noh去掉;或者 /root 找完之后随便敲写东西让他去找,找不到就不会高亮显示了
  • 末行模式下显示行号—— set nu 临时显示行号,不显示行号的话,可以使用 set nonu
  • 忽略大小写—— set ic 或者 set noic (取消忽略大小写)
  • 缩进两字符—— set ai, set noai 可以取消
  • 去掉语法高亮—— syntax off

3、vim配置文件

vim文件打开的时候就会加载配置文件里面的内核,内核启动的时候会读取配置文件,然后按照文件配置调整

对同一设置有多个设置的话,最后一个起作用;生效范围越小,越是生效,自爱后面的生效

  1. 配置文件处于 /etc/vimrc,属于全局设置
  2. 个人家目录下的 vimrc : vim ~/.vimrc
  • su nosery属于半切换用户:登录用户变了,但很多的环境变量还是之前的用户的环境变量
  • su -l nosery 的话就是全切换,此时的工作目录就会变为nosery的家目录

4、交换文件的正确处理方式

在终端上使用vim打开了某个文件,由于各种原因导致终端关闭之后会出现交换文件的警告,以及所有者信息,什么时候打开的,是否修改过,用户名,主机名,ID号,打开日期……

或者同时打开一个文件(同时打开看当前登录了那些用户可以使用who来查看,last可以看谁登录、重启等信息)


  1. 可以按d直接删除
  2. rm -rf /opt/.passwd.swp 删除文件

该文件以 .swp 结尾,最后会提示你操作需要的按键——但是如果按D并没有什么用,一般先恢复(恢复到内存,不是磁盘)

可以使用命令 ls  /opt/.passwd.swp ,然后删除该文件:rm -rf /opt/.passwd.swp,最后打开 vim/opt/passwd,就可以恢复到磁盘

.swp 本身就是虚拟内存的格式,删掉再从磁盘拿一个最好,如果不删掉,每次打开passwd文件的时候都会加载这个临时文件到内存里面,防止操作的丢失

本文标签: 命令 文件 目录 Linux vim