linux basis


简介

vi及vim是linux下的文本编辑器,其他的还有emacs、pico、joe等。

为何要学vim

  • vim可视作vi的高级版本;

  • 所有的Unix-like都有内置的vi文本编辑器,其他的文本编辑器则不一定会存在;

  • 很多软件的编辑接口都会主动调用vi(crontab、visudo、edquota等);

  • vim具有程序编辑的能力,可以主动地以字体颜色辨别语法的正确性,方便程序设计;

  • 程序简单,编辑速度块;

vi的使用

vi分三种模式,一般命令模式、编辑模式、命令行模式。

  • 一般命令模式:以vi打开一个文件即进入该模式,可以进行光标的移动、搜索和替换、删除字符、删除整列、复制整列、粘贴整列,但是不能进行编辑文件内容;

  • 编辑模式:按下[i,I,o,O,a,A,r,R]中任意一个则可以从一般命令模式进入编辑模式,之后左下角会出现"INSERT"或"REPLACE"字样,若返回一般命令模式则需按下ESC。

  • 命令行模式:输入[:/?]三个中的任一个就可以将光标移动到最下面的一行,你可以进行读取、保存、批量替换字符、退出vi、显示行号等操作。

简易执行

vi建立文件

1
2
/bin/vi welcome.txt
# 在一些操作系统中,由于一般账号默认vi已经被vim替换了,因此需要输入绝对路径来执行才可以。

关于vi或vim的保存与退出

 如果welcome.txt的权限为-r--r--r--,当前登录用户为dmtsai,我们使用vim对此文件内容进行修改,我们然后退出,执行:wq(write and quit),但是该文件权限不允许dmtsai进行写入,我们就可以使用[:wq!]进行强制写入。但是需要注意,强制写入是在你的权限可以改变的情况下才成立的,即文件所有者dmtsai可以修改自己权限r--为rw-。

系统语系的修改

  使用root用户登陆

1
vim /etc/locale.conf

  使用vim打开上述文件,修改LANG="zh_CN.UTF-8"LANG="en_US.UTF-8",即可将中文修改为英文,修改为中文,反过来就可以了。

X window

  X window system是个利用网络架构的图形使用者接口软件,这个架构基本上分成两个原件,X Server和X Client,X Server的作用是管理主机上的所有硬件设备,这些设备与输入/输出有关,如显卡、分辨率、鼠标按键对应等等。

  X window系统是一套工作在\(\text{UNIX}\),现在是类\(\text{UNIX}\)系统中图形用户界面的工作标准。

cat命令的使用

  1. cat命令用来查看文件信息,用法为cat [参数] 文件名,常用参数-n为从1开始对输出显示行号,

  2. 建立小型文件,利用输出重定向把cat命令的输出写在一个新文件里,使用如下

    1
    2
    3
    4
    5
    6
    7
    cat > newfile
    echo "hello! Linux"
    echo "date"
    # Ctrl + d
    cat newfile
    # echo "hello! Linux"
    # echo "date"

  3. 合并文件,利用cat及重定向,将两个文件的信息合并在一起,并以一个新文件名命名。用法为cat 文件1 文件2 > 新文件名

more命令

  more命令用来逐屏显示文件内容,按回车显示下一行,按空格显示下一屏,按q键退出,用法为more 文件名,也可以使用管道由另一个命令的输出作为more的输入,一个例子如下

1
man ls | more

file *命令

  file *命令用来展示当前目录下的所有文件以及其文件类型,如下。

硬链接和软链接

  硬链接(\(hard link\))和符号链接(\(symbolic link\))的区别,通俗点说,可以把硬链接当做源文件的副本,他和源文件一样的大小但是事实上却不占任何空间。符号链接可以理解为windows下的快捷方式。符号链接的文件可以是任意文件或目录,甚至可以是不存在的文件,还可以不断的循环链接自己。删除链接文件时,系统仅删除符号链接文件,不删除源文件本身;而硬链接文件有两个限制,第一是不允许给目录创建硬链接,第二是只允许在用以文件系统中的文件之间才能创建链接。对于硬链接文件与符号链接文件进行读写和删除的时候,都会转化成对源文件的修改,但是若删除硬链接的源文件,硬链接文件仍存在,并且保留了原有的内容。

1
2
3
4
# 此命令为生成一个符号链接
ln -s source_file softlink_file
# 此命令为生成一个硬链接
ln existfile newfile

