【Linux】Linux操作系统常用命令

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/ARPOSPF/article/details/84826979

Linux操作系统常用命令


LInux基本命令

  • ~:代表当前用户所在的home目录。如:/home/zhangsan
  • $:用来只是普通用户输入命令的地方;对于root用户来说一般是‘#’
  • cat:查看文件,与‘<<END’连用可以用于输入大段数据
  • >:重定向符号,即把前面命令的输出写入到‘>’后面的文件中。
  • ls -l:列出文件的详细信息,还可加上-h参数,方便读取文件大小
  • man ls:查看ls所有的命令行参数,上下箭头翻页,q退出查看
  • cd:切换目录
  • head:查看文件最开始的几行,默认是10行,可以使用-n 30指定查看前30行
  • less,more也可以查看文件,尤其是文件内容特别多的时候
  • tac:文件翻转
  • rev:每列反转

Linux文件操作

  • nano:创建、编辑文件,类似于记事本。nano filename新建一个文件,并在里面写内容;ctrl+x退出,根据提示按Y保存
  • vim:强大的文本编辑器。vim filename 新建一个文件,按i进入写作模式。写完后,按ESC,退出写作模式,输入:wq,保存退出
  • cp:拷贝文件或目录(cp -r拷贝文件夹时的参数,递归拷贝)
  • mv:移动或重命名文件或目录
  • rename:文件重命名(常用于批量重命名,不同的系统可能用法略有不同,使用前先man rename查看使用方法)
  • ln: 给文件建立快捷方式 (ln -s source_file target 创建软连接)
    • 在建立软连接时,源文件要使用绝对路径
    • 建立软连接是为了在不增加磁盘存储的情况下,简化文件访问的一种方式
  • ../:表示上一层目录;../../:表示上面两层目录
  • ·:为键盘ESC下的第一个键,又名反引号键,写在反引号内的命令会被运行,运行结果会放置在反引号所在的位置

Linux文件内容操作

  • gzip:压缩文件;gunzip:解压缩文件,gzip -c 表示把压缩的文件输出到标准输出(一般是屏幕)
  • wc:word count,一般使用wc -l获取文件的行数
  • grep:print lines matching a pattern,获取符合要求的行数或文件内容,支持正则表达式匹配,添加'-v'表示不输出匹配的行
  • sed:替换文件中的字符,是一个功能强大的文件内容编辑工具,常用于替换,获取行号等操作
# 第一个错误,漏掉了文件名
# 程序静止在这,等待用户的进一步输入
# ctrl+c杀掉当前命令
ct@ehbio:~/ehbio_project$ sed 's/ HAHA//' | tail -n 3

^C

# 第二个错误,文件名和单引号之间没有空格,使得sed判断命令错误

ct@ehbio:~/ehbio_project$ sed 's/ HAHA//'ehbio.fa  | tail -n 3
sed:-e 表达式 #1,字符 11:“s”的未知选项

# 正确操作,

ct@ehbio:~/ehbio_project$ sed 's/ HAHA//' ehbio.fa  | tail -n 4
>mYC
ACGGAGCGAGCTAGTGCAGCGAGGAGCTGAGTCGAGC
CAGGACAGGAGCTA
end
  • 另外一个方式,去除HAHA,使用cut命令 (cut更适合与矩阵操作,去除其中的一列或者多列)。
    • -f:指定取出哪一列,使用方法为-f 2 (取出第2列),-f 2-5 (取出第2-5列),-f 2,5 (取出第2和第5列)。
    • -d:设定分隔符, 默认为TAB键。如果一行没有指定的分隔符,整行都为第一列。
ct@ehbio:~/ehbio_project$ cut -f 1 -d ' ' ehbio.fa | tail -n 4
>mYC
ACGGAGCGAGCTAGTGCAGCGAGGAGCTGAGTCGAGC
CAGGACAGGAGCTA
end

Linux的标准输入、输出、重定向、管道操作

  • 默认Linux的命令的结果都是输出到标准输出,错误信息 (比如命令未找到或文件格式识别错误等) 输出到标准错误,而标准输出和标准错误默认都会显示到屏幕上。
  • >:表示重定向标准输出,> filename就是把标准输出存储到文件filename里。标准错误还是会显示在屏幕上
  • 2 >&1:表示把标准错误重定向到标准输出。Linux终端用2表示标准错误,1表示标准输出
  • -:短横线,表示标准输入,一般用于1个程序需要多个输入的时候
  • <:标准输入,后面可以跟产生输出的命令,一般用于1个程序需要多次输入的时候。
  • |:管道符,表示把前一个命令的输出作为后一个命令的输入,用于数据在不同的命令之间传输,减少磁盘存取损耗。
  • tr:用于替换字符
  • diff:用于比较2个文件的差异,需要两个参数
