日期: 2015年9月15日
一、实验的目的与要求
熟练地使用 Linux,本实验介绍 Linux 基本操作,shell 环境下的常用命令。
二、主要内容
认真看过这篇linux系统简介文章,对于这样一个免费、高效的操作系统有了一个初步的认识。希望能在本学期对于linux操作系统有很好的认识和操作,使用。 同时,对于新认识的一些历史中开发和修复各个操作系统的前辈表示深深地敬佩。
2.
基本概念及操作主要过程:
按键 | 作用 |
---|---|
Ctrl+d |
键盘输入结束或退出终端 |
Ctrl+s |
暂定当前程序,暂停后按下任意键恢复运行 |
Ctrl+z |
将当前程序放到后台运行,恢复到前台为命令fg |
Ctrl+a |
将光标移至输入行头,相当于Home 键 |
Ctrl+e |
将光标移至输入行末,相当于End 键 |
Ctrl+k |
删除从光标所在位置到行末 |
Alt+Backspace |
向前删除一个单词 |
Shift+PgUp |
将终端显示向上滚动 |
Shift+PgDn |
将终端显示向下滚动 |
Shell 常用通配符:
字符 | 含义 |
---|---|
* |
匹配 0 或多个字符 |
? |
匹配任意一个字符 |
[list] |
匹配 list 中的任意单一字符 |
[!list] |
匹配 除list 中的任意单一字符以外的字符 |
[c1-c2] |
匹配 c1-c2 中的任意单一字符 如:[0-9] [a-z] |
{string1,string2,...} |
匹配 sring1 或 string2 (或更多)其一字符串 |
{c2..c2} |
匹配 c1-c2 中全部字符 如{1..10} |
man 手册区段 | 说明 |
---|---|
1 | 一般命令 |
2 | 系统调用 |
3 | 库函数,涵盖了C标准函数库 |
4 | 特殊文件(通常是/dev中的设备)和驱动程序 |
5 | 文件格式和约定 |
6 | 游戏和屏保 |
7 | 杂项 |
8 | 系统管理命令和守护进程 |
$ sudo apt-get update;sudo apt-get install sysvbanner toilet figlet
$ banner feels good
$ toilet feels good
$ figlet feels good
(1)查看用户
who [options] [files]
参数 | 说明 |
---|---|
-a |
打印能打印的全部 |
-d |
打印死掉的进程 |
-m |
同am i ,mom likes |
-q |
打印当前登录用户数及用户名 |
-u |
打印当前登录用户登录信息 |
-r |
打印运行等级 |
(2)创建用户
sudo adduser 【name】
指令:adduser = add user
add :添加
(3)用户组
方法一:使用groups命令
例子:groups shiyanlou
方法二:查看/etc/group文件
例子:cat /etc/group | sort
注:如需要命令过滤则 cat /etc/group | grep -E "shiyanlou|sudo"
etc/group 文件格式说明
(4)将其它用户加入 sudo 用户组
例子:sudo usermod -G sudo lilei
指令: usermod = user mod
user : 用户
mod : 模型
(5)删除用户
例子:sudo deluser lilei --remove-home
指令: deluser = del user、 remove
del user :删除用户
remove:删除
(6)查看文件权限
$ ls -AsSh
查看某一个目录的完整属性,而不是显示目录里面的文件属性:$ ls -dl <目录名>
(7)修改文件权限:
Linux 是以树形目录结构的形式来构建整个系统的,可以理解为一个用户可操作系统的骨架。虽然本质上无论是目录结构还是操作系统内核都是存储在磁盘上的,但从逻辑上来说 Linux 的磁盘是“挂在”(挂载在)目录上的,每一个目录不仅能使用本地磁盘分区的文件系统,也可以使用网络上的文件系统。
1.FHS 标准(英文:Filesystem Hierarchy Standard 中文:文件系统层次结构标准)
FHS 定义了系统中每个区域的用途、所需要的最小构成的文件和目录同时还给出了例外处理与矛盾处理。
FHS 定义了两层规范,第一层是, / 下面的各个目录应该要放什么文件数据,例如 /etc 应该要放置设置文件,/bin 与 /sbin 则应该要放置可执行文件等等。
第二层则是针对 /usr 及 /var 这两个目录的子目录来定义。例如 /var/log 放置系统登录文件、/usr/share 放置共享数据等等。
2.目录路径
路径
使用 cd 命令可以切换目录,在 Linux 里面使用 . 表示当前目录,.. 表示上一级目录, - 表示上一次所在目录,~ 通常表示当前用户的"home"目录。使用 pwd 命令可以获取当前所在路径(绝对路径)。
(注意,以 . 开头的文件都是隐藏文件,所以这两个目录必然也是隐藏的,你可以使用 ls -a 命令查看隐藏文件)
绝对路径:以根"/"目录为起点的完整路径,以你所要到的目录为终点,表现形式如: /usr/local/bin
相对路径:相对路径,也就是相对于你当前的目录的路径,相对路径是以当前目录 . 为起点,以你所要到的目录为终点,表现形式如: usr/local/bin (这里假设你当前目录为根目录)。
提示:在进行目录切换的过程中请多使用 Tab 键自动补全,可避免输入错误,连续按两次Tab可以显示全部候选结果
1.新建空白文件
使用 touch 命令创建空白文件,关于 touch 命令,其主要是来更改已有文件的时间戳的,但其在不加任何参数的情况下,只指定一个文件名,则可以创建一个为指定文件名的空白文件。
例子:touch test
新建目录
使用 mkdir(make directories)命令可以创建一个空目录,也可同时指定创建目录的权限属性。
使用 -p 参数,同时创建父目录(如果不存在该父目录),如下我们同时创建一个多级目录(这在有时候安装软件,配置安装路径时非常有用):mkdir -p father/son/grandson
2.复制文件
使用cp(copy)命令复制一个文件或目录到指定目录。
如:cp test father/son/grandson
复制目录
如果直接使用cp命令,复制一个目录的话,会出现如下错误:
要成功复制目录需要加上-r或者-R参数
如:cp -r father family
3.删除文件
使用rm(remove files or directories)命令,删除一个文件或目录;
如:rm test
有时候你会遇到想要删除一些为只读权限的文件,直接使用rm删除会显示一个提示,就需要用上参数 -f ;
如:rm -f test
删除目录
跟复制目录一样,要删除一个目录,也需要加上-r或-R参
如:rm -r family
4.移动文件与文件重命名
使用mv(move or rename files)命令,移动文件(剪切)。
格式:mv 源目录文件 目的目录
如:mv file1 Documents
重命名文件
格式:mv 旧的文件名 新的文件名
如:mv file1 myfile
5.查看文件
标准输入输出:当我们执行一个 shell 命令行时通常会自动打开三个标准文件,即标准输入文件(stdin),默认对应终端的键盘; 标准输出文件(stdout)和标准错误输出文件(stderr),这两个文件都对应被重定向到终端的屏幕,以便我们能直接看到输出内容。进程将从标准输入文件中得到输入数据,将正常输出数据输出到标准输出文件,而将错误信息送到标准错误文件中。
6.查看文件类型
如:file /bin/ls
7.编辑文件
Linux和Windows都用vim+gcc
#定义变量 declare $变量名 #或者直接赋值也自动定义变量,注意变量之前不带"$" 变量名=值 #打印变量的值,"$"代表引用变量的值 echo $变量名
在所有的 UNIX 和类 UNIX 系统中,每个进程都有其各自的环境变量设置,且默认情况下,当一个进程被创建时,处理创建过程中明确指定的话,它将继承其父进程的绝大部分环境设置。
通常我们会涉及到的环境变量有三种:
输出环境变量set
| 显示当前 Shell 所有环境变量,包括其内建环境变量(与 Shell 外观等相关),用户自定义变量及导出的环境变量env
| 显示与当前用户相关的环境变量,还可以让命令在指定环境中运行export
| 显示从 Shell 中导出成环境变量的变量,也能通过它将自定义变量导出为环境变量#将普通变量输出为环境变量,能被子进程继承 export 变量名
#比较文件的命令 vimdiff 1.txt 2.txt 3.txt ....
PATH环境变量设置命令搜索路径
#输出当前命令搜索路径的设置 echo $PATH #./程序名 表示执行当前目录下的指定程序
PATH=$PATH:/home/shiyanlou/Code
如果永久添加需要修改配置文件 zsh是.zshrc bash是.bashrc 本次修改用户目录下的文件
$ echo "PATH=$PATH:/home/shiyanlou/mybin" >> .zshrc
变量的修改有以下几种方式:
变量设置方式 | 说明 |
---|---|
{变量名#匹配字串} |
从头向后开始匹配,删除符合匹配字串的最短数据 |
{变量名##匹配字串} |
从头向后开始匹配,删除符合匹配字串的最长数据 |
{变量名%匹配字串} |
从尾向前开始匹配,删除符合匹配字串的最短数据 |
{变量名%%匹配字串} |
从尾向前开始匹配,删除符合匹配字串的最长数据 |
{变量名/旧的字串/新的字串} |
将符合旧字串的第一个字串替换为新的字串 |
{变量名//旧的字串/新的字串} |
将符合旧字串的全部字串替换为新的字串 |
可以使用unset
命令删除一个环境变量:
unset temp
source .zshrc
或者
. ./.zshrc
注意第二种方式必须指定完整的绝对或相对路径
与搜索相关的命令常用的有如下几个whereis
,which
,find
,locate
。
whereis
只能搜索二进制文件(-b),man帮助文件(-m)和源代码文件(-s)。locate,
通过"/var/lib/mlocate/mlocate.db"数据库查找,系统会使用定时任务每天自动执行updatedb
命令更新一次该数据库,有时需要手动执行一次updatedb
命令将新的文件数据添加进数据库,它可以用来查找指定目录下的不同文件类型,可以递归子目录进行查找,如查找 /etc 下所有以 sh 开头的文件:$ locate /etc/sh $ locate /home/shiyanlou/Code/\*.txt
经测试好像locate 后面要跟绝对路径,另外""必须用\来转义
-c 是仅统计数目 -i 是不区分大小写
which
它只从PATH
环境变量指定的路径中去搜索命令
which man
#查找系统中所有文件名中含D且在第三位的.txt文件 find / -name \?\?D\*.txt #显示结果含有权限不够的信息,可以如下屏蔽 find / -name \?\?D\*.txt 2>/dev/null #还可以加sudo执行 #另外,文件名加引号,可以直接用?或*,不用转义
#查找大小在10k-20k之间的*.txt find / -name '*.txt' -size +10k -size -20k
#查找空目录和空文件
find . -empty #查找实验楼组的文件 find . -group shiyanlou #在/tmp目录中查找大于100000000字节并且在48小时内修改的某个文件 find /tmp -size +10000000c -and -mtime +2 #在/tmp目录中查找所有不属于panda的文件 find /tmp ! -user panda #查找属于shiyanlou用户的文件并显示文件信息 find . -user shiyanlou -ls #删除找到的*.txt find . -name '*.txt' -exec rm {} \; #以上 \; 是为了转义;字符
*.bz2 bzip2程序压缩的文件
-c:创建一个tar包文件
-f:指定创建的文件名
-v:非安静模式
tar -cf shiyanlou.tar ~
-x:解压一个tar
-C:解压到指定路径的已存在目录
tar -xf xx.tar -C 目录
-t:只查看不解包
tar -tf xx.rar
-p:保存文件属性
-h保存设备连接指向的源文件
tar -cphf xx.tar 要压缩目录
-z:.tar.gz
-J:tar.xz
-j:tar.bz2
install libaa-bin
install aafire
aafire
$ cd .. #进入上一级目录 $ cd ~ #进入home目录 $ pwd #查看当前目录 $ cd /usr/local/bin #绝对目录 $ cd ../../usr/local/bin #相对目录
$ touch test #新建一个test空白文件 $ mkdir mydir #新建一个mydir空目录 $ mkdir -p father/son/grandson #使用-p同时创建一个多级目录
$ cp test father/son/grandson #将test文件复制到/home/shiyanlou/father/son/grandson目录中 $ mkdir family $ cp -r father family #将father目录里的所有包含子目录,复制到family
$ rm test #删除test文件 $ rm -f test #强制删除test文件 $ rm -r family #删除family目录
mv 源目录文件 目的目录文件
$ mkdir Documents $ touch file1 $ mv file1 Documents #将file1移动到Documents目录
重命名 mv 旧的文件名 新文件名
$ mv file1 myfile #将file1重命名为myfile
$ touch file{1..5}.txt #使用通配符创建五个文件 $ rename 's/\.txt/\.c/' *.txt #将五个后缀 .txt 重命名 .c 为后缀 $ rename 'y/a-z/A-Z/' *.c #批量将五个文件的文件名大写
使用cat(正序) 、tac(倒序) 、nl命令查看文件,
$ cp /etc/passwd . #从etc目录下拷贝passwd文件
$ cat -n passwd #打印passwd内容,-n显示行号
$ head /etc/passwd #head显示头十行
$ tail /etc/passwd #tail 显示尾十行
$ head -n 1 /etc/passwd #只显示第一行
$ tail -n 1 etc/passwd #只显示最后一行
$ file /bin/ls
-例如$ touch test;echo "hehe" >> test;cat test
$ echo $?
$ [order1] && [oder2] #当[order1]的返回值==0,执行[order2]
$ [order1] || [orser2] #当[order1]的返回值!=0,执行[order2]
$ cut /etc/passwd -d ':' -f 1,6
# 前五个(包含第五个) $ cut /etc/passwd -c -5
# 前五个之后的(包含第五个) $ cut /etc/passwd -c 5-
# 第五个 $ cut /etc/passwd -c 5
# 2到5之间的(包含第五个) $ cut /etc/passwd -c 2-5
grep命令的一般形式为:
grep [命令选项]... 用于匹配的表达式 [文件]...
$ grep -rnI "shiyanlou" ~
-r 参数表示递归搜索子目录中的文件,-n表示打印匹配项行号,-I表示忽略二进制文件。$ export | grep ".*yanlou$"
其中$就表示一行的末尾。wc 命令用于统计并输出一个文件中行、单词和字节的数目,比如输出/etc/passwd文件的统计信息:
$ wc /etc/passwd
# 行数 $ wc -l /etc/passwd
# 单词数 $ wc -w /etc/passwd
# 字节数 $ wc -c /etc/passwd
# 字符数 $ wc -m /etc/passwd
# 最长行字节数 $ wc -L /etc/passwd
$ cat /etc/passswd | sort
$ cat /etc/passwd | sort -r
$ cat /etc/passwd | sort -t':' -k 3
上面的-t参数用于指定字段的分隔符,这里是以":"作为分隔符;-k 字段号用于指定对哪一个字段进行排序$ history | cut -c 8- | cut -d ' ' -f 1 | sort | uniq #因为uniq命令只能去连续重复的行,不是全文去重所以加上sort效果更佳
$ tr [option]...SET1 [SET2]
$ echo 'hello shiyanlou' | tr -d 'olh'
$ echo 'hello' | tr -s 'l'
'[:lower:]' '[:upper:]'你也可以简单的写作'[a-z]' '[A-Z]',当然反过来将大写变小写也是可以的`
$ col [option]
$ cat -A /etc/protocols
$ cat /etc/protocols | col -x | cat -A
$ join [option]... file1 file2
paste这个命令与join 命令类似,它是在不对比数据的情况下,简单地将多个文件合并一起,以Tab隔开。
使用方式:
$ paste [option] file...
$ echo hello > file1
$ echo shiyanlou > file2
$ echo www.shiyanlou.com > file3
$ paste -d ':' file1 file2 file3
$ paste -s file1 file2 file3
1、#从dos 到unix文本格式转换
$ cat -A [dos] | tr -d '^M' | cat -A [dos]
-
2、sudo apt-get install ninvaders
Linux 默认提供了三个特殊设备,用于终端的显示和输出,分别为
stdin(标准输入,对应于你在终端的输入)
stdout(标准输出,对应于终端的输出)
stderr(标准错误输出,对应于终端的输出)
PS管道默认是连接前一个命令的输出到下一个命令的输入,而重定向通常是需要一个文件来建立两个命令的连接
-标准输出和标准错误都被指向伪终端的屏幕显示,所以我们经常看到的一个命令的输出通常是同时包含了标准输出和标准错误的结果的。
隐藏某些错误或者警告
# 将标准错误重定向到标准输出,再将标准输出重定向到文件,注意要将重定向到文件写到前面
$ cat Documents/test.c\~ hello.c >somefile 2>&1
# 或者只用bash提供的特殊的重定向符号"&"将标准错误和标准输出同时重定向到文件
$ cat Documents/test.c\~ hello.c &>somefilehell
-除了将需要将输出重定向到文件之外也需要将信息打印在终端$ echo 'hello shiyanlou' | tee hello
-使用exec命令实现“永久”重定向# 先开启一个子 Shell
$ zsh
# 使用exec替换当前进程的重定向,将标准输出重定向到一个文件
$ exec 1>somefile
# 后面你执行的命令的输出都将被重定向到文件中,直到你退出当前子shell,或取消exec的重定向(后面将告诉你怎么做)
$ ls
$ exit
$ cat somefile
-默认在 Shell 中可以有9个打开的文件描述符,上面我们使用了也是它默认提供的0,1,2号文件描述符
使用exec命令可以创建新的文件描述符:
$ zsh
$ exec 3>somefile
# 先进入目录,再查看,否则你可能不能得到正确的结果,然后再回到上一次的目录
$ cd /dev/fd/;ls -Al;cd -
# 注意下面的命令>与&之间不应该有空格,如果有空格则会出错
$ echo "this is test" >&3
$ cat somefile
$ exit
-如上面我们打开的3号文件描述符,可以使用如下操作将它关闭:$ exec 3>&-
$ cd /dev/fd;ls -Al;cd -
-在 Linux 中有一个被成为“黑洞”的设备文件,所以导入它的数据都将被“吞噬”。/dev/null,或称空设备,是一个特殊的设备文件,它通常被用于丢弃不需要的输出流,或作为用于输入流的空文件,这些操作通常由重定向完成。读取它则会立即得到一个EOF。
我们可以利用设个/dev/null屏蔽命令的输出:
$ cat Documents/test.c\~ nefile 1>/dev/null 2>&1
-xargs 是一条 UNIX 和类 UNIX 操作系统的常用命令。它的作用是将参数列表转换成小块分段传递给其他命令,以避免参数列表过长的问题。 这个命令在有些时候十分有用,特别是当用来处理产生大量输出结果的命令如 find,locate 和 grep 的结果,详细用法请参看 man 文档。$ cut -d: -f1 < /etc/passwd | sort | xargs echo
$ sudo apt-get install caca-utils
$ cacaview <pic_file>
$ cacademo
$ cacafire
Linux 默认提供了三个特殊设备,用于终端的显示和输出,分别为
stdin(标准输入,对应于你在终端的输入)
stdout(标准输出,对应于终端的输出)
stderr(标准错误输出,对应于终端的输出)
PS管道默认是连接前一个命令的输出到下一个命令的输入,而重定向通常是需要一个文件来建立两个命令的连接
-标准输出和标准错误都被指向伪终端的屏幕显示,所以我们经常看到的一个命令的输出通常是同时包含了标准输出和标准错误的结果的。
# 将标准错误重定向到标准输出,再将标准输出重定向到文件,注意要将重定向到文件写到前面
$ cat Documents/test.c\~ hello.c >somefile 2>&1
# 或者只用bash提供的特殊的重定向符号"&"将标准错误和标准输出同时重定向到文件
$ cat Documents/test.c\~ hello.c &>somefilehell
-除了将需要将输出重定向到文件之外也需要将信息打印在终端$ echo 'hello shiyanlou' | tee hello
-使用exec命令实现“永久”重定向(效果见附图)# 先开启一个子 Shell
$ zsh
# 使用exec替换当前进程的重定向,将标准输出重定向到一个文件
$ exec 1>somefile
# 后面你执行的命令的输出都将被重定向到文件中,直到你退出当前子shell,或取消exec的重定向(后面将告诉你怎么做)
$ ls
$ exit
$ cat somefile
-默认在 Shell 中可以有9个打开的文件描述符,上面我们使用了也是它默认提供的0,1,2号文件描述符
$ zsh
$ exec 3>somefile
# 先进入目录,再查看,否则你可能不能得到正确的结果,然后再回到上一次的目录
$ cd /dev/fd/;ls -Al;cd -
# 注意下面的命令>与&之间不应该有空格,如果有空格则会出错
$ echo "this is test" >&3
$ cat somefile
$ exit
-如上面我们打开的3号文件描述符,可以使用如下操作将它关闭:$ exec 3>&-
$ cd /dev/fd;ls -Al;cd -
-在 Linux 中有一个被成为“黑洞”的设备文件,所以导入它的数据都将被“吞噬”。/dev/null,或称空设备,是一个特殊的设备文件,它通常被用于丢弃不需要的输出流,或作为用于输入流的空文件,这些操作通常由重定向完成。读取它则会立即得到一个EOF。
$ cat Documents/test.c\~ nefile 1>/dev/null 2>&1
-xargs 是一条 UNIX 和类 UNIX 操作系统的常用命令。它的作用是将参数列表转换成小块分段传递给其他命令,以避免参数列表过长的问题。 这个命令在有些时候十分有用,特别是当用来处理产生大量输出结果的命令如 find,locate 和 grep 的结果,详细用法请参看 man 文档。$ cut -d: -f1 < /etc/passwd | sort | xargs echo
$ sudo apt-get install caca-utils
$ cacaview <pic_file>
$ cacademo
$ cacafire
stdin(标准输入,对应于你在终端的输入)
stdout(标准输出,对应于终端的输出)
stderr(标准错误输出,对应于终端的输出)
PS管道默认是连接前一个命令的输出到下一个命令的输入,而重定向通常是需要一个文件来建立两个命令的连接
-标准输出和标准错误都被指向伪终端的屏幕显示,所以我们经常看到的一个命令的输出通常是同时包含了标准输出和标准错误的结果的。
隐藏某些错误或者警告
# 将标准错误重定向到标准输出,再将标准输出重定向到文件,注意要将重定向到文件写到前面
$ cat Documents/test.c\~ hello.c >somefile 2>&1
# 或者只用bash提供的特殊的重定向符号"&"将标准错误和标准输出同时重定向到文件
$ cat Documents/test.c\~ hello.c &>somefilehell
-除了将需要将输出重定向到文件之外也需要将信息打印在终端$ echo 'hello shiyanlou' | tee hello
-使用exec命令实现“永久”重定向(效果见附图)# 先开启一个子 Shell
$ zsh
# 使用exec替换当前进程的重定向,将标准输出重定向到一个文件
$ exec 1>somefile
# 后面你执行的命令的输出都将被重定向到文件中,直到你退出当前子shell,或取消exec的重定向(后面将告诉你怎么做)
$ ls
$ exit
$ cat somefile
-默认在 Shell 中可以有9个打开的文件描述符,上面我们使用了也是它默认提供的0,1,2号文件描述符
使用exec命令可以创建新的文件描述符:
$ zsh
$ exec 3>somefile
# 先进入目录,再查看,否则你可能不能得到正确的结果,然后再回到上一次的目录
$ cd /dev/fd/;ls -Al;cd -
# 注意下面的命令>与&之间不应该有空格,如果有空格则会出错
$ echo "this is test" >&3
$ cat somefile
$ exit
-如上面我们打开的3号文件描述符,可以使用如下操作将它关闭:$ exec 3>&-
$ cd /dev/fd;ls -Al;cd -
-在 Linux 中有一个被成为“黑洞”的设备文件,所以导入它的数据都将被“吞噬”。/dev/null,或称空设备,是一个特殊的设备文件,它通常被用于丢弃不需要的输出流,或作为用于输入流的空文件,这些操作通常由重定向完成。读取它则会立即得到一个EOF。
我们可以利用设个/dev/null屏蔽命令的输出:
$ cat Documents/test.c\~ nefile 1>/dev/null 2>&1
-xargs 是一条 UNIX 和类 UNIX 操作系统的常用命令。它的作用是将参数列表转换成小块分段传递给其他命令,以避免参数列表过长的问题。 这个命令在有些时候十分有用,特别是当用来处理产生大量输出结果的命令如 find,locate 和 grep 的结果,详细用法请参看 man 文档。$ cut -d: -f1 < /etc/passwd | sort | xargs echo
$ sudo apt-get install caca-utils
$ cacaview <pic_file>
三、调试
把Linux 下软件安装放在这一部分,作为操作实践的部分。
四、心得体会
虽然是最后时间做的很仓促的实验,但还是感觉收获了很多。学会了shell的一些操作指令,了解了linux系统的文件以及一些不同于的windows的特性。更多的学习内容还要继续,加油努力吧!!!
五、附件