文件搜索命令

  不管是在linux还是在Windows下都是不推荐使用文件搜索命令的,因为它会占用大量的系统资源,所以在电脑或者服务器下文件的存放应该规划的很好,避免使用搜索或者搜索条件越精确,及搜索范围越小越好。

  1. find命令:用法:find [搜索范围] [匹配条件],在匹配条件中使用*匹配任意字符,使用匹配单个字符关于使用常用参数如下;

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    # 在目录/etc中查找文件init
    find /etc -name init
    # 同上,但是查找不区分大小写,
    find /etc -iname init
    # 在根下查找大于100MB的文件,100MB=102400KB=204800数据块
    # 这里的204800是数据块的大小,1KB=2数据块,
    # +n 大于 -n 小于 n 等于
    find / -size +204800
    # 在根目录下查找所有者为ct104的文件
    # -group 根据目录所属组查找
    find /home -user ct104
    # 在/etc下查找5分钟内被修改过属性的文件和目录
    # -amin 访问时间(access) -cmin 文件属性(change) -mmin 文件内容(modify)
    find /etc - cmin -5

  2. locate命令:它的查找是在一个资料库中查找,这个资料库中是会自动更新的,对于刚创建的文件显然使用locate是不行的,所以我们可以使用updatedb命令来更新这个资料库,用法locate [匹配条件]

  3. which命令:搜索命令所在目录及别名信息。

uptime命令

1
2
3
4
uptime
# 11:10:42 up 4 days, 19:23, 2 users, load average: 3.17, 3.45, 3.65
# 系统当前时间:11:10:42,up 4 days, 19:23,从上次启动开始系统运行的时间
# load average:3.17,3.45,3.65描述了1分钟5分钟15分钟内系统平均负载

用户管理命令

  1. passwd命令:它用来设置用户密码,使用方法:passwd [用户名]
  2. who命令:查看当前登陆用户信息,使用方法:who
  3. w命令:查看登陆用户详细信息,使用发发:w

压缩解压命令

  1. gzip命令:它的功能是压缩文件,使用方法:gzip [文件],压缩后文件格式:.gz。这个命令只能用来压缩文件,不能用来压缩目录,并且压缩后不保留原文件;
  2. gunzip命令:它的功能是解压缩.gz的压缩文件使用发发:gunzip [压缩文件],它也等于gzip -d
  3. tar命令:它用来打包压缩目录,压缩用法tar [-zcf] [打包压缩后文件名] [目录],解压用法tar [-zxvf] [解压文件名]
  4. zip命令:它的功能是用来压缩文件或目录,压缩后文件格式.zip,用法:zip [-r] [压缩后文件名] [文件或目录]-r选项的作用是使它可以用来压缩目录;
  5. unzip命令:它的功能是解压.zip的压缩文件,用法:unzip [压缩文件]
  6. bzip2命令:它的功能是用来压缩文件,相对gzip来说压缩文件后,它可以保留源文件,并且它的压缩比很好,推荐使用压缩比较大的文件,压缩后文件格式:.bz2,使用tar [-cjf] [打包压缩后文件名] [目录],可以生成.tar.bz2格式的压缩包文件,如果想把.tar.bz2的压缩包解压,则使用tar [-xjf] [压缩文件]

swap分区的作用

  当系统的物理内存不够用时,就需要将物理内存中的一部分空间释放出来,以供当前运行的程序使用。那些被释放的空间可能来自一些很长时间没有什么操作的程序,这些被释放的空间被临时保存到Swap空间中,等到那些程序要运行时,再从Swap中恢复保存的数据到内存中。这样,系统总是在物理内存不够时,才进行Swap交换。其实,Swap的调整对Linux服务器,特别是Web服务器的性能至关重要。通过调整Swap,有时可以越过系统性能瓶颈,节省系统升级费用。

  如大家所知,现代操作系统都实现了“虚拟内存”这一技术,不但在功能上突破了物理内存的限制,使程序可以操纵大于实际物理内存的空间,更重要的是,“虚拟内存”是隔离每个进程的安全保护网,使每个进程都不受其它程序的干扰。