# 管道符的使用
# 第一个命令的输出作为第二个的输入
# 前面的例子中也有使用
# tr: 是用于替换字符的,把空格替换为换行,文字就从一行变为了一列
ct@ehbio:~$ echo "1 2 3" | tr ' ' '\n'
1
2
3

# cat命令之前也用过,输出一段文字
# diff是比较2个文件的差异的,需要2个参数
# - (短横线)表示上一个命令的输出,传递给diff
# < 表示其后的命令的输出,也重定向给diff
ct@ehbio:~$ cat <<END | diff - <(echo "1 2 3" | tr ' ' '\n')
> 2
> 3
> 4
> END
0a1
> 1
3d3
< 4

# 如果不使用管道和重定向标准输入,程序是这么写的

# 先把第一部分存储为1个文件
ct@ehbio:~$ cat <<END >firstfile
2
3
> 4
> END
ct@ehbio:~$ less firstfile 

# 再把第二部分存储为1个文件
ct@ehbio:~$ echo "1 2 3" | tr ' ' '\n' >secondfile

# 然后比较
ct@ehbio:~$ diff firstfile secondfile 
0a1
> 1
3d3
< 4
ct@ehbio:~$ echo  "actg aaaaa cccccg" | tr ' ' '\n' | wc -l
3

# sed =:先输出行号,再输出每行的内容
ct@ehbio:~$ echo  "a b c" | tr ' ' '\n' | sed =  
1
a
2
b
3
c

# 后面这个命令不太好解释
# sed = 同时输出行号
# N: 表示读入下一行;sed命令每次只读一行,加上N之后就是缓存了第2行,所有的操作都针对第一行;
# s: 替换;把换行符替换为\t
ct@ehbio:~$ echo  "a b c" | tr ' ' '\n' | sed = | sed 'N;s/\n/\t/' 
1    a
2    b
3    c

# 后面这个命令不太好解释
# sed = 同时输出行号
# N: 表示读入下一行;sed命令每次只读一行,加上N之后就是缓存了第2行,所有的操作都针对第一行;
# s: 替换;把读取的奇数行行首加一个'>'(偶数行相当于被隐藏了)
ct@ehbio:~$ echo  "a b c" | tr ' ' '\n' | sed = | sed 'N;s/^/>/' 
>1
a
>2
b
>3
c

# 把多条序列转成FATSA格式
# sed = 同时输出行号
# N: 表示读入下一行;sed命令每次只读一行,加上N之后就是缓存了第2行,所有的操作都针对第一行;
# s: 替换;把读取的奇数行行首加一个'>'(偶数行相当于被隐藏了)
# 于是FASTA格式序列就出来了
ct@ehbio:~$ echo  "actg aaaaa cccccg" | tr ' ' '\n' | sed = | sed 'N;s/^/>/' 
>1
actg
>2
aaaaa
>3
cccccg

Linux的常见错误和快捷操作

  • 常见错误
    • 命令不全:在命令没有输入完整后就按下Enter键,终端会提示出一个>,以示继续输入,也可以ctrl+c终止输入,重新编辑
    • 文件名输入错误:多一个字母,少一个字母,大小写的问题
    • 所在目录不对:访问的目录不存在于当前目录,而又没有提供绝对路径,或软连接失效
  • 快捷操作
    • 命令或文件名自动补全:在输入命令或文件名的前几个字母后,按Tab键,系统会自动补全或提示补全
    • 上下箭头:可以回溯之前的命令,增加命令的重用
    • !加之前输入过的命令的前几个字母,快速获取前面的命令
    • ctrl+a:回到命令的行首,用于修改常用命令或注释掉命令
    • !!:表示上一条命令
    • 替换上一个命令中的字符,再运行一遍命令,用于需要对多个文件执行同样的命令,又不想写循环的情况
# 输入一个命令
ct@ehbio:~/ehbio_project$ #cut -f 1 -d ' ' ehbio.fa | tail -n 4

# !!表示上一条命令
# :gs表示替换,把上一个命令中全部的ehbio替换为ehbio3; g: global; s: substitute
ct@ehbio:~/ehbio_project$ !!:gs/ehbio/ehbio3
#cut -f 1 -d ' ' ehbio3.fa | tail -n 4

