linux命令 参考文档

      https://zhuanlan.zhihu.com/p/28674639




常用命令

     tab 补充  cd xx 访问 cd 退出   pwd 查看当前目录

     ctrl+c 强制结束当前程序

     touch 文件名  创建文件 touch  love_{1..10}_linux.txt多个文件

     *?通配符模糊查找  man获取帮助

     Who使用 –a 打印全部 –d死掉的进程 –q登入用户数用户名–u 当前用户信息

      -r 运行等级




用户及文件管理权限

1 创建用户

   su(sudo) adduser xx

  ls /home为用户创建home目录

   su-l xj 访问

退出exit  Ctrl+d 

3 groups xx  用户组

    Sudo cat/etc/sudoers.d/xx xx用户赋予sudo权限

 4 cat 用于读取制定文件的内容并且打印到终端输出

           $cat /etc/group | grep -E "shiyanlou"  用户信息

         $cat /etc/group | grep -E "shiyanlou"查看特定用户

5其他用户加入sudo用户组

      $ su -l xx  $sudo ls

  usermod 命令可以为用户添加用户组

6 shiyanlou用户执行sudoxx添加到sudo用户组获取sudo权限          

$su shiyanlou # 此处需要输入shiyanlou用户密码,可以点击右侧工具栏中的“SSH直连”查看

$ groups lilei

$ sudo usermod -G sudo xx

$ groups xx

7 删除用户

   $sodudeluser xx –remove-home




Linux 文件权限

   1 查看文件权限

   Ls –l

        


-A 除本文件夹以及上一级目录的全部文件

-Al<目录名> 目录详细信息 –AsSh普通人看懂的方式

2 变更文件所有权

 Touch 创建  sudo chown 用户名 文件名

3 变更文件权限

 Chmod go-rw 文件名  chmod 700 文件名

Adduser 完整 useradd 普通添加 只要设置密码

$ chmod u+x file                  file的属主增加执行权限

$ chmod 751 file                  file的属主分配读、写、执行(7)的权限,给file的所在组分配读、执行(5)的权限,给其他用户分配执行(1)的权限

$ chmod u=rwx,g=rx,o=x file     上例的另一种形式

$ chmod =r file                    为所有用户分配读权限

$ chmod 444 file             同上例

$ chmod a-wx,a+r   file       同上例

$ chmod -R u+r directory        递归地给directory目录下所有文件和子目录的属主分配读的权限

$ chmod 4755                           设置用ID,给属主分配读、写和执行权限,给组和其他用户分配读、执行的权限。





Linux目录结构及基本操作

     查看存储结构 tree /没有需要安装sudo apt-get update  sudo apt-get install tree 




Linux目录结构及基本操作

查看存储结构 tree /没有需要安装sudo apt-get update  sudo apt-get install tree

路径访问

   cd.. 上一级 cd~(cd)进入你home  pwd获取当前路径

   cd /user/local/bin =cd ../../local/bin 绝对路径和相对路径

文件基本操作

  Touchxx 创建文件touch file{1..n}.txt

 mkdir xx 创建目录mkdir –p father/son/grandson

 cpxx 目录 复制文件  cp –r 目录 目录 复制目录

 rmxx 删除文件目录 –f强制删除  mv xx 目录 移动文件

mv xx xx 重命名 

 # 批量将这 5 个后缀为 .txt 的文本文件重命名为以 .c 为后缀的文件:

$rename 's/\.txt/\.c/' *.txt #

批量将这 5 个文件,文件名改为大写:

 $ rename 'y/a-z/A-Z/' *.c

查看文件

cat xx 加-n显示行号 cat –n =nl添加行号并打印

-b : 指定添加行号的方式,主要有两种:

-b a:表示无论是否为空行,同样列出行号("cat -n"就是这种方式)

-b t:只列出非空行的编号并列出(默认为这种方式)

-n : 设置行号的样式,主要有三种:

-n ln:在行号字段最左端显示

-n rn:在行号字段最右边显示,且不加 0

