linux使用进阶(一)

    本文根据《应该知道的Linux技巧》coolshell上的一篇文章提到的Linux技巧,结合自己掌握的情况进行扩展和总结得来。主要包括以下内容:
    一、日常操作
    二、数据处理
    三、系统调试
    四、网络管理

一、日常操作
日常操作是在使用Linux进行编程开发中常用的命令,工具的总结。

1、ssh

2、熟悉bash中的作业管理
&             命令后面加“&”表示后台运行
$jobs       查看后台运行的程序(包括停止的和正在运行的)
$fg %n    让后台运行的工作n到前台运行
$bg %n   让工作n在后台运行
                
其中n代表工作号

Ctrl+z、Ctrl+c、Ctrl+\的区别:
Ctrl+z:发送SIGTSTP信号,挂起前台所有进程;
Ctrl+c:发送SIGINT信号,结束前台所有进程;
Ctrl+d:结束输入或退出shell,相当于EOF;
Ctrl+\:发送SIGQUIT信号,结束前台进程,并声称core文件。

TIP:可以在vi编辑过程中,按Ctrl+z挂起vi编辑,查看文件后(或做其他事),用fg让vi到前台运行。

kill在bash工作控制中的使用:
kill -l             l位L的小写,列出kill可使用的信号
kill -2            相当于Ctrl+c
kill -9            强制结束一个进程
kill -15          以正常方式结束掉一个进程
(-9和-15的区别,例如正在编辑的vi,如果以正常方式结束,那么会删除.filename.swap文件,如果是强制结束不会删除掉.filename.swap文件。)
另:kill后面默认跟进程的PID,用在bash工作控制时,要跟%n(n为工作编号)。

3、文件管理
ls, ls -l, less, more, tail, head, ln, ln -s, chgrp, chown, chmod, du, df, fdisk, mkfs, mount, umount, find 
  • head
head filename
显示前面几行,默认显示前10行。
head -n 20 filename
用-n指定显示前多少行。
  • tail
tail filename
默认显示后10行。
tail -n 20 filename
用-n指定显示后多少行。
tail -f filename
一直侦测filename的内容,直到Ctrl+c为止,filename一有内容就会输出。
  • ln 
ln [-sf]  来源文件  目标文件
如果不加任何参数,就是硬链接(hard link),如果加-s就是符号链接(symbolic link)。
-f 如果目标文件存在就直接把目标文件删除后再建立。
  • df
列出文件系统磁盘的整体使用量。
-a:列出所有的文件系统,包括系统特有的/proc等文件系统;
-k(-m):以KByte(MByte)的容量显示各文件系统;
-h:以人们易阅读的GByte,MByte,KByte等格式自行显示;
-H:以 M=1000K取代M=1024K 的进位方式;
-T:连同该 partition的filesystem 名称 (例如 ext3) 也列出;
-i:不用硬盘容量,而以 inode的数量来显示。

  • du
du [-ahskm]  档案或目录名称
选项参数:
-a:列出所有档案的容量,因为默认仅统计目录底下的档案量而已;
-h:以人们较易读的容量格式 (G/M) 显示;
-s:列出总量而已,而不列出每个各别的目录占用容量;
-S:不包括子目录下的总计,与-s有点差别;
-k:以 KBytes 列出容量显示;
-m:以 MBytes 列出容量显示;
  • chgrp
chgrp [-R] dirname/filename ...
-R:递归的意思,目录下的所有档案和子目录都改为这个群组。
chgrp qyh filename
要改变为的群组必须在/etc/group中存在。
  • chown
# chown [-R] 账号名称 档案或目录
# chown [-R] 账号名称:组名 档案或目录
  • fdisk
先了解一下磁盘的一些知识(主要分三类):
ATA(Advanced Technology Attachment),高技术配置(IDE并行接口),40pin,线多,干扰大,现在已基本不用;
SATA,串行ATA,SATA3.0可达到6Gbit/s;
SCSI(Small Computer System Interface),小型计算机系统接口;
在Linux中,第一个软盘驱动叫/dev/fd0,第二个叫/dev/fd1;第一个SCSI硬盘叫/dev/sda,第二个叫/dev/sdb;第一个SCSI CD-ROM叫/dev/scd0或者/dev/sr0;在IDE控制器上的主硬盘叫/dev/hda,在IDE控制器上的从硬盘叫/dev/hdb。
在每个磁盘上的分区,用数字来区分,比如在一个SCSI磁盘上的两个分区命名为/dev/sda1和/dev/sda2。

fdisk  -l 装置名称  (磁盘分区)
fdisk -l     列出所有分区信息
sudo fdisk  /dev/sda


  • mkfs