# 替换后效果如上

# 去掉命令前的#号
ct@ehbio:~/ehbio_project$ cut -f 1 -d ' ' ehbio3.fa | tail -n 4
>mYC
ACGGAGCGAGCTAGTGCAGCGAGGAGCTGAGTCGAGC
CAGGACAGGAGCTA
end

## 替换ehbio3为ehbio4,直接运行命令
ct@ehbio:~/ehbio_project$ !!:gs/ehbio3/ehbio4
cut -f 1 -d ' ' ehbio4.fa | tail -n 4
>mYC
ACGGAGCGAGCTAGTGCAGCGAGGAGCTGAGTCGAGC
CAGGACAGGAGCTA
end

Linux的环境变量和权限管理

Linux下文件有一个特殊的属性即可执行属性,用来指示这个文件是一个可执行的脚本或可以运行的二进制文件。前面所提到的这些命令,都具有可执行属性。

  • which:表示查看命令的路径。一般用于当我们想知道使用的命令来源于什么地方时。
  • 文件属性rwxr表示read (数字表示为4)、w表示write (数字表示为2)、x表示执行 (数字表示为1)。三个为一组,连续出现三次(如下面命令行中所示), 第一组表示文件的所有者拥有的权限,第二组为文件所有者所在的用户组所拥有的权限,组内所有成员都具有的权限,第三组为其它用户的权限。
    • chmod a+x file: 表示给文件增加所有人(a)可执行权限 (+x)
    • chmod u+x file: 表示给文件增加所有者(u,user,)可执行权限 (+x)
    • chmod g+x, chmod o+X: 表示给文件增加组内人或其它人可执行权限
    • chmod 755 file: 表示拥有者有可读写执行权限,其它人有可读执行权限。(7=4+2+1; 5=4+1)
  • 环境变量:通俗的讲,环境变量就是告诉电脑 (实际是操作系统)几个目录。这几个目录下存储有可执行文件,如前面显示的/usr/bin目录,大部分的系统命令都在这个目录下。
    • 系统中环境变量的名字是PATH,其内容可通过下面的命令显示 (根据操作系统不同和配置不同,略有差别,但格式是统一的,:分割的一堆路径):
ct@iZ8vb3e9jtel4m99ss6e7eZ:~$ echo $PATH
/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin
  • 如果我们想让自己的命令能被系统找到,就需要把命令所在的目录加到环境变量里面,怎么操作呢?加到环境变量的路径必须是全路径,全路径指以/开头或已~开头的路径。
  • 对于普通用户,在远程登录终端时,home目录下的~/.bash_profile (不是~/.bashrc)会自动被读取,所以需要把export语句加入到这个文件中。
  • 系统查找命令的顺序是从环境变量的第一个目录到最后一个目录,在第一次碰到查询的命令后,就调用执行。假如系统存在一个python命令,我们自己又安装了一个python (假如在/home/ct/anaconda/bin目录下),如果我们想执行自己的python程序,就需要把/home/ct/anaconda/bin写在$PATH前面,如下
# 注意$PATH的顺序

ct@iZ8vb3e9jtel4m99ss6e7eZ:~$ export PATH=/home/ct/anaconda/bin:$PATH
  • PATH只是众多环境变量中的一个变量,用于存储可执行文件所在的目录,以便在用户输入命令时可以查询的到。尤其是自己写的脚本或安装的程序,系统不会知道它们在哪个路径下,需要我们去提供给系统这些新的路径,学名叫设置环境变量。
  • 常用到的环境变量还有LD_LIBARY_PATH: 指定动态链接库 (so文件)的位置,一般在安装软件出错时会用到;PYTHONPATH: 指定Python的安装包的路径;PERL5LIB: 指定perl的安装包的路径。
  • 设置环境变量要注意2点:
    • 1. 设置新的环境变量时一般要包含原始的环境变量,不能覆盖;
    • 2. 注意自己的目录和系统环境变量的目录的顺序,想让哪个先被找到,就先放哪个。

Linux的文件排序

  • seq:产生一系列的数组;man seq查看其具体使用
  • sort:排序,默认按字符编码排序。如果想按数字大小排序,需添加-n参数
  • sort -u: 去除重复的行,等同于sort | uniq
  • sort file | uniq -d:获得重复的行。(d=duplication)
  • sort file | uniq -c:获得每行重复的次数
  • awk:是一个强大的文本处理工具,其处理数据模式为按行处理。每次读入一行,进行操作。OFS: 输出文件的列分隔符 (output file column separtor);FS为输入文件的列分隔符 (默认为空白字符)。awk中的列从第1到n列,分别记录为$1, $2$nBEGIN表示在文件读取前先设置基本参数;与之相对应的是END,只文件读取完成之后进行操作。不以BEGIN, END开头的{}就是文件读取、处理的部分。
  • sedtr都为最常用的字符替换工具