挂载

  在windows操作系统中,挂载通常是指给磁盘分区(包括被虚拟出来的磁盘分区)分配一个盘符。这个操作可以通过“计算机管理”中的“磁盘管理”来进行。如插入U盘系统自动分配给了它盘符,盘符就是挂载,退U盘的时候进行安全弹出,其实就是卸载unmount。

  如果我们现在插入了U盘,系统分配了新磁盘区sdb1,它现在还不属于/,我们可以在图形桌面系统中找到它,浏览管理里面的文件,但在命令行却不知怎么访问它的目录,比如无法使用cd或者ls。也无法在编程时指定一个目录对它操作。我们需要将它挂载到linux目录树下的某个文件目录下,之后我们访问它,如我们使用mount /dev/sdb1 ~/Share/,将新硬盘的区sdb1挂载到工作目录下的/Share/文件夹下,之后访问这个/Share/文件夹就相当于访问这个硬盘2的sdb1分区了。对/Share/的任何操作,都相当于对sdb1里文件的操作。所以Linux下,mount挂载的作用,就是将一个设备(通常是存储设备)挂接到一个已存在的目录上。访问这个目录就是访问该存储设备。

  linux操作系统将所有的设备都看作文件,它将整个计算机的资源都整合成一个大的文件目录。我们要访问存储设备中的文件,必须将文件所在的分区挂载到一个已存在的目录上,然后通过访问这个目录来访问存储设备。挂载就是把设备放在一个目录下,让系统知道怎么管理这个设备里的文件,了解这个存储设备的可读写特性之类的过程。

  /dev是一个目录,然而/dev/sdb1它不是一个目录,是一个类似指针的东西,指向这个分区的原始数据块。mount前,系统并不知道这个数据块哪部分数据代表文件,如何对它们操作。另外,插入CD,系统其实自动执行了 mount /dev/cdrom /media/cdrom。所以可以直接在/media/cdrom中对CD中的内容进行管理。

  使用命令进行挂载,语法:mount [-t fs-type] [-o option] device mountpoint,fs-type为文件系统类型,device为要挂载的文件系统所在的存储设备名,mountpoint为文件系统挂载到的linux目录树上的位置,-o的参数这里暂时不予给出,等用到的时候在给出。

1
2
mount -t vfat /dev/sda1 /mnt/disk1
mount -t vfat -o iocharset = cp635 /dev/sda1 /mnt/disk1

常用的磁盘操作命令

  1. fdisk磁盘分区:fdisk为磁盘分区命令,用来进行创建分区、删除分区和查看分区等操作,分区管理是一项较危险的操作,建议执行前先备份数据;关于查看现有磁盘设备系统分区的命令为fdisk [-l][device],l即为列出系统的分区类型,若不指定设备,则列出系统所有已识别的存储设备;
  2. du磁盘统计:du命令用于统计目录的磁盘使用情况,语法为:du [-a] directoryname
  3. df磁盘空间统计:df命令用于统计文件系统中未使用的磁盘空间,语法为:df -[ahil],a为显示所有文件系统的信息,包括swap和proc;h是以最合适的容量单位显示;i为显示文件文件节点数的使用情况而不是文件块的使用情况,l为显示本地文件系统的使用情况,不加参数,会显示所有以挂载的文件系统的磁盘空间使用情况。

Shell

  • shell的功能:第一个是作为命令解释器,第二个是作为一种高级程序设计语言,它几乎拥有高级程序设计语言所需的所有元素,包括变量名、关键字、各种控制语句,并拥有自己的语法结构;shell类似于DOS/Windows下的批处理,但是他比批处理要强大;

  • 第一个shell程序:vim test7,然后输入以下命令,之后执行sh test7即可成功执行该shell脚本,它能显示当前目录文件,显示日历,及当前在线用户清单;

    1
    2
    3
    ls -l
    cal
    who

  • shell脚本的执行方式:这里有三种常用执行方式:

    1. 输入重定向,格式为sh < 脚本名,它即是使用输入重定向让shell从给定文件中读入命令并进行相应处理;

    2. 以脚本名作为shell参数的执行方式,执行方式为sh 脚本名 [参数]

    3. 改为可执行权限后直接执行,方法如下:

      1
      2
      3
      4
      5
      chmod a+x test7
      ./test7
      # 还可以在修改执行权限之后,将其放在命令搜索路径的目录之下
      cp test7 /bin
      test7

  • 含有条件语句的shell脚本:

    1
    2
    3
    4
    5
    6
    7
    cat test7
    echo "type in the user name"
    read user
    if who|grep $user
    then echo "hello!$user!"|write $user
    else echo "$user has not logged in the system"
    fi

  • 多路选择的shell语句:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    cat test7
    echo 'key in number(1 - 10):'
    read a
    if ["$a" -lt 1 -o "$a" -gt 10]
    then echo "Error Number."
    exit
    elif [!"$a" -lt 5]
    then echo "It's not less 5."
    else echo "It's less 5."
    fi