Linux系统操作基础
Linux操作系统是一个多用户的操作系统;每一个用户需要使用对应的账号登录后才可以操作; 登录到Linux桌面系统可以找到终端并打开,部分操作系统可以使用< Ctrl+Alt+t > 快捷键直接打开终端;在终端窗口中按< Ctrl+Shift+t > 可以新建一个终端标签页,用Alt+数字编号 在每个终端标签页中切换.
快捷键
Tab 键可以在命令行中自动补全命令或路径上下方向键 或< Ctrl-p > 可以在命令历史中查找某个命令< ctrl-r > 可以反向搜索历史命令,可以多次按下该键在多个搜索结果中切换;
命令
-
whoami 查看当前用户使用的账号 -
clear 清除屏幕上的所有文字内容 -
iconv -f gb2312 -t utf-8 day01.txt > day01-utf-8.txt 该命令将gb2312编码的txt文件转换为utf-8编码的文件后存储到day01-utf-8.txt -
dos2unix file.txt 将file.txt由windows格式转换为unix格式 -
unix2dos file.txt 则完成相反的操作
文件系统
文件系统是操作系统中用来管理文件的部分,采用文件夹(目录)来表示一个分组;每个文件一定属于某个分组(代表分组的文件夹包含组中的所有文件); Linux文件系统有一个大分组包含其中所有文件, 和这个大分组对应的目录叫根目录, 用/ 表示.
文件系统中使用路径表示一个文件夹或文件的位置;文件系统中左右相邻的目录之间有父子关系,左边的叫父目录,右边的叫子目录;
- 以根目录为开始位置编写的路径叫绝对路径,绝对路径一定以
/ 开头; - 以非
/ 为开始位置编写的路径叫相对路径,相对路径中使用.. 表示后退一步;使用. 表示原地踏步;
终端窗口的当前工作目录表示相对路径的起点;
Linux文件系统为每个账号保留一个主目录,使用~ 表示,每次启动终端窗口后默认工作目录就是当前账号的宿主目录:
一个用户如果没有对应的用户主目录就无法登录到图形界面,只能登录终端窗口.
-
usermod 命令可以修改用户名和主目录 usermod -l newname -s /bin/bash -m -d /home/newname oldname userdel -r loginname 可以删除用户及其主目录 -
pwd 命令可以查看当前工作目录 -
cd 命令可以更改当前目录的位置change directory
cd 新的路径名 可以切换到新的目录cd 不加任何参数会直接切换到用户主目录.cd - 可以切换到上一次所在的目录. -
ls 可以查看任何目录中的内容
-a 选项可以查看目录中所有内容-l 选项可以查看每个内容的详细信息-a 选项和-l 选项可以合并成-al -
mkdir 可以创建新的目录;
- 要求新目录原来还不存在但是它的父目录必须存在;
-p 选项可以把路径中所有还不存在的目录都创建出来; -
rmdir 可以删除一个已经存在的空目录,目录必须是空的; -
rm 可以用来删除文件或目录
-r recursive递归操作-i interactive每一个删除要求用户确认-f force强制删除,不需要用户确认-v verbose冗长显示,explain what is being done.rm -rf 目录名或文件名 可以删除一个不为空的目录及其目录下的所有内容; -
cp 把一个已经存在的文件或目录拷贝一份放在另外的地方
-d 保持源文件的属性,对链接文件会复制链接而不是复制一个新的实体-f 强制执行,如果目标已经存在则会覆盖-i 覆盖之前要求用户确认-n no clobber,如果目标已存在则不覆盖-r 递归操作,对拷贝的目录及其子目录递归操作-v verbose冗长显示 -
mv 把一个已经存在的文件或目录移动到另一个地方,或更改名字
-f 强制执行,如果目标已经存在则会覆盖-i 覆盖之前要求用户确认-n no clobber,如果目标已存在则不覆盖-v 冗长显示,显示进行了哪些操作
对cp和mv命令而言,如果操作的源文件是文件名, 当目标是一个目录时则结果文件名保持不变只是复制文件或移动文件的位置, 当目标是一个路径后加上一个文件名,文件名可以与原来的相同此时文件名可以省略,如果文件名不同则表示复制为一个新的文件名或移动到一个新的位置并更改文件名.
-
history 列出使用命令的历史,在数字编号前加! 可以执行对应编号的命令; -
grep 过滤文本中符合条件的字符串
-i 或 --ignore-case 选项忽略字符大小写的差别;-r 或 --recursive 递归处理,当指定要查找的是目录而非文件时,必须使用这项参数;-n 或 --line-number 在显示符合样式的那一行之前,标示出该行的列数编号; -
tar 对多个文件或文件夹进行打包,并可以再对打包结果进行压缩处理;
-z 选项对应*.gz 文件,-j 对应*.bz2 文件,-J 对应*.xz 文件.-c 表示创建create-x 表示extract解压缩-v 表示verbose冗长显示-f 表示对文件操作-C dir可以在解压缩时解压到dir目录
在Linux系统中对文件进行压缩处理可以使用如下命令 tar -zcvf 压缩文件名.tar.gz 路径1 路径2 ... 解压缩可以采用如下命令 tar -zxvf 压缩文件名.tar.gz
LC_TIME=zh_CN.UTF-8
此时运行date命令
2015年 07月 06日 星期一 13:49:19 CST
然后执行export命令设置环境变量
export LANG="en"
再次运行date命令
Mon Jul 6 13:50:32 CST 2015
如果系统安装时选择中文系统,在运行man命令查看帮助信息时看到的可能会是翻译拗口的中文,可以用export命令临时设置语言环境再用man命令;
export LANG="en"
man date
mount 命令可以将系统所有已经加载的分区数据列出来;
mount -a 会根据/etc/fstab 的内容将所有相关磁盘挂载;
vi 文本编辑器
vi 文本编辑器只能在终端窗口中使用,而其他工具一般是在桌面上使用的,在进行终端操作时只能选用vi编辑器; vi可以完成各种编辑操作,但是只能用键盘操作;
工作模式
vi有三种工作模式,一种工作模式对应一组命令
- 正常模式 可以执行简单命令(由少数字母构成的命令),打开vi后的默认模式;
- 插入模式 可以修改文档内容,除
Esc 键之外都可以作为字符输入键; - 底行模式 可以输入复杂命令;
各种工作模式之间是可以相互切换的
- 在正常模式下输入
i 可以切换到插入模式 - 在正常模式下输入
: 可以切换到底行模式 - 在任何时候可以使用键盘左上角的
Esc 键切换到正常模式 - 插入模式和底行模式是不可以直接切换的
启动退出
在命令行中使用如下命令可以启动vi
vi filename 如果filename不存在则创建,如果已存在则直接打开vi filename +20 打开文件filename并将光标定定位到第20行; 每次进入vi后的初始模式都是正常模式
退出vi可以采用如下两种办法
- 在底行模式下输入
q! 可以不保存文档中的修改直接退出 - 在底行模式下输入
wq 或x 可以先保存所有修改然后退出 底行模式下输入w 可以保存文档的修改而不退出vi
移动跳转
文档内快速跳转
-
gg //文档开头 -
G //文档尾 -
100G //第100行 -
:100 //第100行 -
Ctrl+f //向前翻页 -
Ctrl+b //向后翻页 -
w //下一个单词的开头 -
e //下一个单词的结尾 -
b //上一个单词的开头 -
f 搜索移动
fa //到下一个a处3fa //到当前行的第3个a处;F //方向相反
替换转换
-
文档内容替换
:%s/old/new/gc //替换全文(%s),全行(g)的old为new并要求用户确认?:10,100s/old/new/gc //替换第10到第100行的全行的old为new并要求用户确认 -
大小写转换
gU //转大写gu //转小写~ //大小写切换
复制粘贴
vi中自带剪贴板,可以作为文字信息的中转站
- 在正常模式下使用
nyy 命令可以把当前光标及下面的n行 拷贝到剪贴板上,其中n是一个数字,表示一共拷贝的行数; - 在正常模式下使用
np 命令可以把剪贴板上的内容在当前光标所在行的下面粘贴n次 ; - 在正常模式下使用
ndd 命令可以把当前光标所在行及下面的n行 剪切到剪贴板上,n是数字代表一共剪切的行数.
正常模式下
x 可以删除一个字符,u 可以撤销最近的编辑操作,Ctrl+r 可以恢复最近的操作
底行模式使用co 或m 实现复制copy和剪切move
- vi 复制第5行到第10行并粘贴到第12行之后
:5,10 co 12 - vi 剪切第5行到第10行并粘贴到第12行之后
:5,10 m 12
选择
区域选择 action a obj 或 action i obj
action 可以是任何的命令,如d 删除,y 复制,v 可视模式a 代表all ,包括obj ;i 是inner ,在obj 内部的;obj 可以是;
w 一个单词,W 一个以空格为分割的单词;s 一个句子;p 一个段落;- 特别的字符如
" ' ) } ] 等成对符号的右一半;
假如有一个字符串 (map (+) ("foo")) 此时,光标在第1个o上; - vi" 会选择foo - va" 会选择"foo" - vi) 会选择"foo" - va) 会选择(“foo”) - v2i) 会选择map (+) (“foo”) - v2a) 会选择(map (+) (“foo”))
块操作
块操作<ctrl-v> 典型操作 0 <ctrl-v> <move> I <string> <Esc> 以上步骤分别代表
0 移到行首,也可以移动到其他位置;<ctrl-v> 进入列选模式,<move> 移动选择,I 插入模式, A :追加模式<string> 编辑字符串,<Esc> 使每一行生效;
在所有被选择的行后面追加某个字符串
<ctrl-v> - 选中相关的行;
- 按
$ 到行尾; - 按
A ,输入字符串; - 按
<Esc> 使每一行生效;
按v 可以进入可视模式,移动光标可以选择内容,然后按y 可以拷贝选中内容,按p 可以粘贴缓冲区内容到当前光标之后.
按Ctrl+v 可以上下移动光标进行列选,然后按I 进入行首插入模式,编辑完成按两次Esc .
按Shift+v 可以上下移动光标进行块选,然后按= 可以对文档内容进行格式化缩进.
其他命令
改变文档显示字体大小
<Ctrl Shift +> 可以增大文件字体;<Ctrl Shift -> 可以减小文件字体;
重复命令
. 可以重复上一次命令;N<cmd> 可以重复某个命令N次 ;
宏录制
qa 操作序列 q 录制
@a 或@@ 回放
@a 会replay存放在寄存器a 中的录制宏;@@ 是用来操作最新录制宏的快捷键;
示例 在一个只有一行且这一行只有1的文本中,键入以下命令;
qaYp <ctrl-a> q
qa 开始录制;Yp 复制一行;<ctrl-a> 增加1 ;q 停止录制; @a 在1下面写2;100@@ 创建新的100行;会把数据增加到102;
多文件编辑
打开一个文件后,在正常模式下执行
- 打开
:new 文件名 :vi filename :sp filename :vs filename
其中sp 代表split创建分屏;将窗口分割为上下排列的窗口; vs 代表vsplit,创建垂直分屏,将窗口分割为左右排列的窗口; <ctrl-w> 加方向键可以将光标在各个窗口中切换; <ctrl-w>+ 或<ctrl-w>- 可以增大或减小窗口;
- 切换
:e# 上一个文件:bn 下一个文件next:bp 上一个文件previousctrl+^ 在当前文件和上一个文件间转换 - 关闭
执行外部命令
在底行模式下可以加一个! 执行shell命令
:!ls 执行ls命令:r!ls 将执行ls命令的结果嵌入到正在编辑的文档内
设置
设置命令可以扩展vi的功能,设置命令是在底行模式下使用set 命令实现的;
set nu 显示行号;set nonu 取消显示行号;
设置命令在底行模式下输入
~/.vimrc 文件可以记录各种set 命令,每次vi 启动的时候都会从这个文件中读取所有set命令并按顺序执行.
一个简单的vimrc配置文件示例
"" ---------.vimrc----------------
set fileencodings=usc-bom,utf-8,GB18030,gbk,big5
set nu
"" the general indentation setting
set tabstop=4
set shiftwidth=4
set softtabstop=4
" set expandtab
set noautoindent
"" match and display for searching
set ignorecase
set smartcase
set incsearch
set nohlsearch
" set nowrapscan
" match parenthethese
set showmatch
set matchtime=5
set magic
set autoread
"" scroll off board below or above
set scrolloff=9
"" Use Vim defaults instead of 100% vi compatibility
set nocompatible
set laststatus=2
set statusline=[%n]\ %F%m%r%h\ %=%{&encoding}\ %l,%c\ %p%%\ %L\
syntax reset
syntax on
filetype plugin indent on
if has("autocmd")
""" This autocommand jumps to the last known position in a file
""" just after opening it, please verify the permission of ~/.viminfo
""" Or just rm ~/.viminfo use: sudo rm ~/.viminfo
au BufReadPost * if line("'\"") > 0 && line("'\"") <= line("$") | exe "normal! g`\"" | endif
endif
if !exists("autocommands_loaded")
let autocommands_loaded = 1
"" set for shell
au BufEnter,BufNewFile,BufRead *.sh set tabstop=4 softtabstop=4 shiftwidth=4 expandtab
"" set for python
au BufEnter,BufNewFile,BufRead *.py set tabstop=4 softtabstop=4 shiftwidth=4 expandtab
" au FileType python set tabstop=4 softtabstop=4 shiftwidth=4 expandtab
"" set for .c/.h/.cpp/.hpp
au BufEnter,BufNewFile,BufRead *.[ch],*.[ch]pp set tabstop=4 softtabstop=4 shiftwidth=4 expandtab
endif
gVim是Windows操作系统下的vi,打开后切换到底行模式打开新文件:vi filename
删除/* 和*/ 注释的语句的正则表达式
用%s/pattern/new/gc ; 其中/ 是分隔符,也可以换用其他任何字符,如# ; 关键是如何书写正确的pattern正则表达式,考虑到* 是正则表达式中的元字符,因此在设计时,先用x 代替,然后再替换回* ; 参考《精通正则表达式》 对/x string x/ 类型的匹配采用如下模式 [opening normal* (special normal*)* closing]
现根据/x string x/来设计正则表达式
opening /x
normal* [^x]*x+
special [^/x]
closing x/
因此得出/x string */正则表达式为
/x[^x]*x+([^/x][^x]*x+)*/
将所有的x替换为*,并考虑到*为元字符,需要适用\转义,得
/\*[^*]*\*+([^/*][^*]*\*+)*/
还要注意在正则表示使中/也需要转义,因此得到最终的/* string */的正则表达式
\/\*[^*]*\*+([^/*][^*]*\*+)*\/
然后使用awk的gsub函数处理即可
cat akari.c | awk 'BEGIN{RS=""}{gsub(/\/\*[^*]*\*+([^/*][^*]*\*+)*\//, " ", $0); print $0}'
链接文件
链接文件可以用来代表另外一个文件 ln 命令可以创建链接文件, 命令使用方法和cp 命令一样;
- 直接用ln命令创建出来的链接文件叫硬链接文件,可以独立于原文件而存在;相当于对某一块存储空间又取了一个名字;
- 使用
-s 选项可以创建软链接文件,软链接不能独立于原文件而存在,源文件消失则软链接文件变成无效连接文件;
如果用cp 命令复制一个链接文件时没有指定-d 选项,则会复制一份文件的实体; 在计算机中文件名和文件内容不是一回事,只是文件系统帮我们做了一个映射; 硬连接文件只是多了一个文件名,文件内容并没有增加一份; 软连接文件是多了一个新文件,文件内容记录了原始文件的位置,相当于快捷方式; cp 命令则是多了一个文件名和一份文件内容;
软连接和硬连接区别
- 硬连接只是取了一个别名,还指向同一块数据和inode,其他什么都没做,因此删除原文件后硬链接仍有效,直到删除原文件和所有的硬链接文件存储区域才会失效;
- 软连接是增加了一个文件,有自己的inode和数据块;记录某个实体文件的信息,因此删除原文件后软连接变成无效连接文件;
ln 使用帮助
ln [OPTION]... [-T] TARGET LINK_NAME (1st form)
ln [OPTION]... TARGET (2nd form)
ln [OPTION]... TARGET... DIRECTORY (3rd form)
ln [OPTION]... -t DIRECTORY TARGET... (4th form)
In the 1st form, create a link to TARGET with the name LINK_NAME.
In the 2nd form, create a link to TARGET in the current directory.
In the 3rd and 4th forms, create links to each TARGET in DIRECTORY.
-f //移除已存在的目标文件
-i //如果目标文件存在,则要求用户确认
ln -s /home/abc/def/jhi/tools /home/abc/tools
/home/abc/def/jhi/tools 可以是一个文件,也可以是一个目录 如果tools是一个目录,连接文件仍然是一个文件,使用rm tools 删除连接文件,不能使用rm tools/ 删除;
文件属性
由文件类型和代表文件权限的英文字母构成; 决定了文件可以怎么使用; 文件属性分成3组,每一组3个字母,针对一种特定的用户;
三种用户分别是 文件属主user 属组group 其他人others ; 每组属性包含3个字母,第一个字母表示是否可读,第二个字母表示是否可写,第三个字母表示是否可执行;
- 字母
r 表示可以读, - 字母
w 表示可以写, - 字母
x 表示可以执行, - 字母
- 表示没有对应权限;
每一组的三个字母可以使用0~7 之间到八进制数表示(r对应4,w对应2,x对应1);
相关命令
进程基本概念
在早期面向进程设计的计算机结构中,进程是程序的基本执行实体; 在当代面向线程设计的计算机结构中,进程是线程的容器.
- Shell脚本是含多个可执行命令的文件,可以用来自动化的完成各种繁琐的工作;
- 脚本语言不同于编译程序的语言,脚本不需要编译即可执行,在执行时由特定的解释器逐行解释执行,Shell脚本一行出错并不会影响后面的语句执行;
- C/C++等属于编译型语言,需要编译后才可以执行,一行出错会影响整个程序的执行;
- 程序是计算机中的一个文件,程序的内容不会随着时间而改变;
- 进程是根据程序创建出来的一段数据,进程会随着时间变化,用户真正使用的是进程而不是程序;
操作系统为每个进程分配了一个整数作为进程ID即PID,不同进程的ID不同;
相关命令
ps 命令可以查看当前终端窗口中的进程;
-ef 选项或-aux 选项可以查看系统中的所有进程-ef 选项兼容Unix 系统; kill 命令可以给进程发信号;
kill -l 可以查看所有的信号列表kill -signal PID 给进程号为PID 的进程发送signal 信号;-1 选项可以先挂起当前进程,结束子进程,再返回关闭当前进程并处理善后;-9 选项可以强制结束一个进程;Ctrl+c 可以把当前终端窗口的前台进程结束掉(实际是发送了信号2);
重定向
输入重定向可以让程序从文件中得到需要的信息,输入重定向使用 < 实现; 输出重定向可以让本来输出到终端标准输出窗口的内容输出到文件,在命令的最后使用> 号可以实现输出重定向的效果;
- 使用
> 实现输出重定向会把文件中原有内容覆盖掉; - 使用
>> 实现输出重定向会把新内容追加到原有文件的后面;
管道
linux系统中可以使用管道把多个命令串联成一条直线,前一个命令的输出作为后一个命令的输入;管道使用一个| 符号使用;
ls | grep *.txt ls 命令的输出结果直接作为grep 命令的输入
分离输出命令tee
tee [OPTION] [FILE]
Copy standard input to each FILE, and also to standard output;
tee 命令后面可以跟多个文件名
ls -a |tee -a list.txt 系统会执行ls -a 命令,把结果显示在屏幕上,同时以追加方式输出到文件list.txt 中
通配符
在命令中使用通配符编写路径可以用一个路径代表多个实际路径;
? 是一个通配符,可以用来代表 单个 任意字符
ls test.? 可以显示test.c ,test.h * 是一个通配符,可以用来代表 任意多个 任意字符
ls test.* 可以显示test.c ,test.h ,test.cpp ,test.txt 等
|