Linux服务器数据定期同步和备份方式

  • 最简单的备份方式,就是使用cp (本地硬盘)或scp (远程硬盘)命令,给自己的结果文件新建一个拷贝;每有更新,再拷贝一份。
  • 为了实现定期备份,可以把上述命令写入crontab程序中,设置每天的晚上23:00执行。对于远程服务器的备份,可以配置免密码登录,便于自动备份。后台输入免密码登录服务器,获取免密码登录服务器的方法。
# Crontab format
# Minute  Hour  Day  Month  Week  command 
# * 表示每分/时/天/月/周
# 每天23:00 执行cp命令
0          23      *       *       *      cp -fur source_project project_bak
# */2 表示每隔2分分/时/天/月/周执行命令
# 每隔24小时执行cp命令
0          */24      *       *       *      cp -fur source_project project_bak
0          0          */1     *        *     scp -r source_project user@remote_server_ip:project_bak

# 另外crotab还有个特殊的时间
# @reboot: 开机运行指定命令
@reboot cmd
  • rsync:是一个增量备份工具,只针对修改过的文件修改过的部分进行同步备份,大大缩短了传输的文件的数量和传输时间。rsync所做的工作为镜像,保证远端服务器与本地文件的统一。如果本地文件没问题,远端也不会有问题。但如果发生误删或因程序运行错误,导致文件出问题,而在同步之前又没有意识到的话,远端的备份也就没了备份的意义,因为它也被损坏了。误删是比较容易发现的,可以及时矫正。但程序运行出问题,则不一定了。具体使用如下 :