-n rz:在行号字段最右边显示,且加 0

 -w : 行号字段占用的位数(默认为 6

分页查看文件

   Morexx向下

less可以使用 Enter 键向下滚动一行,使用 Space 键向下滚动一屏,按下 h 显示帮助,q 退出。

查看为你文件头尾几行  tail –n 行数 xx     head

查看文件类型 file 编辑文件 vim编辑器  vimtutor





环境变量与文件查找

 变量

    (declare)x=xxx   echo $tmp 引用变量

环境变量

    通常我们会涉及到的变量类型有三种:

·  当前 Shell 进程私有用户自定义变量,如上面我们创建的 tmp 变量,只在当前 Shell 中有效。

·  Shell 本身内建的变量。

·  从自定义变量导出的环境变量。

set

显示当前 Shell 所有变量,包括其内建环境变量(与 Shell 外观等相关),用户自定义变量及导出的环境变量。

env

显示与当前用户相关的环境变量,还可以让命令在指定环境中运行。

export

显示从 Shell 中导出成环境变量的变量,也能通过它将自定义变量导出为环境变量。

 

 



使用vimdiff工具  |管道  sort排序 >>重定向

 $ temp=shiyanlou

$ export temp_env=shiyanlou

$ env|sort>env.txt

$ export|sort>export.txt

$ set|sort>set.txt

$ vimdiff env.txt export.txt set.txt

子进程有效则为环境变量,否则不是

    在父进程中创建的变量  zsh创建子进程需要用export  x 导出才能生效

     永久生效(永久的:需要修改配置文件,变量永久生效;临时的:使用 export 命令行声明即可,变量在关闭 shell 时失效。)

                /etc/bashrc shell变量  /etc/profile环境变量(永久生效)





命令的查找路径和顺序

         echo $PATH

          用gedit创建脚本文件以及C程序

             gedit xx.sh

                #!/bin/bash

                for ((i=0; i<10; i++));do

               echo"helloshell"

               done

               exit        0

           chmod 755 xx.sh 可执行权限   ./xx.sh 执行脚本

           gedit xx.c (vimxx.c)  gcc xx.c –o xx 编译 ./xx 运行

           mkdir mybin   mvxx.sh xx.c mybin/  cd mybin 测试运行

           但在当前用户目录下运行不了,因为path不包含当前文件夹

           自定义路径加到环境变量里PATH=$PATH:/home/shiyanlou/mybin

           去掉前面./ 可以在任意目录下运行  加到全局配置文件里重启shell也能使用

           加到echo"PATH=$PATH:/home/shiyanlou/mybin" >> .zshrc (.bashrc)




修改和删除变量

 修改

${变量名#匹配字串}    从头向后开始匹配,删除符合匹配字串的最短数据

${变量名##匹配字串}     从头向后开始匹配,删除符合匹配字串的最长数据

${变量名%匹配字串}      从尾向前开始匹配,删除符合匹配字串的最短数据

${变量名%%匹配字串}     从尾向前开始匹配,删除符合匹配字串的最长数据

${变量名/旧的字串/新的字串}  将符合旧字串的第一个字串替换为新的字串

${变量名//旧的字串/新的字串} 将符合旧字串的全部字串替换为新的字串

 比如要修改我们前面添加到 PATH 的环境变量。为了避免操作失误导致命令找不到,我们先将 PATH 赋值给一个新的自定义变量 path:

$ path=$PATH   $ echo $path    $ path=${path%/home/shiyanlou/mybin}

 $path=${path%*/mybin}# 或使用通配符,*表示任意多个任意字符

   删除  unset temp

   让环境变量立即生效 source .zshrc(. ./.zshrc)

 

 


搜索文件

whereis 简单快速 $whereis who(直接从数据库中查询只能搜索二进制文件(-b)man 帮助文件(-m)和源代码文件(-s)

                locate 快而全    查找指定目录下的不同文件类型 $ locate /etc/sh 它会地鬼etc的子目录     查找/usr/share/ 下所有jpg 文件:

                                             $ locate /usr/share/\*.jpg(*转义字符)如果想只统计数目可以加上-c 参数,-i参数可以忽略大小写进行查找,

                                             whereis的-b、-m、-s 同样可以使用。

                which 小而精     shell内建命令确定是否安装了某个软件$which man

                find 精而细       最强大,通过文件类型,文件名,文件属性(权限,时间戳)查找 $ sudo find /etc/ -name interfaces去 /etc/ 目录下面,

                                             搜索名字叫做 interfaces 的文 件或者目录

                                        基本命令格式为 find [path] [option][action]

                                       -atime  最后访问时间

                                       -ctime  最后修改文件内容的时间

                                        -mtime  最后修改文件属性的时间

                                       下面以 -mtime 参数举例:

                                       -mtime n:n 为数字,表示为在 n 天之前的“一天之内”修改过的文件

                                        -mtime +n:列出在 n 天之前(不包含 n 天本身)被修改过的文件

                                        -mtime -n:列出在 n 天之内(包含 n 天本身)被修改过的文件

                                        -newer file:file 为一个已存在的文件,列出比 file 还要新的文件名




文件打包与压缩

linux常见压缩文件格式

文件后缀名 说明

*.zip   zip 程序打包压缩的文件

*.rar   rar 程序压缩的文件

*.7z    7zip 程序压缩的文件

*.tar   tar 程序打包,未压缩的文件

*.gz    gzip 程序(GNU zip)压缩的文件

*.xz    xz 程序压缩的文件

*.bz2   bzip2 程序压缩的文件

*.tar.gz    tar 打包,gzip 程序压缩的文件

*.tar.xz    tar 打包,xz 程序压缩的文件

*tar.bz2    tar 打包,bzip2 程序压缩的文件

*.tar.7z    tar 打包,7z 程序压缩的文件

 Zip打包

 $ zip -r -q -o shiyanlou.zip /home/shiyanlou

$ du -hshiyanlou.zip

$ fileshiyanlou.zip

 -r 参数表示递归打包包含子目录的全部内容,-q 参数表示为安静模式,即不向屏幕输出信息,-o,表示输出文件,需在其后紧跟打包输出文件名。后面使用 du 命令查看打包后文件的大小(后面会具体说明该命令)。使用绝对路径

设置压缩级别为 9 和 1(9 最大,1 最小),重新打包:

$ zip -r -9-q -o shiyanlou_9.zip /home/shiyanlou -x ~/*.zip

$ zip -r -1-q -o shiyanlou_1.zip /home/shiyanlou -x ~/*.zip

 

 du 命令分别查看默认压缩级别、最低、最高压缩级别及未压缩的文件的大小:

$ du -h -d 0*.zip ~ | sort     h可读  d文件深度

 

创建加密 zip 包

使用 -e 参数可以创建加密压缩包:

$ zip -r -e-o shiyanlou_encryption.zip /home/shiyanlou

 

在 Linux 上编辑的文本,在 Windows 系统上打开可能看起来是没有换行的。如果你想让你在 Linux 创建的 zip 压缩文件在Windows 上解压后没有任何问题,那么你还需要对命令做一些修改:

$ zip -r -l-o shiyanlou.zip /home/shiyanlou

需要加上 -l 参数将 LF 转换为 CR+LF来达到以上目的。

 

Unzip

 将 shiyanlou.zip 解压到当前目录:$ unzip shiyanlou.zip

使用安静模式,将文件解压到指定目录:$ unzip -q shiyanlou.zip -d ziptest

中文编码的问题:win用GBK 或其它编码 linux用UTF-8 编码

使用 -O(英文字母,大写 o)参数指定编码类型:

unzip -O GBK中文压缩文件.zip

    

rar打包

安装 rar 和 unrar 工具:

$ sudoapt-get update

$ sudoapt-get install rar unrar

 

从指定文件或目录创建压缩包或添加文件到压缩包:

$ rm *.zip

$ rar ashiyanlou.rar .

Rar命令没有-

 

从指定压缩包文件中删除某个文件:

$ rar dshiyanlou.rar .zshrc

 

查看不解压文件:

$ rar lshiyanlou.rar

 

使用 unrar 解压 rar 文件

全路径解压:

 

$ unrar xshiyanlou.rar

去掉路径解压:

 

$ mkdir tmp

$ unrar eshiyanlou.rar tmp/

 

tar打包工具

 创建一个 tar 包:

$ tar -cfshiyanlou.tar ~

-c 表示创建一个 tar 包文件,-f 用于指定创建的文件名,注意文件名必须紧跟在 -f 参数之后,比如不能写成 tar -fc shiyanlou.tar,可以写成 tar -fshiyanlou.tar -c ~。你还可以加上 -v 参数以可视的的方式输出打包的文件。上面会自动去掉表示绝对路径的 /,你也可以使用 -P 保留对路径符。

 

解包一个文件(-x 参数)到指定路径的已存在目录(-C 参数):

$ mkdirtardir

$ tar -xfshiyanlou.tar -C tardir

 

只查看不解包文件 -t 参数:

$ tar -tfshiyanlou.tar

 

保留文件属性和跟随链接(符号链接或软链接),有时候我们使用 tar 备份文件当你在其他主机还原时希望保留文件的属性(-p 参数)和备份链接指向的源文件而不是链接本身(-h 参数):

$ tar -cphfetc.tar /etc

 

其他格式我们只需要在创建 tar 文件的基础上添加 -z 参数,使用 gzip 来压缩文件:

$ tar -czfshiyanlou.tar.gz ~

解压 *.tar.gz 文件:

$ tar -xzfshiyanlou.tar.gz

压缩文件格式  参数

*.tar.gz  -z

*.tar.xz  -J

*tar.bz2  -j

 






文件系统操作与磁盘管理

 查看磁盘和目录容量

  $df

 /dev/sda2 是对应着主机硬盘的分区,后面的数字表示分区号,数字前面的字母 a 表示第几块硬盘(也可能是可移动磁盘),你如果主机上有多块硬盘则可能还会出现/dev/sdb,/dev/sdc 这些磁盘设备都会在/dev 目录下以文件的存在形式。

           

我们以一种你应该看得懂的方式展示:

$ df –h

            

 使用du查看目录容量

 # 默认同样以 blocks 的大小展示

$ du

# 加上`-h`参数,以更易读的方式展示

$ du –h

# 只查看1级目录的信息

$ du -h -d 0 ~

# 查看2级

$ du -h -d 1 ~

du -h #同--human-readable 以K,M,G为单位,提高信息的可读性。

du -a #同--all 显示目录中所有文件的大小。

du -s #同--summarize 仅显示总计,只列出最后加总的值。





简单的磁盘管理

dd 命令

 用于转换和复制文件,读取自和/或写入到这些文件,备份硬件的引导扇区,获取一定数量的随机数据或者空数据,默认从标准输入中读取,并写入到标准输出中,但可以用选项if(input file,输入文件)和of(output file,输出文件)改变。

    

 #输出到文件

$ dd of=testbs=10 count=1 # 或者

ddif=/dev/stdin of=test bs=10 count=1

# 输出到标准输出

$ ddif=/dev/stdin of=/dev/stdout bs=10 count=1

Bs制定块待续哦啊byte count块的数量

 

创建虚拟镜像

  从/dev/zero设备创建一个容量为256M的空文件

 $ dd if=/dev/zero of=virtual.img bs=1Mcount=256

$ du -h virtual.img

              

使用mkfs命令格式化磁盘(例ext4)

$ sudo mkfs.ext4 virtual.img

                

 想知道 Linux 支持哪些文件系统你可以输入

ls -l/lib/modules/$(uname -r)/kernel/fs

              

使用mount命令挂在磁盘到目录树

打开一个文件以前,包含该文件的文件系统必须先进行挂载的动作

该指令通常是使用在 USB 或其他可移除存储设备上,而根目录则需要始终保持挂载的状态

因为 Linux/UNIX 文件系统可以对应一个文件而不一定要是硬件设备,所以可以挂载一个包含文件系统的文件到目录树。

查看主机挂在的文件系统$sudo mount

设备  设备名 刮起点 文件类型 挂在选项

                

 那么我们如何挂载真正的磁盘到目录树呢,mount命令的一般格式如下:

mount [options] [source] [directory]

一些常用操作:

mount [-o [操作选项]] [-t 文件系统类型] [-w|--rw|--ro] [文件系统源] [挂载点]

我们现在直接来挂载我们创建的虚拟磁盘镜像到/mnt目录:

$ mount -o loop -t ext4 virtual.img /mnt

# 也可以省略挂载类型,很多时候 mount 会自动识别

# 以只读方式挂载

$ mount -o loop --ro virtual.img /mnt

# 或者mount -o loop,ro virtual.img /mnt


使用umount命令卸载已挂载的磁盘

# 命令格式 sudo umount 已挂载设备名或者挂载点,如:

$ sudoumount /mnt

loop设备

/dev/loop(或称vnd (vnode disk)、lofi(循环文件接口))是一种伪设备,这种设备使得文件可以如同块设备一般被访问

使用之前,循环设备必须与现存文件系统上的文件相关联。这种关联将提供给用户一个应用程序接口,接口将允许文件视为块特殊文件(参见设备文件系统)使用。因此,如果文件中包含一个完整的文件系统,那么这个文件就能如同磁盘设备一般被挂载。

使用fdisk为磁盘分区

# 查看硬盘分区表信息

$ sudo fdisk–l

# 进入磁盘分区模式   最后w写入分区表

$ sudo fdiskvirtual.img

使用losetup建立镜像与会换设备的关联

$ sudo losetup /dev/loop0 virtual.img

# 如果提示设备忙你也可以使用其它的回环设备,"ls/dev/loop*"参看所有回环设备

# 解除设备关联

$ sudolosetup -d /dev/loop0

然后再使用mkfs格式化各分区(前面我们是格式化整个虚拟磁盘镜像文件或磁盘),不过格式化之前,我们还要为各分区建立虚拟设备的映射,用到kpartx工具,需要先安装:

$ sudoapt-get install kpartx

$ sudokpartx -av /dev/loop0

# 取消映射

$ sudokpartx -dv /dev/loop0

接着再是格式化,我们将其全部格式化为 ext4:

$ sudomkfs.ext4 -q /dev/mapper/loop0p1

。。。。。。

格式化完成后在/media目录下新建四个空目录用于挂载虚拟磁盘:

$ mkdir -p/media/virtualdisk_{1..3}

 

# 挂载磁盘分区

$ sudo mount/dev/mapper/loop0p1 /media/virtualdisk_1

。。。。。。

# 卸载磁盘分区

$ sudoumount /dev/mapper/loop0p1

然后:

$ df –h

 





Linux下的帮助命令

内建命令和外部命令:

shell 程序的一部分,其中包含的是一些比较简单的 Linux 系统命令,这些命令是写在bash源码的builtins里面的,并由 shell 程序识别并在 shell 程序内部完成运行,通常在 Linux 系统加载运行时 shell 就被加载并驻留在系统内存中。而且解析内部命令 shell 不需要创建子进程,因此其执行速度比外部命令快。比如:history、cd、exit 等等。

 实用程序部分,因为实用程序的功能通常都比较强大,所以其包含的程序量也会很大,在系统加载时并不随系统一起被加载到内存中,而是在需要时才将其调用内存。虽然其不包含在 shell 中,但是其命令执行过程是由 shell 程序控制的。外部命令是在 Bash 之外额外安装的,通常放在/bin,/usr/bin,/sbin,/usr/sbin等等。比如:ls、vi等。

 type 命令来区分命令是内建的还是外部

 type exit   type service


 帮助命令的使用

  Help-bash中内置该命令

  help  ls     显示 shell 内建命令的简要帮助信息

  ls –help   外部命令

  man  

 man ls 内容比用 help 更多更详细,而且 man 没有内建与外部命令的区分,因为 man 工具是显示系统手册页中的内容

 左上角显示“ LS (1)”,在这里,“ LS ”表示手册名称,而“(1)”表示该手册位于第一章节

   

章节数

说明

1

Standard commands (标准命令)

2

System calls (系统调用)

3

Library functions (库函数)

4

Special devices (设备说明)

5

File formats (文件格式)

6

Games and toys (游戏和娱乐)

7

Miscellaneous (杂项)

8

Administrative Commands (管理员命令)

9

其他(Linux特定的), 用来存放内核例行程序的文档。

 通过 pgup pgdn 或者上下键来上下翻看,可以按 q 退出当前页面


Info-bash

infols 比 man 还要多了,info 来自自由软件基金会的 GNU 项目,是 GNU 的超文本帮助系统

 





linux任务计划crontab

用于设置周期性被执行的指令。该命令从输入设备读取指令,并将其存放于 crontab 文件中,以供之后读取和执行,crontab 储存的指令被守护进程激活,crond 为其守护进程,crond 常常在后台运行,每一分钟会检查一次是否有预定的作业需要执行,在固定的间隔时间执行指定的系统指令或 shell script 脚本。时间间隔的单位可以是分钟、小时、日、月、周的任意组合。

# Example of job definition:

# .---------------- minute (0 - 59)

# | .------------- hour (0 - 23)

# | |  .---------- day of month (1 -31)

# | |  |  .------- month (1 - 12) OR jan,feb,mar,apr...

# | |  |  | .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat

# | |  |  |  |

# * *  *  *  *user-name command to be executed

Crontab准备

 sudoservice rsyslog start  启动 rsyslog,默认自行启动不需要手动启动

 sudocron -f & 启动crontab

 添加一个计划任务 crontab–e  选择编辑工具1是vim

Man crontab 查看命令格式

 在文档的最后一排加上这样一排命令,该任务是每分钟我们会在/home/shiyanlou目录下创建一个以当前的年月日时分秒为名字的空白文件

*/1 * * * * touch /home/shiyanlou/$(date +\%Y\%m\%d\%H\%M\%S)

\转义  % 结束命令行 换行 重定向

添加成功后我们会得到最后一排 installing newcrontab 的一个提示

Crontab -1 查看我们添加了哪些任务

确定cron是否成功在后台运行

   Ps aux|grep cron     或者 pgrep cron

Sudo tail –f /var/log/syslog 查看到执行任务命令之后在日志中的信息反馈

Crontab –r 删除任务

 

crontab -e 添加计划任务,都会在 /var/spool/cron/crontabs中添加一个该用户自己的任务文档,这样目的是为了隔离

系统级别的定时任务以 sudo 权限编辑 /etc/crontab 文件就可以

cron 服务监测时间最小单位是分钟,

/etc/cron.daily,目录下的脚本会每天执行一次,在每天的6点25分时运行;

鳥哥的 Linux 私房菜 -- 第十五章、例行性工作排程(crontab)

http://linux.vbird.org/linux_basic/0430cron.php

 

 




命令执行顺序控制与管道

命令执行顺序控制

执行多条命令 用;分开

$sudo apt-get update;sudo apt-get install some-tool;some-tool

# 让它自己运行   前面的命令执行失败后面依赖上一条命令的运行结果可能也会错

 

有选择的执行命令

使用which来查找是否安装某个命令 找到就执行该命令,否则什么也不做

$ which cowsay>/dev/null &&cowsay -f head-in ohch~

&&就是用来实现选择性执行的,它表示如果前面的命令执行结果(不是表示终端输出的内容,而是表示命令执行状态的结果)返回0则执行后面的,否则不执行,你可以从$?环境变量获取上一次命令的返回结果:

 $ which cowsay>/dev/null || echo"cowsay has not been install, please run 'sudo apt-get install cowsay' toinstall"

||在这里就是与&&相反的控制效果,当上一条命令执行结果为≠0($?≠0)时则执行它后面的命令

$ which cowsay>/dev/null && echo"exist" || echo "not exist"    其他


管道

 管道是一种通信机制,通常用于进程间的通信,  将前面每一个进程的输出(stdout)直接作为下一个进程的输入(stdin)   分为匿名管道和具名管道,使用一些过滤程序时经常会用到的就是匿名管道,只会在源程序中用到具名管道

        

 Ls –al /etc 查看/etc目录下有哪些文件和目录

 Ls –al /etc |less 有太多内容,屏幕不能完全显示,这时候可以使用滚动条快捷键滚动窗口来查看。不过这时候可以使用管道, 将前一个命令(ls)的输出作为下一个命令(less)的输入,然后就可以一行一行地看。

 Cut /etc/passwd –d ‘:’ –f 1,6 打印/etc/passwd文件中以:为分隔符的第1个字段和第6个字段分别表示用户名和其家目录

  打印每行中签N个字符

  # 前五个(包含第五个)

$ cut /etc/passwd -c -5

# 前五个之后的(包含第五个)

$ cut /etc/passwd -c 5-

# 第五个

$ cut /etc/passwd -c 5

# 2到5之间的(包含第五个)

$ cut /etc/passwd -c 2-5


Grep命令在文本中或是stdin中查找特定字符

结合正则表达式可以实现很复杂却很高效的匹配和查找

grep命令的一般形式为:

grep [命令选项]... 用于匹配的表达式 [文件]...

搜索/home/shiyanlou目录下所有包含"shiyanlou"的所有文本文件,并显示出现在文本中的行号   $ grep -rnI"shiyanlou" ~

-r 参数表示递归搜索子目录中的文件,-n表示打印匹配项行号,-I表示忽略二进制文件

# 查看环境变量中以"yanlou"结尾的字符串

$ export | grep ".*yanlou$"  $就表示一行的末尾


Wc命令,简单小巧的计数工具

wc 命令用于统计并输出一个文件中行、单词和字节的数目

$ wc /etc/passwd

 # 行数

$ wc -l /etc/passwd

# 单词数

$ wc -w /etc/passwd

# 字节数

$ wc -c /etc/passwd

# 字符数

$ wc -m /etc/passwd

# 最长行字节数

$ wc -L /etc/passwd

结合管道来操作一下,下面统计 /etc下面所有目录数:

$ ls -dl /etc/*/ | wc –l


Sort排序的命令

 默认为字典排序:

$ cat/etc/passswd | sort

反转排序:

$ cat/etc/passwd | sort -r

按特定字段排序:

$ cat/etc/passwd | sort -t':' -k 3

-t参数用于指定字段的分隔符,-k 字段号用于指定对哪一个字段进行排序,默认情况下是以字典序排序的,如果要按照数字排序就要加上-n参数:

$ cat /etc/passwd | sort -t':' -k 3 –n


Uniq去重命令

过滤或者输出重复行。只能去连续重复的行,不是全文去重

用history命令查看最近执行过的命令

去掉重复的命令:

$ history | cut -c 8- | cut -d ' ' -f 1 | uniq

我们先排序:

$ history | cut -c 8- | cut -d ' ' -f 1 | sort| uniq

# 输出重复过的行(重复的只输出一个)及重复次数

$ history | cut -c 8- | cut -d ' ' -f 1 | sort| uniq -dc

# 输出所有重复的行

$ history | cut -c 8- | cut -d ' ' -f 1 | sort| uniq -D

 

 

 




简单的文本处理

文本处理命令

 tr命令  删除一段文本信息中的某些文字。或者将其进行转换

使用方式:

tr [option]...SET1 [SET2]

常用的选项有:

选项    说明

-d      删除和set1匹配的字符,注意不是全词匹配也不是按字符顺序匹配

-s      去除set1指定的在输入文本中连续并重复的字符

实例

# 删除 "hello shiyanlou"中所有的'o','l','h'

$ echo 'hello shiyanlou' | tr -d 'olh'

# 将"hello" 中的ll,去重为一个l

$ echo 'hello' | tr -s 'l'

# 将输入文本,全部转换为大写或小写输出

$ echo 'input some text here' | tr '[:lower:]''[:upper:]'

# 上面的'[:lower:]' '[:upper:]'你也可以简单的写作'[a-z]' '[A-Z]',当然反过来将大写变小写也是可以的


Col命令 将Tab换成对等数量的空格键,或反转这个操作 

col [option]

常用的选项有:

选项     说明

-x      将Tab转换为空格

-h      将空格转换为Tab(默认选项)

# 查看 /etc/protocols 中的不可见字符,可以看到很多 ^I ,这其实就是 Tab 转义成可见字符的符号

$ cat -A /etc/protocols

# 使用 col -x 将 /etc/protocols 中的 Tab 转换为空格,然后再使用 cat 查看,你发现 ^I不见了

$ cat /etc/protocols | col -x | cat –A


Join命令  将两个文件中包含相同内容的那一行合并在一起

 join [option]... file1 file2

 选项   说明

-t     指定分隔符,默认为空格

-i     忽略大小写的差异

-1     指明第一个文件要用哪个字段来对比,默认对比第一个字段

-2     指明第二个文件要用哪个字段来对比,默认对比第一个字段

# 创建两个文件

$ echo '1 hello' > file1

$ echo '1 shiyanlou' > file2

$ join file1 file2

# 将/etc/passwd与/etc/shadow两个文件合并,指定以':'作为分隔符

$ sudo join -t':' /etc/passwd /etc/shadow

# 将/etc/passwd与/etc/group两个文件合并,指定以':'作为分隔符, 分别比对第4和第3个字段

$ sudo join -t':' -1 4 /etc/passwd -2 3/etc/group


Paste命令 不对比数据的情况下,简单地将多个文件合并一起,以Tab隔开

paste[option] file...

 选项   说明

-d     指定合并的分隔符,默认为Tab

-s     不合并到一行,每个文件为一行

$ echo hello > file1

$ echo shiyanlou > file2

$ echo www.shiyanlou.com > file3

$ paste -d ':' file1 file2 file3

$ paste -s file1 file2 file3

 

 

 

 


数据流重定向

 原本输出到标准输出的数据重定向到一个文件中,因为标准输出(/dev/stdout)本身也是一个文件,我们将命令输出导向另一个文件自然也是没有任何问题的。

 $echo 'hello shiyanlou' > redirect

$ echo'www.shiyanlou.com' >> redirect

>表示是从左到右,<右到左  >  是定向输出到文件,如果文件不存在,就创建文件;如果文件存在,就将其清空  >> 不清空

 

 Linux 默认提供了三个特殊设备,用于终端的显示和输出,分别为stdin(标准输入,对应于你在终端的输入),stdout(标准输出,对应于终端的输出),stderr(标准错误输出,对应于终端的输出)。

文件描述符 设备文件  说明

0          /dev/stdin    标准输入

1          /dev/stdout   标准输出

2          /dev/stderr   标准错误

文件描述符在形式上是一个非负整数。实际上,它是一个索引值,指向内核为每一个进程所维护的该进程打开文件的记录表。当程序打开一个现有文件或者创建一个新文件时,内核向进程返回一个文件描述符  符号-,它可以同时作为前一个命令的

 

默认使用终端的标准输入作为命令的输入和标准输出作为命令的输出

$cat  ctrl+c退出

将cat的连续输出(heredoc方式)重定向到一个文件

$ mkdir Documents

$ cat > Documents/test.c <<EOF

将一个文件作为命令的输入,标准输出作为命令的输出

$ cat Documents/test.c

 

将echo命令通过管道传过来的数据作为cat命令的输入,将标准输出作为命令的输出

$ echo 'hi' | cat

将echo命令的输出从默认的标准输出重定向到一个普通文件

$ echo 'hello shiyanlou' > redirect

$ cat redirect

管道默认是连接前一个命令的输出到下一个命令的输入,而重定向通常是需要一个文件来建立两个命令的连接


标准错误重定向

指向伪终端的屏幕显示,所以我们经常看到的一个命令的输出通常是同时包含了标准输出和标准错误的结果的

 # 使用cat 命令同时读取两个文件,其中一个存在,另一个不存在

$ catDocuments/test.c hello.c

# 你可以看到除了正确输出了前一个文件的内容,还在末尾出现了一条错误信息

# 下面我们将输出重定向到一个文件,根据我们前面的经验,这里将在看不到任何输出了

$ catDocuments/test.c hello.c > somefile

# 将标准错误重定向到标准输出,再将标准输出重定向到文件,注意要将重定向到文件写到前面

$ catDocuments/test.c hello.c >somefile 2>&1

# 或者只用bash提供的特殊的重定向符号"&"将标准错误和标准输出同时重定向到文件

$ catDocuments/test.c hello.c &>somefilehell

注意你应该在输出重定向文件描述符前加上&,否则shell会当做重定向到一个文件名为1的文件中


使用tee重定向到多个文件

 $ echo 'hello shiyanlou' | teehello


永久重定向

使用exec命令实现“永久”重定向。exec命令的作用是使用指定的命令替换当前的 Shell,及使用一个进程替换当前进程,或者指定新的重定向:

# 先开启一个子 Shell

# 先开启一个子 Shell

$ zsh

# 使用exec替换当前进程的重定向,将标准输出重定向到一个文件

$ exec1>somefile

# 后面你执行的命令的输出都将被重定向到文件中,直到你退出当前子shell,或取消exec的重定向(后面将告诉你怎么做)

$ ls

$ exit

$ catsomefile


创建输出文件描述符

Shell 中有9个文件描述符默认提供的0,1,2号文件描述符  还可以使用3-8的文件描述符默认没有打开而已

$cd /dev/fd/;ls –Al

     

同样使用exec命令可以创建新的文件描述符:

$ zsh

$ exec3>somefile

# 先进入目录,再查看,否则你可能不能得到正确的结果,然后再回到上一次的目录

$ cd/dev/fd/;ls -Al;cd -

# 注意下面的命令>与&之间不应该有空格,如果有空格则会出错

$ echo"this is test" >&3

$ catsomefile

$ exit

关闭文件描述符

如上面我们打开的3号文件描述符,可以使用如下操作将它关闭:

$ exec 3>&-

$ cd /dev/fd;ls -Al;cd –

  

完全屏蔽命令的输出  称为“黑洞”的设备文件

/dev/null,或称空设备,是一个特殊的设备文件,它通常被用于丢弃不需要的输出流,或作为用于输入流的空文件,这些操作通常由重定向完成。读取它则会立即得到一  个EOF。

利用设个/dev/null屏蔽命令的输出:

$ cat Documents/test.c nefile 1>/dev/null2>&1 无任何输出结果


使用xargs分割参数列表

处理产生大量输出结果的命令如 find,locate 和 grep 的结果

$ cut -d: -f1 < /etc/passwd | sort | xargsecho

上面这个命令用于将/etc/passwd文件按:分割取第一个字段排序后,使用echo命令生成一个列表。

 

 

 

 


 

正则表达式

正规表示式、正规表示法、正规表达式、规则表达式、常规表示法,使用单个字符串来描述、匹配一系列符合某个句法规则的字符串,文本编辑器里,正则表达式通常被用来检索、替换那些符合某个模式的文本。

 假设我们有这样一个文本文件,包含"shiyanlou",和"shilouyan"这两个字符串,同样一个表达式:

shi*

作为一个正则表达式,它将只能匹配 shi,而如果不是作为正则表达式*作为一个通配符,则将同时匹配这两个字符串

正则表达式中*表示匹配前面的子表达式零次或多次

 

|竖直分隔符表示选择,例如"boy|girl"可以匹配"boy"或者"girl"

在一个模式中不加数量限定符则表示出现一次且仅出现一次:

+表示前面的字符必须出现至少一次(1次或多次),例如,"goo+gle",可以匹配"gooogle","goooogle"等;

?表示前面的字符最多出现一次(0次或1次),例如,"colou?r",可以匹配"color"或者"colour";

*星号代表前面的字符可以不出现,也可以出现一次或者多次(0次、或1次、或多次),例如,“0*42”可以匹配42、042、0042、00042等。

 

()圆括号可以用来定义模式字符串的范围和优先级gr(a|e)y"等价于"gray|grey""(grand)?father"匹配father和grandfather(这里体验了范围,?将圆括号内容作为一个整体匹配)。

 

正则表达式有多种不同的风格

 常用的作为 PCRE 子集(C 语言编写的正则表达式函数库)的适用于perl和python编程语言及grep或egrep的正则表达式匹配规

字符

描述

\

将下一个字符标记为一个特殊字符、或一个原义字符。例如,“n”匹配字符“n”。“\n”匹配一个换行符。序列“\\”匹配“\”而“\(”则匹配“(”。

^

匹配输入字符串的开始位置。

$

匹配输入字符串的结束位置。

{n}

n是一个非负整数。匹配确定的n次。例如,“o{2}”不能匹配“Bob”中的“o”,但是能匹配“food”中的两个o。

{n,}

n是一个非负整数。至少匹配n次。例如,“o{2,}”不能匹配“Bob”中的“o”,但能匹配“foooood”中的所有o。“o{1,}”等价于“o+”。“o{0,}”则等价于“o*”。

{n,m}

m和n均为非负整数,其中n<=m。最少匹配n次且最多匹配m次。例如,“o{1,3}”将匹配“fooooood”中的前三个o。“o{0,1}”等价于“o?”。请注意在逗号和两个数之间不能有空格。

*

匹配前面的子表达式零次或多次。例如,zo*能匹配“z”、“zo”以及“zoo”。*等价于{0,}。

+

匹配前面的子表达式一次或多次。例如,“zo+”能匹配“zo”以及“zoo”,但不能匹配“z”。+等价于{1,}。

?

匹配前面的子表达式零次或一次。例如,“do(es)?”可以匹配“do”或“does”中的“do”。?等价于{0,1}。

?

当该字符紧跟在任何一个其他限制符(*,+,?,{n},{n,},{n,m})后面时,匹配模式是非贪婪的。非贪婪模式尽可能少的匹配所搜索的字符串,而默认的贪婪模式则尽可能多的匹配所搜索的字符串。例如,对于字符串“oooo”,“o+?”将匹配单个“o”,而“o+”将匹配所有“o”。

.

匹配除“\n”之外的任何单个字符。要匹配包括“\n”在内的任何字符,请使用像“(.|\n)”的模式。

(pattern)

匹配pattern并获取这一匹配的子字符串。该子字符串用于向后引用。要匹配圆括号字符,请使用“\(”或“\)”。

x|y

匹配x或y。例如,“z|food”能匹配“z”或“food”。“(z|f)ood”则匹配“zood”或“food”。

[xyz]

字符集合(character class)。匹配所包含的任意一个字符。例如,“[abc]”可以匹配“plain”中的“a”。其中特殊字符仅有反斜线\保持特殊含义,用于转义字符。其它特殊字符如星号、加号、各种括号等均作为普通字符。脱字符^如果出现在首位则表示负值字符集合;如果出现在字符串中间就仅作为普通字符。连字符 -如果出现在字符串中间表示字符范围描述;如果如果出现在首位则仅作为普通字符。

[^xyz]

排除型(negate)字符集合。匹配未列出的任意字符。例如,“[^abc]”可以匹配“plain”中的“plin”。

[a-z]

字符范围。匹配指定范围内的任意字符。例如,“[a-z]”可以匹配“a”到“z”范围内的任意小写字母字符。

[^a-z]

排除型的字符范围。匹配任何不在指定范围内的任意字符。例如,“[^a-z]”可以匹配任何不在“a”到“z”范围内的任意字符。

优先级

优先级为从上到下从左到右,依次降低:

运算符

说明

\

转义符

(), (?:), (?=), []

括号和中括号

*、+、?、{n}、{n,}、{n,m}

限定符

^、$、\任何元字符

定位点和序列

 选择


regex的思导图:



Grep模式匹配命令   用于打印输出文本中匹配的模式串

grep支持三种正则表达式引擎

参数

说明

-E

POSIX扩展正则表达式,ERE

-G

POSIX基本正则表达式,BRE

-P

Perl正则表达式,PCRE

Grep命令参数

参数

说明

-b

将二进制文件作为文本来进行匹配

-c

统计以模式匹配的数目

-i

忽略大小写

-n

显示匹配文本所在行的行号

-v

反选,输出不匹配行的内容

-r

递归匹配查找

-A n

n为正整数,表示after的意思,除了列出匹配行之外,还列出后面的n行

-B n

n为正整数,表示before的意思,除了列出匹配行之外,还列出前面的n行

--color=auto

将输出中的匹配项设置为自动颜色显

使用

位置

查找/etc/group文件中以"shiyanlou"为开头的行

$ grep 'shiyanlou' /etc/group

$ grep '^shiyanlou' /etc/group

数量  \n为换行符

# 将匹配以'z'开头以'o'结尾的所有字符串

$ echo 'zero\nzo\nzoo' | grep 'z.*o'

# 将匹配以'z'开头以'o'结尾,中间包含一个任意字符的字符串

$ echo 'zero\nzo\nzoo' | grep 'z.o'

# 将匹配以'z'开头,以任意多个'o'结尾的字符串

$ echo 'zero\nzo\nzoo' | grep 'zo*'

选择

# grep默认是区分大小写的,这里将匹配所有的小写字母

$ echo '1234\nabcd' | grep '[a-z]'

# 将匹配所有的数字

$ echo '1234\nabcd' | grep '[0-9]'

# 将匹配所有的数字

$ echo '1234\nabcd' | grep '[[:digit:]]'

# 将匹配所有的小写字母

$ echo '1234\nabcd' | grep '[[:lower:]]'

# 将匹配所有的大写字母

$ echo '1234\nabcd' | grep '[[:upper:]]'

# 将匹配所有的字母和数字,包括0-9,a-z,A-Z

$ echo '1234\nabcd' | grep '[[:alnum:]]'

# 将匹配所有的字母

$ echo '1234\nabcd' | grep '[[:alpha:]]'

 

 

特殊符号

说明

[:alnum:]

代表英文大小写字母及数字,亦即 0-9, A-Z, a-z

[:alpha:]

代表任何英文大小写字母,亦即 A-Z, a-z

[:blank:]

代表空白键与 [Tab] 按键两者

[:cntrl:]

代表键盘上面的控制按键,亦即包括 CR, LF, Tab, Del.. 等等

[:digit:]

代表数字而已,亦即 0-9

[:graph:]

除了空白字节 (空白键与 [Tab] 按键) 外的其他所有按键

[:lower:]

代表小写字母,亦即 a-z

[:print:]

代表任何可以被列印出来的字符

[:punct:]

代表标点符号 (punctuation symbol),亦即:" ' ? ! ; : # $...

[:upper:]

代表大写字母,亦即 A-Z

[:space:]

任何会产生空白的字符,包括空白键, [Tab], CR 等等

[:xdigit:]

代表 16 进位的数字类型,因此包括: 0-9, A-F, a-f 的数字与字节

使用特殊符号,是因为上面的[a-z]不是在所有情况下都管用,这还与主机当前的语系有关

# 排除字符

$ $ echo 'geek\ngood' | grep '[^o]'

注意:当^放到中括号内为排除字符,否则表示行首

 

 

扩展正则表达式

过grep使用扩展正则表达式需要加上-E参数,或使用egrep。

数量

# 只匹配"zo"

$ echo'zero\nzo\nzoo' | grep -E 'zo{1}'

# 匹配以"zo"开头的所有单词

$ echo'zero\nzo\nzoo' | grep -E 'zo{1,}'

推荐掌握{n,m}即可,+,?,*,这几个不太直观

 选择

# 匹配"www.shiyanlou.com"和"www.google.com"

$ echo'www.shiyanlou.com\nwww.baidu.com\nwww.google.com' | grep -E'www\.(shiyanlou|google)\.com'

# 或者匹配不包含"baidu"的内容

$ echo'www.shiyanlou.com\nwww.baidu.com\nwww.google.com' | grep -Ev 'www\.baidu\.com'

注意:因为.号有特殊含义,所以需要转义。

 

 



 

Sed流编辑器  用于过滤和转换文本的流编辑器 非交互式的编辑器

编辑器有vi/vim emacs gedit

sed 命令基本格式:

sed [参数]... [执行命令] [输入文件]...

# 形如:

$ sed -i '1s/sad/happy/' test # 表示将test文件中第一行的"sad"替换为"happy"

参数

说明

-n

安静模式,只打印受影响的行,默认打印输入数据的全部内容

-e

用于在脚本中添加多个执行命令一次执行,在命令行中执行多个命令通常不需要加该参数

-f filename

指定执行filename文件中的命令

-r

使用扩展正则表达式,默认为标准正则表达式

-i

将直接修改输入文件内容,而不是打印到标准输出设备

sed执行命令格式:

[n1][,n2]command

[n1][~step]command

# 其中一些命令可以在后面加上作用范围,形如:

$ sed -i 's/sad/happy/g' test # g表示全局范围

$ sed -i 's/sad/happy/4' test # 4表示指定行中的第四个匹配字符串

n1,n2表示输入内容的行号,它们之间为, ~波浪号则表示从n1开始以step为步进

的所有行command为执行动作,下面为一些常用动作指令:

命令        说明

s           行内替换

c           整行替换

a           插入到指定行的后面

i           插入到指定行的前面

p           打印指定行,通常与-n参数配合使用

d           删除指定行

sed操作实例

 $ cp/etc/passwd ~  练习的文本

打印指定行

 # 打印2-5行

$ nl passwd | sed -n '2,5p'

# 打印奇数行

$ nl passwd | sed -n '1~2p'

行内替换

# 将输入文本中"shiyanlou" 全局替换为"hehe",并只打印替换的那一行,注意这里不能省略最后的"p"命令

$ sed -n 's/shiyanlou/hehe/gp' passwd

行间替换

$ nl passwd | grep "shiyanlou"

# 删除第21行

$ sed -n '21c\www.shiyanlou.com' passwd

(这里我们只把要删的行打印出来了,并没有真正的删除,如果要删除的话,请使用-i参数)

sed, a stream editor

http://www.gnu.org/software/sed/manual/sed.html

 

 

 




awk文本处理

gawk和mawk之分通常可以直接使用awk命令(awk语言的解释器),因为系统已经为我们创建好了awk指向mawk的符号链接。

$ ll /usr/bin/awk

$ pattern {action} pattern通常是表示用于匹配输入的文本的“关系式”或“正则表达式”,action则是表示匹配后将执行的动作,将文本分割成一些“字段”,然后再对这些字段进行处理,默认情况下,awk以空格作为一个字段的分割符,不过这不是固定了,你可以任意指定分隔符

 

awk命令基本格式=

awk [-F fs] [-v var=value] [-f prog-file | 'programtext'] [file...]

-F 字段分隔符 –v 为awk程序指定变量  -f 指定awk命令要执行的程序文件

 

使用awk将文本内容打印到终端

# "quote>" 不用输入

$ awk '{

> print

> }' test

# 或者写到一行

$ awk '{print}' test

 

NR表示当前读入的记录数,OFS表示输出时的字段分隔符默认为" "空格,awk内建的变

awk常用的内置变量

变量名

说明

FILENAME

当前输入文件名,若有多个文件,则只表示第一个。如果输入是来自标准输入,则为空字符串

$0

当前记录的内容

$N

N表示字段号,最大值为NF变量的值

FS

字段分隔符,由正则表达式表示,默认为" "空格

RS

输入记录分隔符,默认为"\n",即一行为一个记录

NF

当前记录字段数

NR

已经读入的记录数

FNR

当前输入文件的记录数,请注意它与NR的区别

OFS

输出字段分隔符,默认为" "空格

ORS

输出记录分隔符,默认为"\n"

一. AWK入门指南— AWK程序设计语言

http://awk.readthedocs.io/en/latest/chapter-one.html

 

 

 

 



Linux下的软件安装

apt 包管理工具

最早被设计成dpkg的前端,用来处理deb格式的软件包, 安装在支持RPM的系统管理RPM包,包管理器包含以apt- 开头的的多个工具,如 apt-get apt-cache apt-cdrom 等

定期从服务器上下载一个软件包列表, sudo apt-get update

表里会有软件依赖信息的记录,某个软件安装前必须安装的其他软件就是依赖关系

 apt-get 是用于处理 apt包的公用程序集,我们可以用它来在线安装、卸载和升级软件包

          

工具

说明

install

其后加上软件包名,用于安装一个软件包

update

从软件源镜像服务器上下载/更新用于更新本地软件源的软件包列表

upgrade

升级本地可更新的全部软件包,但存在依赖问题时将不会升级,通常会在更新之前执行一次update

dist-upgrade

解决依赖关系并升级(存在一定危险性)

remove

移除已安装的软件包,包括与被移除软件包有依赖关系的软件包,但不包含软件包的配置文件

autoremove

移除之前被其他软件包依赖,但现在不再被使用的软件包

purge

与remove相同,但会完全移除软件包,包含其配置文件

clean

移除下载到本地的已经安装的软件包,默认保存在/var/cache/apt/archives/

autoclean

移除已安装的软件的旧版本软件包

下面是一些apt-get常用的参数:

参数

说明

-y

自动回应是否安装软件包的选项,在一些自动化安装脚本中使用这个参数将十分有用

-s

模拟安装

-q

静默安装方式,指定多个q或者-q=#,#表示数字,用于设定静默级别,这在你不想要在安装软件包时屏幕输出过多时很有用

-f

修复损坏的依赖关系

-d

只下载不安装

--reinstall

重新安装已经安装但可能存在问题的软件包

--install-suggests

同时安装APT给出的建议安装的软件包

 

 

安装软件 $ sudo apt-get --reinstall install 软件名

软件升级

 # 更新软件源$ sudo apt-get update

# 升级没有依赖问题的软件包$ sudo apt-get upgrade

# 升级并解决依赖关系$ sudo apt-get dist-upgrade

卸载软件  sudo apt-get remove w3m

 

软件搜索  sudo apt-cache search softname1 softname2 softname3……

apt-cache 命令则是针对本地数据进行相关操作的工具

 

apkg

使用 dpkg 从本地磁盘安装 deb 软件包,安装、卸载和供给和 .deb 软件包相关的信息

dpkg常用参数介绍:

参数

说明

-i

安装指定deb包

-R

后面加上目录名,用于安装该目录下的所有deb安装包

-r

remove,移除某个已安装的软件包

-I

显示deb包文件的信息

-s

显示已安装软件的信息

-S

搜索已安装的软件包

-L

显示已安装软件包的目录信息

使用apt-get加上-d参数只下载不安装,下载emacs编辑器的deb包,下载完成后,我们可以查看/var/cache/apt/archives/目录下的内容

第一个deb拷贝到home目录下,并使用dpkg安装

$ cp/var/cache/apt/archives/emacs24_24.3+1-2ubuntu1_amd64.deb ~

# 安装之前参看deb包的信息

$ sudo dpkg -Iemacs24_24.3+1-2ubuntu1_amd64.deb

直接使用dpkg安装可能会存在一些问题,因为dpkg并不能为你解决依赖关系。

# 使用dpkg安装

$ sudo dpkg -iemacs24_24.3+1-2ubuntu1_amd64.deb  报错

修复依赖关系的安装

$ sudo apt-get-f install

使用dpkg -L查看deb包目录信息

$ sudo dpkg -Lemacs

 

 

 

 



 

Linux进程

 fork() 是一个系统调用(system call),它的主要作用就是为当前的进程创建一个新的进程,这个新的进程就是它的子进程,这个子进程除了父进程的返回值和 PID 以外其他的都一模一样,如进程的执行代码段,内存信息,文件描述,寄存器状态等等

exec() 也是系统调用,作用是切换子进程中的执行程序也就是替换其从父进程复制过来的代码段与数据段

fork() 就是把父进程的 PCB 等进程的数据结构信息直接复制过来,只是修改了 PID,所以一模一样,只有在执行 exec() 之后才会不同,而早先的 fork() 比较消耗资源后来进化成 vfork(),效率高了不少

  pid_t p;

p = fork();

if (p == (pid_t) -1)

        /* ERROR */

else if (p == 0)

        /* CHILD */

Else

 

僵尸进程:父进程没有获取子进程的退出状态,然后内核就可以从内存中释放已结束的子进程的 PCB,子进程的 PCB 就会一直驻留在内存中

孤儿进程:如果父进程结束(非正常的结束),未能及时收回子进程,子进程仍在运行,最终被init收养

查看进程关系  pstree

查看指定进程信息 ps -fxo user,ppid,pid,pgid,command  使用者父进程号本进程号进程组 command表示的是该进程通过执行什么样的命令或者脚本而产生的

进程使用 getpgrp() 系统调用来寻找其所在组的 PGID,领导进程可以先终结,此时进程组然存在,并持有相同的PGID,直到进程组中最后一个进程终结。

Session主要是针对一个 tty 建立,Session中的每个进程都称为一个工作(job)

前台(foreground)就是在终端中运行,能与你有交互的

后台(background)就是在终端中运行,但是你并不能与其任何的交互,也不会显示其执行的过程

bash(Bourne-Againshell)支持工作控制(job control),而 sh(Bourne shell)并不支持,bash 只能管理当前终端的中的 job,不能管理其他终端中的 job,程在前台运作时我们可以用 ctrl + c 来终止它,将它放到后台运行

通过 & 这个符号,让我们的命令在后台中运行

ls&

被停止并放置在后台的工作我们可以使用这个命令来查看

Jobs  + 表示最近(刚刚、最后)被放置后台的 job  - 表示倒数第二(也就是在预设之前的一个)被放置后台的工作

将后台的工作拿到前台来

#后面不加参数提取预设工作,加参数提取指定工作的编号

#ubuntu在 zsh 中需要 %,在 bash 中不需要 %

fg[%jobnumber]

删除一个工作

#kill的使用格式如下

kill-signal %jobnumber

#signal从1-64个信号值可以选择,可以这样查看

kill-l

  

信号值

作用

-1

重新读取参数运行,类似与restart

-2

如同 ctrl+c 的操作退出 

-9

强制终止该任务   

-15

正常的方式终止该任务

 

 进程管理

通过 top 实时得查看进程的状态,以及系统的一些信息(如 CPU、内存信息等),我们还可以通过 ps 来静态查看当前的进程信息,同时我们还可以使用 pstree 来查看当前活跃进程的树形结构。


top 工具的使用—实时

$top

我们看到 top 显示的第一排,

内容

解释

top

表示当前程序的名称

11:05:18

表示当前的系统的时间

up 8 days,17:12

表示该机器已经启动了多长时间

1 user

表示当前系统中只有一个用户

load average: 0.29,0.20,0.25

分别对应1、5、15分钟内cpu的平均负载

 单 CPU、单内核的,把它比喻成是一条单向的桥,把CPU任务比作汽车。

load = 0 的时候意味着这个桥上并没有车,cpu 没有任何任务;

load< 1 的时候意味着桥上的车并不多,一切都还是很流畅的,cpu 的任务并不多,资源还很充足;

load= 1 的时候就意味着桥已经被车给沾满了,没有一点空隙,cpu 的已经在全力工作了,所有的资源都被用完了,当然还好,这还在能力范围之内,只是有点慢而已;

load > 1 的时候就意味着不仅仅是桥上已经被车占满了,就连桥外都被占满了,cpu 已经在全力的工作了,系统资源的用完了,但是还是有大量的进程在请求,在等待。若是这个值大于2,大于3,超过 CPU 工作能力的 2,3。而若是这个值 > 5 说明系统已经在超负荷运作了。

 

查看 CPU 的个数与核心数

#查看物理CPU的个数

#cat /proc/cpuinfo |grep "physical id"|sort|uniq|wc -l

#每个cpu的核心数

cat /proc/cpuinfo |grep "physical id"|grep"0"|wc –l

 若是 load < 0.7 并不会去关注他;

若是 0.7< load < 1 的时候我们就需要稍微关注一下了,虽然还可以应付但是这个值已经离临界不远了;

若是 load = 1 的时候我们就需要警惕了,因为这个时候已经没有更多的资源的了,已经在全力以赴了;

若是 load > 5 的时候系统已经快不行了,这个时候你需要加班解决问题了

先看 15 分钟的值来看这个大体的趋势,然后再看 5 分钟的值对比来看是否有下降的趋势

来看 top 的第二行数据,基本上第二行是进程的一个情况统计

内容 解释

Tasks: 26 total  进程总数 

1 running    1个正在运行的进程数

25 sleeping  25个睡眠的进程数

0 stopped     没有停止的进程数

0 zombie 没有僵尸进程数

来看 top 的第三行数据,这一行基本上是 CPU 的一个使用情况的统计了

内容 解释

Cpu(s): 1.0%us   用户空间进程占用CPU百分比

1.0% sy  内核空间运行占用CPU百分比

0.0%ni   用户进程空间内改变过优先级的进程占用CPU百分比

97.9%id  空闲CPU百分比

0.0%wa   等待输入输出的CPU时间百分比

0.1%hi   硬中断(Hardware IRQ)占用CPU的百分比

0.0%si   软中断(Software IRQ)占用CPU的百分比

0.0%st   (Stealtime) 是 hypervisor 等虚拟服务中,虚拟 CPU 等待实际 CPU 的时间的百分比

CPU 利用率是对一个时间段内 CPU 使用状况的统计,通过这个指标可以看出在某一个时间段内 CPU 被占用的情况,而 Load Average 是 CPU 的 Load,它所包含的信息不是 CPU 的使用率状况,而是在一段时间内 CPU 正在处理以及等待 CPU 处理的进程数情况统计信息,这两个指标并不一样。

 

来看 top 的第四行数据,这一行基本上是内存的一个使用情况的统计了:

内容 解释

8176740 total    物理内存总量

8032104 used 使用的物理内存总量

144636 free  空闲内存总量

313088 buffers   用作内核缓存的内存量

注意

系统的中可用的物理内存最大值并不是 free 这个单一的值,而是 free + buffers + swap 中的 cached 的和

来看 top 的第五行数据,这一行基本上是交换区的一个使用情况的统计了

 

内容 解释

total    交换区总量

used 使用的交换区总量

free 空闲交换区总量

cached   缓冲的交换区总量,内存中的内容被换出到交换区,而后又被换入到内存,但使用过的交换区尚未被覆盖

在下面就是进程的一个情况了

列名 解释

PID    进程id

USER 该进程的所属用户

PR   该进程执行的优先级 priority 值

NI   该进程的 nice 值

VIRT 该进程任务所使用的虚拟内存的总数

RES  该进程所使用的物理内存数,也称之为驻留内存数

SHR  该进程共享内存的大小

S    该进程进程的状态: S=sleep R=running Z=zombie

%CPU 该进程CPU的利用率

%MEM 该进程内存的利用率

TIME+    该进程活跃的总时间

COMMAND  该进程运行的名字

NICE 值叫做静态优先级,是用户空间的一个优先级值,其取值范围是-20至19。这个值越小,表示进程”优先级”越高,而值越大  0 是默认的值,而 19 优先级最低

PR 值表示 Priority 值叫动态优先级, 是进程在内核中实际的优先级值, 取值范围是通过一个宏定义的,这个宏的名称是MAX_PRIO,它的值为 140。Linux 实际上实现了 140 个优先级范围,取值范围是从 0-139,这个值越小,优先级越高。而这其中的 0 - 99 是实时进程的值,而 100 - 139 是给用户的。

PR = 20 + (-20 to +19),这里的 -20 to +19 便是nice值

 

top 是一个前台程序,所以是一个可以交互的

常用交互命令 解释

q    退出程序

I    切换显示平均负载和启动时间的信息

P    根据CPU使用百分比大小进行排序

M    根据驻留内存大小进行排序

i    忽略闲置和僵死的进程,这是一个开关式命令

k    终止一个进程,系统提示输入 PID 及发送的信号值。一般终止进程用 15 信号,不能正常结束则使用 9 信号。安全模式下该命令被屏蔽。

 

Ps工具的使用--最常用的查看进程的工具

Psaux   所有的进程信息

Psaxjf 

ps-l 参数可以显示自己这次登陆的 bash 相关的进程信息罗列出来

psaux | grep zsh 配合着 grep 和正则表达式一起使用

psaxjf连同部分的进程呈树状显示出来

ps-afxo user,ppid,pid,pgid,command定义我们所需要的参数显示

 

内容    解释

F  进程的标志(process flags),当 flags 值为 1 则表示此子程序只是 fork 但没有执行exec,为 4 表示此程序使用超级管理员 root 权限

USER    进程的拥有用户

PID 进程的 ID

PPID    其父进程的 PID

SID session 的 ID

TPGID   前台进程组的 ID

%CPU    进程占用的 CPU 百分比

%MEM    占用内存的百分比

NI  进程的 NICE 值

VSZ 进程使用虚拟内存大小

RSS 驻留内存中页的大小

TTY 终端 ID

Sor STAT   进程状态

WCHAN   正在等待的进程资源

START     启动进程的时间

TIME    进程消耗CPU的时间

COMMAND 命令的名称和参数 

TPGID栏写着-1的都是没有控制终端的进程,也就是守护进程

 

STAT表示进程的状态,而进程的状态有很多,如下表所示

状态    解释

R   Running.运行中

S   Interruptible Sleep.等待调用

D   Uninterruptible Sleep.不可中断睡眠

T   Stoped.暂停或者跟踪状态

X   Dead.即将被撤销

Z   Zombie.僵尸进程

W   Paging.内存交换

N   优先级低的进程

<   优先级高的进程

s   进程的领导者

L   锁定状态

l   多线程状态

+   前台进程

其中的 D 是不能被中断睡眠的状态,处在这种状态的进程不接受外来的任何 signal,所以无法使用 kill 命令杀掉处于D状态的进程,无论是 kill,kill -9 还是kill -15,一般处于这种状态可能是进程 I/O 的时候出问题了。

 

Kill进程

#首先我们使用图形界面打开了 gedit、gvim,用 ps 可以查看到

psaux

#使用9这个信号强制结束 gedit 进程

kill-9 1608

#我们在查找这个进程的时候就找不到了

psaux | grep gedit

 

#打开一个程序放在后台,或者用图形界面打开

nice-n -5 vim &

#用 ps 查看其优先级

ps-afxo user,ppid,pid,stat,pri,ni,time,command | grep vim

renice来修改已经存在的进程的优先级,同样因为权限的原因在实验环境中无法尝试

renice-5 pid

 

 

 

 

    

   

Linux日志系统

日志一般存放在 /var/log 中: ll /var/log

日志分为两类:

系统日志 存放系统内置程序或系统内核之类的日志信息如 alternatives.log 、btmp

 应用日志  第三方应用所产生的日志如 tomcat7 、apache2

日志名称   记录信息

alternatives.log   系统的一些更新替代信息记录

apport.log 应用程序崩溃信息记录

apt/history.log    使用 apt-get 安装卸载软件的信息记录

apt/term.log   使用 apt-get 时的具体操作,如 package 的下载、打开等

auth.log   登录认证的信息记录

boot.log   系统启动时的程序服务的日志信息

btmp   错误的信息记录

Consolekit/history 控制台的信息记录

dist-upgrade   dist-upgrad(⊙o⊙)哦这种更新方式的信息记录

dmesg      启动时,显示屏幕上内核缓冲信息,与硬件有关的信息

dpkg.log   dpkg 命令管理包的日志。

faillog    用户登录失败详细信息记录

fontconfig.log 与字体配置有关的信息记录

kern.log      内核产生的信息记录,在自己修改内核时有很大帮助

lastlog       用户的最近信息记录

wtmp          登录信息的记录。wtmp可以找出谁正在进入系统,谁使用命令显示这个文件或信息等

syslog         系统信息记录

 

alternatives.log 中的信息

update-alternatives 2016-07-02 13:36:16: run with--install /usr/bin/x-www-browser x-www-browser /usr/bin/google-chrome-stable200

update-alternatives2016-07-02 13:36:16: run with --install /usr/bin/gnome-www-browsergnome-www-browser /usr/bin/google-chrome-stable 200

update-alternatives2016-07-02 13:36:16: run with --install /usr/bin/google-chrome google-chrome/usr/bin/google-chrome-s

 

 

auth.log 中的信息

less auth.log

apt 文件夹中的日志信息

history.log 与 term.loghistory.log 主要记录了进行了那个操作,相关的依赖有哪些,而term.log 则是较为具体的一些操作,主要就是下载包,打开包,安装包等等的细节操作,

 less/var/log/apt/history.log

less /var/log/apt/term.log

两个日志并不是 ASCII 文件而是被编码成了二进制文件

使用 last 与 lastlog 工具来提取其中的信息

 

配置的日志

      通过两种方式:

一种是由软件开发商自己来自定义日志格式然后指定输出日志位置;

一种方式就是 Linux 提供的日志服务程序,而我们这里系统日志是通过 syslog 来实现,提供日志管理服务。

syslog 是一个系统日志记录程序 被 rsyslog 所代替

手动开启这项服务,然后来查看

sudo service rsyslog start

ps aux | grep syslog

rsyslog 的配置文件有两个,

一个是 /etc/rsyslog.conf   配置的环境rsyslog 的加载什么模块文件的所属者

一个是 /etc/rsyslog.d/50-default.conf。配置的 FilterConditions

vim /etc/rsyslog.conf

vim /etc/rsyslog.d/50-default.conf

 

rsyslog 的结构框架,数据流的走向


rsyslog 主要是由 Input、Output、Parser 这样三个模块构成的,每秒一百万条消息给目标文件,怎么只是这样简单的结



 第一个模块便是 Input,该模块的主要功能就是从各种各样的来源收集 messages,通过这些接口实现:

接口名    作用

im3195    RFC3195 Input Module

imfile    Text File Input Module

imgssapi    GSSAPI Syslog Input Module

imjournal   Systemd Journal Input Module

imklog  Kernel Log Input Module

imkmsg  /dev/kmsg Log Input Module

impstats    Generate Periodic Statistics of InternalCounters

imptcp  Plain TCP Syslog

imrelp  RELP Input Module

imsolaris   Solaris Input Module

imtcp   TCP Syslog Input Module

imudp   UDP Syslog Input Module

imuxsock    Unix Socket Input

rsyslog 支持三种配置语法格式:

sysklogd 老的简单格式,一些新的语法特性不支持

legacyrsyslog  以 dollar 符($)开头的语法 插件和特性只在此语法下支持。而以 $ 开头的指令是全局指令

RainerScript

 

注释有两种语法:

井号 #     C-style /* .. */

执行顺序: 指令在 rsyslog.conf 文件中是从上到下的顺序执行的。

 

/etc/rsyslog.d/50-default.conf这个配置文件,这个文件中主要是配置的 Filter Conditions

主要由两部分组成,facility与 priority,其配置格式如下

facility.priority     log_location

 

Facility 的种类有:

类别    解释

kern    内核消息

user    用户信息

mail    邮件系统消息

daemon  系统服务消息

auth    认证系统

authpriv    权限系统

syslog  日志系统自身消息

cron    计划安排

news    新闻信息

local0~7    由自定义程序使用

优先级的类别有一下几种:

 

类别    解释

emergency   系统已经无法使用了

alert   必须立即处理的问题

critical    很严重了

error   错误

warning 警告信息

notice  系统正常,但是比较重要

informational   正常

debug   debug的调试信息

panic   很严重但是已淘汰不常用

none    没有优先级,不记录任何日志消息

 

auth,authpriv.*      /var/log/auth.log

这里的意思是 auth 与 authpriv 的所有优先级的信息全都输出于 /var/log/auth.log 日志中

kern.*      -/var/log/kern.log - 代表异步写入,也就是日志写入时不需要等待系统缓存的同步

 

logger 是一个 shell 命令接口,可以通过该接口使用 Syslog 的系统日志模块,还可以从命令行直接向系统日志文件写入信息。

#首先将syslog启动起来

sudo servicersyslog start

#向 syslog 写入数据

ping127.0.0.1 | logger -it logger_test -p local3.notice &

#查看是否有数据写入

tail -f/var/log/syslog

参数    内容

-i 在每行都记录进程 ID

-t 添加 tag 标签

-p 设置日志的 facility 与 priority

 

 转储日志

logrotate 程序是一个日志文件管理工具。用来把旧的日志文件删除,并创建新的日志文件。我们可以根据日志文件的大小,也可以根据其天数来切割日志、管理日志,这个过程又叫做“转储”

其脚本是 /etc/cron.daily/logrotate;同时我们可以在 /etc/logrotate 中找到其配置文件

cat/etc/logrotate

其中的具体意思是什么呢?

 

#see "man logrotate" for details //可以查看帮助文档

#rotate log files weekly

weekly                             //设置每周转储一次(daily、weekly、monthly当然可以使用这些参数每天、星期,月 )

#keep 4 weeks worth of backlogs

rotate4                           //最多转储4次

#create new (empty) log files after rotating old ones

create                             //当转储后文件不存在时创建它

#uncomment this if you want your log files compressed

compress                          //通过gzip压缩方式转储(nocompress可以不压缩)

#RPM packages drop log rotation information into this directory

include/etc/logrotate.d           //其他日志文件的转储方式配置文件,包含在该目录下

#no packages own wtmp -- we'll rotate them here

/var/log/wtmp{                    //设置/var/log/wtmp日志文件的转储参数

    monthly                        //每月转储

    create 0664 root utmp          //转储后文件不存在时创建它,文件所有者为root,所属组为utmp,对应的权限为0664

    rotate 1                       //最多转储一次

}


Logo

更多推荐