mkfs [-t 文件系统格式] 装置文件名
把指定的分区格式化为指定的文件系统格式。
mkfs[tab][tab]   (按两个tab键会出现支持的文件系统格式)

格式化磁盘可以使用支持详细参数的mke2fs指令。
另外还有两个磁盘检验的命令fsck, badblocks 。
  • mount
# mount [-t 文件系统] [-L Label 名] [-o 额外选项] [-n] 装置文件名 挂载点 
单一文件系统不应该被重复挂载在不同的挂载点(目录)中;
单一目录不应该重复挂载多个文件系统;
要作为挂载点的目录,理论上应该都是空目录才是。
选项与参数:
-a :依照配置文件 /etc/fstab 的数据将所有未挂载的磁盘都挂载上来
-l :单纯的输入 mount 会显示目前挂载的信息。加上 -l 可增列 Label 名称!
-t :与 mkfs 的选项非常类似的,可以加上文件系统种类来指定欲挂载的类型。
      常见的 Linux 支持类型有:ext2, ext3, vfat, reiserfs, iso9660(光盘格式),
      nfs, cifs, smbfs(此三种为网络文件系统类型)
-n :在默认的情况下,系统会将实际挂载的情况实时写入 /etc/mtab 中,以利其他程序
      的运行。但在某些情况下(例如单人维护模式)为了避免问题,会刻意不写入。
      此时就得要使用这个 -n 的选项了。
-L :系统除了利用装置文件名 (例如 /dev/hdc6) 之外,还可以利用文件系统的标头名称
      (Label)来进行挂载。最好为你的文件系统取一个独一无二的名称吧!
-o :后面可以接一些挂载时额外加上的参数!比方说账号、密码、读写权限等:
      ro, rw: 挂载文件系统成为只读(ro) 或可擦写(rw)
      async, sync: 此文件系统是否使用同步写入 (sync) 或异步 (async) 的
                    内存机制,请参考文件系统运行方式。默认为 async。
      auto, noauto: 允许此 partition 被以 mount -a 自动挂载(auto)
      dev, nodev: 是否允许此 partition 上,可创建装置文件? dev 为可允许
      suid, nosuid: 是否允许此 partition 含有 suid/sgid 的文件格式?
      exec, noexec: 是否允许此 partition 上拥有可运行 binary 文件?
      user, nouser: 是否允许此 partition 让任何使用者运行 mount ?一般来说,
                    mount 仅有 root 可以进行,但下达 user 参数,则可让
                    一般 user 也能够对此 partition 进行 mount 。
      defaults: 默认值为:rw, suid, dev, exec, auto, nouser, and async
      remount: 重新挂载,这在系统出错,或重新升级参数时,很有用!

mount /dev/sda5/ ./mnt/E (双系统,在Linux下挂载windows的文件系统)
挂载/dev/sda5到./mnt/E,可以省去参数,linux可以自动识别。
  • umount
# umount [-fn] 装置文件名或挂载点
选项与参数:
-f :强制卸除!可用在类似网络文件系统 (NFS) 无法读取到的情况下;
-n :不升级 /etc/mtab 情况下卸除。

另外,我们也可以利用 mount 来将某个目录挂载到另外一个目录去喔!这并不是挂载文件系统,而是额外挂载某个目录的方法! 虽然底下的方法也可以使用 symbolic link 来连结,不过在某些不支持符号链接的程序运行中,还是得要透过这样的方法才行。
$ sudo mount --bind  /home/qyh/work  ~/mnt/w
$ umount ~/mnt/w


4、Some Tips

a)在bash里,Ctrl-R可以查找历史命令,Ctrl-P和Ctrl-N分别用来调出上一条命令和下一条命令。
  Ctrl-W用来删除最后一个单词,Ctrl-U用来删除一句。
  Alt-.把上一次命令的最后一个参数打出来,Alt-*列出你可以输出的命令。
  cd - 回到上一次工作目录;cd ~ 回到/home/usr目录。
  如果你有输了个命令行,但是你改变注意了,但你又不想删除它,因为你要在历史命令中找到它,但你也不想执行它。那么,你可      
  以按下 Alt-# ,于是这个命令关就被加了一个#字符,于是就被注释掉了。

b)pstree -p可以查看进程树。

c)sudo !!以root来执行上次命令,在忘记打上sudo的时候这条命令比较有用。

d)man ascii 查看ASCII表。

e)> file创建一个空文件。

f)echo “ls -l” | at midnight  在某个时间运行某个命令。

g)xargs的用法:

它的作用是将参数列表转换成小块分段传递给其他命令,以避免参数列表过长的问题。

$ find /tmp -name core -type f -print | xargs /bin/rm -f 
查找/tmp下的core文件并删除它,但是如果文件名包含空格或换行符就会执行错误。

$ find /tmp -name core -type f -print0 | xargs -0 /bin/rm -f 
-print0表示输出以null分隔,-0表示输入以null分隔 

$ find /tmp -depth -name core -type f -delete 
比前面的例子更有效率,因为不需要使用fork和exec去执行rm了

$ cut -d: -f1 < /etc/passwd | sort | xargs echo 
输出所用有用户


-t:先打印出命令再执行;
-I{}:用“{}”代替输入参数,执行时”{}“会变成输入参数,“{}”也可用其他字符串代替
比如ls | xargs -t -Ixx mv xx xx.aa和上面的效果一样。


二、数据管理

sort, uniq, cut, paste, join, tr

命令的使用及参数见本文档组下的《linux常用命令总结》。下面介绍一些实例。
  • sort



  • uniq

注:last命令式列出账号登陆信息。
  • tr
# tr [-ds] SET1 ...
选项与参数:
-d :删除讯息当中的 SET1 这个字符串;
-s :取代掉重复的字符!

将last输出的信息当中的小写字母转换成大写字母:
$ last | tr ‘[a-z]‘ ‘[A-Z]‘

删除last输出的信息中的冒号“:”
$ last | tr -d ‘:‘
  • join
# join [-ti12] file1 file2
选项与参数:
-t :join 默认以空格符分隔数据,并且比对『第一个字段』的数据,
如果两个档案相同,则将两笔数据联成一行,且第一个字段放在第一个!
-i :忽略大小写的差异;
-1 :这个是数字的 1 ,代表『第一个档案要用那个字段来分析』的意思;
-2 :代表『第二个档案要用那个字段来分析』的意思。

实例:
qyh@ubuntu:~/temp$ cat tmpfile
root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/bin/sh
bin:x:2:2:bin:/bin:/bin/sh
sys:x:3:3:sys:/dev:/bin/sh
sync:x:4:65534:sync:/bin:/bin/sync

qyh@ubuntu:~/temp$ cut -d : -f 1-4 tmpfile > tmpfile_1
qyh@ubuntu:~/temp$ cut -d : -f 5-  tmpfile > tmpfile_2
qyh@ubuntu:~/temp$ cat tmpfile_1 tmpfile_2
root:x:0:0
daemon:x:1:1
bin:x:2:2
sys:x:3:3
sync:x:4:65534

root:/root:/bin/bash
daemon:/usr/sbin:/bin/sh
bin:/bin:/bin/sh
sys:/dev:/bin/sh
sync:/bin:/bin/sync

qyh@ubuntu:~/temp$ join -t : tmpfile_1 tmpfile_2
root:x:0:0:/root:/bin/bash
daemon:x:1:1:/usr/sbin:/bin/sh
bin:x:2:2:/bin:/bin/sh
sys:x:3:3:/dev:/bin/sh
sync:x:4:65534:/bin:/bin/sync

qyh@ubuntu:~/temp$ join -t : -1 1 tmpfile_1 -2 1 tmpfile_2
root:x:0:0:/root:/bin/bash
daemon:x:1:1:/usr/sbin:/bin/sh
bin:x:2:2:/bin:/bin/sh
sys:x:3:3:/dev:/bin/sh
sync:x:4:65534:/bin:/bin/sync
  • paste
# paste [-d] file1 file2
选项与参数:
-d :后面可以接分隔字符。预设是以 [tab] 来分隔的!
- :如果 file 部分写成 - ,表示来自 standard input 的资料的意思。

注:paste与join不同之处在于,paste不需要考虑字段的相关性,直接将两行贴在一起,中间以tab键分隔。

qyh@ubuntu:~/temp$ paste tmpfile_1 tmpfile_2
root:x:0:0 root:/root:/bin/bash
daemon:x:1:1 daemon:/usr/sbin:/bin/sh
bin:x:2:2 bin:/bin:/bin/sh
sys:x:3:3 sys:/dev:/bin/sh
sync:x:4:65534 sync:/bin:/bin/sync

cat a b | sort | uniq > c   # c is a union b 并集

cat a b | sort | uniq -d > c   # c is a intersect b 交集

cat a b b | sort | uniq -u > c   # c is set difference a - b 差集
注:uniq -d 仅仅打印重复的行    uniq -u 仅仅打印唯一的行

linux使用进阶(一),古老的榕树,5-wow.com

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。