# 把本地project目录下的东西备份到远程服务器的/backup/project目录下
# 注意第一个project后面的反斜线,表示拷贝目录内的内容,不在目标目录新建project文件夹。注意与第二个命令的比较,两者实现同样的功能。
# -a: archive mode, quals -rlptgoD
# -r: 递归同步
# -p: 同步时保留原文件的权限设置
# -u: 若文件在远端做过更新,则不同步,避免覆盖远端的修改
# -L: 同步符号链接链接的文件,防止在远程服务器出现文件路径等不匹配导致的软连接失效
# -t: 保留修改时间
# -v: 显示更新信息
# -z: 传输过程中压缩文件,对于传输速度慢时适用
rsync -aruLptvz --delete project/ user@remoteServer:/backup/project
rsync -aruLptvz --delete project user@remoteServer:/backup/
  • rdiff-backup:不只可以做增量备份,而且会保留每次备份的状态,新备份和上一次备份的差别,可以轻松回到之前的某个版本。唯一的要求就是,本地服务器和远端服务器需要安装统一版本的rdiff-backup。另外还有2款工具 duplicity`Rsnapshot也可以做类似工作,但方法不一样,占用的磁盘空间也不一样,具体可查看原文链接中的比较。具体的rdiff-backup安装和使用如下:

1.Install rdiff-backup at both local and remote computers

# 1.Install requirements
#install for ubuntu, debian
sudo apt-get install python-dev librsync-dev
#self compile
#downlaod rsync-dev from https://sourceforge.net/project/showfiles.php?group_id=56125
tar xvzf librsync-0.9.7.tar.gz
export CFLAGS="$CFLAGS -fPIC"
./configure --prefix=/home/user/rsync --with-pic
make
make install

# 2.Install rdiff-backup
#See Reference part for download link
# http://www.nongnu.org/rdiff-backup/ 
python setup.py install --prefix=/home/user/rdiff-backup
#If you complied rsync-dev yourself, please specify the location of rsync-dev
python setup.py --librsync-dir=/home/user/rsync install --     prefix=/home/user/rdiff-backup

# 3.Add exeutable files and python modules to environmental variables
#Add the following words into .bashrc or .bash_profile or any other config files
export PATH=${PATH}:/home/user/rdiff-backup/bin
export PYTHONPATH=${PYTHONPATH}:/home/user/rdiff-backup/lib/python2.x/site-packages
#pay attention to the x in python2.x of above line which can be 6 or 7 depending on 
#the Python version used.

# 4.Test environmental variable when executing commands through ssh
ssh user@host 'echo ${PATH}' #When I run this command in my local computer, 
                             #I found only system environmetal variable is used 
                             #and none of my self-defined environmetal variable is used.
#Then, I modified the following lines in file 'SetConnections.py' in 
#/home/user/rdiff-backup/lib/python2.x/site-packages/rdiff_backup
#to set environmental explicitly when login.
#pay attention to the single quote used inside double quote
__cmd_schema = "ssh -C %s 'source ~/.bash_profile; rdiff-backup --server'"
__cmd_schema_no_compress = "ssh %s 'source ~/.bash_profile; rdiff-backup --server'"
#choose the one contains environmental variable for rdiff-backup from .bash_profile and .bashrc.

2.Use rdiff-backup

  • Start backup
    • rdiff-backup --no-compression --print-statistics user@host::/home/user/source_dir destination_dir
    • If the destination_dir exists, please add --force like rdiff-backup --no-compression --force --print-statistics user@host::/home/user/source_dir destination_dir. All things in original destination_dir will be depleted.
    • If you want to exclude or include special files or dirs please specify like --exclude '**trash' or --include /home/user/source_dir/important.
  • Timely backup your data
    • Add the above command into crontab (hit 'crontab -e' in terminal to open crontab) in the format like 5   22  */1    *   *   command which means executing the command at 22:05 everyday.
  • Restore data
    • Restore the latest data by running rdiff-backup -r now destination_dir user@host::/home/user/source_dir.restore. Add --force if you want to restore to source_dir.
    • Restore files 10 days ago by running rdiff-backup -r 10D destination_dir user@host::/home/user/source_dir.restore. Other acceptable time formats include 5m4s (5 minutes 4 seconds) and 2014-01-01 (January 1st, 2014).
    • Restore files from an increment file by running rdiff-backup destination_dir/rdiff-backup-data/increments/server_add.2014-02-21T09:22:45+08:00.missing user@host::/home/user/source_dir.restore/server_add. Increment files are stored in destination_dir/rdiff-backup-data/increments/server_add.2014-02-21T09:22:45+08:00.missing.
  • ​​​​​​​Remove older records to save space
    • Deletes all information concerning file versions which have not been current for 2 weeks by running rdiff-backup --remove-older-than 2W --force destination_dir. Note that an existing file which has not changed for a year will still be preserved. But a file which was deleted 15 days ago can not be restored after this command. Normally one should use --force since it is used to delete multiple increments at the same time which --remove-older-than refuses to do by default.
    • Only keeps the last n rdiff-backup sessions by running rdiff-backup --remove-older-than 20B --force destination_dir.
  • Statistics
    • Lists increments in given golder by rdiff-backup --list-increments destination_dir/.
    • Lists of files changed in last 5 days by rdiff-backup --list-changed-since 5D destination_dir/.
    • Compare the difference between source and bak by rdiff-backup --compare user@host::source-dir destination_dir
    • Compare the sifference between source and bak (as it was two weeks ago) by rdiff-backup --compare-at-time 2W user@host::source-dir destination_dir.

3.A complete script (automatically sync using crontab)

#!/bin/bash

export PYTHONPATH=${PYTHONPATH}:/soft/rdiff_backup/lib/python2.7/site-packages/

rdiff-backup --no-compression -v5 --exclude '**trash' user@server::source/ bak_dir/

ret=$?
if test $ret -ne 0; then
    echo "Wrong in bak" | mutt -s "Wrong in bak" [email protected]
else
    echo "Right in bak" | mutt -s "Right in bak" [email protected]
fi

echo "Finish rdiff-backup $0 ---`date`---"  >>bak.log 2>&1

echo "`rdiff-backup --exclude '**trash' --compare-at-time 1D user@server::source/ bak_dir/`" | mutt -s "Lists of baked files" [email protected]

References

  • rdiff-backup
  • duplicity
  • rsnapshot
  • http://www.saltycrane.com/blog/2008/02/backup-on-linux-rsnapshot-vs-rdiff/
  • http://james.lab6.com/2008/07/09/rdiff-backup-and-duplicity/
  • http://bitflop.com/document/75
  • http://askubuntu.com/questions/2596/comparison-of-backup-tools
  • http://www.reddit.com/r/linux/comments/fgmbb/rdiffbackup_duplicity_or_rsnapshot_which_is/
  • http://serverfault.com/questions/491341/optimize-space-rdiff-backup
  • Another great post on usage of rdiff-backup

猜你喜欢

转载自blog.csdn.net/ARPOSPF/article/details/84826979
今日推荐