######################################################################################################################################################################################

rename

rename _finished.jpg .jpg *.jpg 

rename 改的内容 改成什么 对什么文件进行修改

rename .gif .jpg *.gif

######################################################################################################################################################################################

[root@www ~]# sh [-nvx] scripts.sh

选项与参数:

-n  :不要运行 script,仅查询语法的问题;

-v  :再运行 sccript 前,先将 scripts 的内容输出到萤幕上;

-x  :将使用到的 script 内容显示到萤幕上,这是很有用的参数!


范例一:测试 sh16.sh 有无语法的问题?

[root@www ~]# sh -n sh16.sh 

# 若语法没有问题,则不会显示任何资讯!


范例二:将 sh15.sh 的运行过程全部列出来~

[root@www ~]# sh -x sh15.sh 

+ PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:/root/bin

+ export PATH

+ for animal in dog cat elephant

+ echo 'There are dogs.... '

There are dogs....

+ for animal in dog cat elephant

+ echo 'There are cats.... '

There are cats....

+ for animal in dog cat elephant

+ echo 'There are elephants.... '

There are elephants....



######################################################################################################################################################################################

★tr

tr [-ds] SET1 ...

选项与参数:

-d  :删除信息当中的 SET1 这个字符串;

-s  :取代掉重复的字符!


last | tr '[a-z]' '[A-Z]'

cat /etc/passwd | tr -d ':'


cp /etc/passwd /root/passwd && unix2dos /root/passwd

file /etc/passwd /root/passwd

cat /root/passwd | tr -d '\r' > /root/passwd.linux    ^M 可以使用 \r 来代替



######################################################################################################################################################################################

★col 

[root@www ~]# col [-xb]

选项与参数:

-x  :将 tab 键转换成对等的空格键

-b  :在文字内有反斜杠 (/) 时,仅保留反斜杠最后接的那个字符


cat /etc/man.config | col -x | cat -A | more


man col > /root/col.man

man col | col -b > /root/col.man




######################################################################################################################################################################################

★join

[root@www ~]# join [-ti12] file1 file2

选项与参数:

-t  :join 默认以空格符分隔数据,并且比对『第一个字段』的数据,

      如果两个文件相同,则将两笔数据联成一行,且第一个字段放在第一个!

-i  :忽略大小写的差异;

-1  :这个是数字的 1 ,代表『第一个文件要用那个字段来分析』的意思;

-2  :代表『第二个文件要用那个字段来分析』的意思。


head -n 3 /etc/passwd /etc/shadow

oin -t ':' /etc/passwd /etc/shadow

root:x:0:0:root:/root:/bin/bash:$1$/3AQpE5e$y9A/D0bh6rElAs:14120:0:99999:7:::

bin:x:1:1:bin:/bin:/sbin/nologin:*:14126:0:99999:7:::

daemon:x:2:2:daemon:/sbin:/sbin/nologin:*:14126:0:99999:7:::


head -n 3 /etc/passwd /etc/group

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

0:root:x:0:root:/root:/bin/bash:root:x:root

1:bin:x:1:bin:/bin:/sbin/nologin:bin:x:root,bin,daemon

2:daemon:x:2:daemon:/sbin:/sbin/nologin:daemon:x:root,bin,daemon




######################################################################################################################################################################################

★paste 


[root@www ~]# paste [-d] file1 file2

选项与参数:

-d  :后面可以接分隔字符。默认是以 [tab] 来分隔的!

-   :如果 file 部分写成 - ,表示来自 standard input 的数据的意思。

[root@www ~]# paste /etc/passwd /etc/shadow

bin:x:1:1:bin:/bin:/sbin/nologin        bin:*:14126:0:99999:7:::


cat /etc/group|paste /etc/passwd /etc/shadow -|head -n 3




######################################################################################################################################################################################

★expand

[root@www ~]# expand [-t] file

选项与参数:

-t  :后面可以接数字。一般来说,一个 tab 按键可以用 8 个空格键取代。

      我们也可以自行定义一个 [tab] 按键代表多少个字符呢!

grep '^MANPATH' /etc/man.config | head -n 3 | \

>  expand -t 6 - | cat -A


unexpand




######################################################################################################################################################################################

split

分割命令: split

[root@www ~]# split [-bl] file PREFIX

选项与参数:

-b  :后面可接欲分割成的文件大小,可加单位,例如 b, k, m 等;

-l  :以行数来进行分割。

PREFIX :代表前导符的意思,可作为分割文件的前导文字。

cd /tmp; split -b 300k /etc/termcap termcap

cat termcap* >> termcapback


ls -al / | split -l 10 - lsroot

wc -l lsroot*



######################################################################################################################################################################################

双向重导向: tee

[root@www ~]# tee [-a] file

选项与参数:

-a  :以累加 (append) 的方式,将数据加入 file 当中!


[root@www ~]# last | tee last.list | cut -d " " -f1

[root@www ~]# ls -l /home | tee ~/homefile | more

[root@www ~]# ls -l / | tee -a ~/homefile | more



######################################################################################################################################################################################

wc

[root@www ~]# wc [-lwm]

选项与参数:

-l  :仅列出行;

-w  :仅列出多少字(英文单字);

-m  :多少字符;

cat /etc/man.config | wc 

last | grep [a-zA-Z] | grep -v 'wtmp' | wc -l 

######################################################################################################################################################################################

uniq

[root@www ~]# uniq [-ic]

选项与参数:

-i  :忽略大小写字符的不同;

-c  :进行计数

last | cut -d ' ' -f1 | sort | uniq    排序后仅取出一位

last | cut -d ' ' -f1 | sort | uniq -c

######################################################################################################################################################################################

sort

[root@www ~]# sort [-fbMnrtuk] [file or stdin]

选项与参数:

-f  :忽略大小写的差异,例如 A 与 a 视为编码相同;

-b  :忽略最前面的空格符部分;

-M  :以月份的名字来排序,例如 JAN, DEC 等等的排序方法;

-n  :使用『纯数字』进行排序(默认是以文字型态来排序的);

-r  :反向排序;

-u  :就是 uniq ,相同的数据中,仅出现一行代表;

-t  :分隔符,默认是用 [tab] 键来分隔;

-k  :以那个区间 (field) 来进行排序的意思


cat /etc/passwd | sort           ==>   是默认-f来排序,默认是以『文字』型态来排序

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

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

######################################################################################################################################################################################

cut


[root@www ~]# cut -d'分隔字符' -f fields <==用于有特定分隔字符
[root@www ~]# cut -c 字符区间            <==用于排列整齐的信息选项与参数:
-d  :后面接分隔字符。与 -f 一起使用;
-f  :依据 -d 的分隔字符将一段信息分割成为数段,用 -f 取出第几段的意思;
-c  :以字符 (characters) 的单位取出固定字符区间;

[root@www ~]# exportdeclare -x HISTSIZE="1000"
declare -x INPUTRC="/etc/inputrc"
declare -x KDEDIR="/usr"
declare -x LANG="zh_TW.big5".....(其他省略).....
# 注意看,每个数据都是排列整齐的输出!如果我们不想要『 declare -x 』时,
# 就得这么做:[root@www ~]# export | cut -c 12-HISTSIZE="1000"
INPUTRC="/etc/inputrc"
KDEDIR="/usr"
LANG="zh_TW.big5"




历史命令:history

[root@www ~]# history [n]

[root@www ~]# history [-c]

[root@www ~]# history [-raw] histfiles

选项与参数:

n   :数字,意思是『要列出最近的 n 笔命令行表』的意思!

-c  :将目前的 shell 中的所有 history 内容全部消除

-a  :将目前新增的 history 命令新增入 histfiles 中,若没有加 histfiles ,

      则默认写入 ~/.bash_history

-r  :将 histfiles 的内容读到目前这个 shell 的 history 记忆中;

-w  :将目前的 history 记忆内容写入 histfiles 中!


[root@www ~]# history 3
[root@www ~]# history -w
[root@www ~]# echo $HISTSIZE

[root@www ~]# !number
[root@www ~]# !command
[root@www ~]# !!
选项与参数:
number  :运行第几笔命令的意思;
command :由最近的命令向前搜寻『命令串开头为 command』的那个命令,并运行;
!!      :就是运行上一个命令(相当于按↑按键后,按 Enter)
[root@www ~]# history
   66  man rm
   67  alias
   68  man history
   69  history 
[root@www ~]# !66  <==运行第 66 笔命令
[root@www ~]# !!   <==运行上一个命令,本例中亦即 !66 
[root@www ~]# !al  <==运行最近以 al 为开头的命令(上头列出的第 67 个)

######################################################################################################################################################################################

read

read [-pt] variable

选项与参数:

-p  :后面可以接提示字符!

-t  :后面可以接等待的『秒数!』这个比较有趣~不会一直等待使用者啦!

######################################################################################################################################################################################

与文件系统及程序的限制关系: ulimit

      ---->限制开启的文件数量,使用的 CPU 时间,使用的内存总量<----


[root@www ~]# ulimit [-SHacdfltu] [配额]

选项与参数:

-H  :hard limit ,严格的配置,必定不能超过这个配置的数值;

-S  :soft limit ,警告的配置,可以超过这个配置值,但是若超过则有警告信息。

      在配置上,通常 soft 会比 hard 小,举例来说,soft 可配置为 80 而 hard 

      配置为 100,那么你可以使用到 90 (因为没有超过 100),但介于 80~100 之间时,

      系统会有警告信息通知你!

-a  :后面不接任何选项与参数,可列出所有的限制额度;

-c  :当某些程序发生错误时,系统可能会将该程序在内存中的信息写成文件(除错用),

      这种文件就被称为核心文件(core file)。此为限制每个核心文件的最大容量。

-f  :此 shell 可以创建的最大文件容量(一般可能配置为 2GB)单位为 Kbytes

-d  :程序可使用的最大断裂内存(segment)容量;

-l  :可用于锁定 (lock) 的内存量

-t  :可使用的最大 CPU 时间 (单位为秒)

-u  :单一用户可以使用的最大程序(process)数量。

[root@www ~]# ulimit -f 10240
[root@www ~]# ulimit -afile size               (blocks, -f) 10240 <==最大量为10240Kbyes,相当10Mbytes
[root@www ~]# dd if=/dev/zero of=123 bs=1M count=20
File size limit exceeded <==尝试创建 20MB 的文件,结果失败了!

一般身份使用者如果以 ulimit 配置了 -f 的文件大小, 那么他『只能继续减小文件容量,不能添加文件容量喔!』


######################################################################################################################################################################################

变量

[root@www ~]# name="VBird's name"    <==OK 的啦!

# 命令是由左边向右找→,先遇到的引号先有用,因此如上所示,单引号会失效!

[root@www ~]# name='VBird's name'    <==失败的啦!

# 因为前两个单引号已成对,后面就多了一个不成对的单引号了!因此也就失败了!

[root@www ~]# name=VBird\'s\ name     <==OK 的啦!

# 利用反斜杠 (\) 跳脱特殊字符,例如单引号与空格键,这也是 OK 的啦!


[root@www ~]# PATH=$PATH:/home/dmtsai/bin

[root@www ~]# PATH="$PATH":/home/dmtsai/bin

[root@www ~]# PATH=${PATH}:/home/dmtsai/bin

# 上面这三种格式在 PATH 里头的配置都是 OK 的!但是底下的例子就不见得啰!


范例四:承范例三,我要将 name 的内容多出 "yes" 呢?

[root@www ~]# name=$nameyes  

# 知道了吧?如果没有双引号,那么变量成了啥?name 的内容是 $nameyes 这个变量!

# 呵呵!我们可没有配置过 nameyes 这个变量吶!所以,应该是底下这样才对!

[root@www ~]# name="$name"yes

[root@www ~]# name=${name}yes  <==以此例较佳!


范例六:如何进入到您目前核心的模块目录?

[root@www ~]# cd /lib/modules/`uname -r`/kernel

[root@www ~]# cd /lib/modules/$(uname -r)/kernel


在 BASH 的环境下,这个 RANDOM 变量的内容,介于 0~32767 之间

declare -i number=$RANDOM*10/32768 ; echo $number



######################################################################################################################################################################################

Bash shell 的内建命令: type

[root@www ~]# type [-tpa] name选项与参数:
    :不加任何选项与参数时,type 会显示出 name 是外部命令还是 bash 内建命令
-t  :当加入 -t 参数时,type 会将 name 以底下这些字眼显示出他的意义:
      file    :表示为外部命令;
      alias   :表示该命令为命令别名所配置的名称;
      builtin :表示该命令为 bash 内建的命令功能;
-p  :如果后面接的 name 为外部命令时,才会显示完整文件名;
-a  :会由 PATH 变量定义的路径中,将所有含 name 的命令都列出来,包含 alias

查询是外部命令还是内建命令:

范例一:查询一下 ls 这个命令是否为 bash 内建?

[root@www ~]# type ls

ls is aliased to `ls --color=tty' <==未加任何参数,列出 ls 的最主要使用情况

[root@www ~]# type -t ls

alias                             <==仅列出 ls 运行时的依据

[root@www ~]# type -a ls

ls is aliased to `ls --color=tty' <==最先使用 aliase

ls is /bin/ls                     <==还有找到外部命令在 /bin/ls


范例二:那么 cd 呢?

[root@www ~]# type cd

cd is a shell builtin             <==看到了吗? cd 是 shell 内建命令



######################################################################################################################################################################################

★dump

[root@www ~]# dump [-Suvj] [-level] [-f 备份档] 待备份数据

[root@www ~]# dump -W

选项与参数:

-S    :仅列出后面的待备份数据需要多少磁碟空间才能够备份完毕;

-u    :将这次 dump 的时间记录到 /etc/dumpdates 文件中;

-v    :将 dump 的文件过程显示出来;

-j    :加入 bzip2 的支持!将数据进行压缩,默认 bzip2 压缩等级为 2

-level:就是我们谈到的等级,从 -0 ~ -9 共十个等级;

-f    :有点类似 tar 啦!后面接产生的文件,亦可接例如 /dev/st0 装置档名等

-W    :列出在 /etc/fstab 里面的具有 dump 配置的 partition 是否有备份过?


dump -S /dev/hdc1

dump -0u -f /root/boot.dump /boot

dump -W

dd if=/dev/zero of=/boot/testing.img bs=1M count=10

dump -1u -f /root/boot.dump.1 /boot

dump -W


 dump -0j -f /root/etc.dump.bz2 /etc


  • 当待备份的数据为单一文件系统:
    如果是单一文件系统 (filesystem) ,那么该文件系统可以使用完整的 dump 功能,包括利用 0~9 的数个 level 来备份, 同时,备份时可以使用挂载点或者是装置档名 (例如 /dev/sda5 之类的装置档名) 来进行备份!

  • 待备份的数据只是目录,并非单一文件系统:
    例如你仅想要备份 /home/someone/ ,但是该目录并非独立的文件系统时。此时备份就有限制啦!包括:

    • 所有的备份数据都必须要在该目录 (本例为:/home/someone/) 底下;

    • 且仅能使用 level 0 ,亦即仅支持完整备份而已;

    • 不支持 -u 选项,亦即无法创建 /etc/dumpdates 这个各别 level 备份的时间记录档;

等到第二次备份时,即时文件系统内的数据已经与 level 0 不一样了,而 level 1 仅只是比较目前的文件系统与 level 0 之间的差异后,备份有变化过的文件而已。至於 level 2 则是与 level 1 进行比较

######################################################################################################################################################################################

restore

[root@www ~]# restore -t [-f dumpfile] [-h]        <==用来察看 dump 档
[root@www ~]# restore -C [-f dumpfile] [-D 挂载点] <==比较dump与实际文件
[root@www ~]# restore -i [-f dumpfile]             <==进入互动模式
[root@www ~]# restore -r [-f dumpfile]             <==还原整个文件系统选项与参数:
相关的各种模式,各种模式无法混用喔!例如不可以写 -tC 啦!
-t  :此模式用在察看 dump 起来的备份档中含有什么重要数据!类似 tar -t 功能;
-C  :此模式可以将 dump 内的数据拿出来跟实际的文件系统做比较,
      最终会列出『在 dump 文件内有记录的,且目前文件系统不一样』的文件;
-i  :进入互动模式,可以仅还原部分文件,用在 dump 目录时的还原!
-r  :将整个 filesystem 还原的一种模式,用在还原针对文件系统的 dump 备份;
其他较常用到的选项功能:
-h  :察看完整备份数据中的 inode 与文件系统 label 等资讯
-f  :后面就接你要处理的那个 dump 文件罗!
-D  :与 -C 进行搭配,可以查出后面接的挂载点与 dump 内有不同的文件!

restore -t -f /root/boot.dump 

restore -t -f /root/etc.dump

Dump tape is compressed


比较差异并且还原整个文件系统

restore -C -f /root/boot.dump


fdisk /dev/hdc ==>n==>p==>w==>partprobe==>

mkfs -t ext3 /dev/hdc8                ==>

mount /dev/hdc8 /mnt                 ==>

cd /mnt                             ==>

restore -r -f /root/boot.dump



仅还原部分文件的 restore 互动模式

cd /mnt

restore -i -f /root/etc.dump

restore > help

Available commands are:

        ls [arg] - list directory          <==列出 etc.dump 内的文件或目录

        cd arg - change directory          <==在 etc.dump 内变更目录

        pwd - print current directory      <==列出在 etc.dump 内的路径档名

        add [arg] - add `arg' to list of files to be extracted 

        delete [arg] - delete `arg' from list of files to be extracted

        extract - extract requested files

# 上面三个命令是重点!各命令的功能为:

# add file    :将 file 加入等一下要解压缩的文件列表中

# delete file :将 file 移除出解压缩的列表,并非删除 etc.dump 内的文件!别误会!^_^

# extract     :开始将刚刚选择的文件列表解压缩了去!

restore > ls ==> cd etc ==> pwd ==> ls passwd shadow group ==> add passwd shadow group ==> delete group ==> ls passwd shadow group ==> extract(开始进行解压缩)==> quit ==>ll -d etc ==> ll etc


######################################################################################################################################################################################

tar 

root@www ~]# tar [-j|-z] [cv] [-f 创建的档名] filename... <==打包与压缩

[root@www ~]# tar [-j|-z] [tv] [-f 创建的档名]             <==察看档名

[root@www ~]# tar [-j|-z] [xv] [-f 创建的档名] [-C 目录]   <==解压缩选项与参数:

-c  :创建打包文件,可搭配 -v 来察看过程中被打包的档名(filename)

-t  :察看打包文件的内容含有哪些档名,重点在察看『档名』就是了;

-x  :解打包或解压缩的功能,可以搭配 -C (大写) 在特定目录解开

      特别留意的是, -c, -t, -x 不可同时出现在一串命令列中。

-j  :透过 bzip2 的支持进行压缩/解压缩:此时档名最好为 *.tar.bz2

-z  :透过 gzip  的支持进行压缩/解压缩:此时档名最好为 *.tar.gz

-v  :在压缩/解压缩的过程中,将正在处理的档名显示出来!

-f filename:-f 后面要立刻接要被处理的档名!建议 -f 单独写一个选项罗!

-C 目录    :这个选项用在解压缩,若要在特定目录解压缩,可以使用这个选项。


其他后续练习会使用到的选项介绍:

-p  :保留备份数据的原本权限与属性,常用於备份(-c)重要的配置档

-P  :保留绝对路径,亦即允许备份数据中含有根目录存在之意;

--exclude=FILE:在压缩的过程中,不要将 FILE 打包!  --exclude file 』似乎无法实际运行了!使用 man tar 明明有看到这个选项的说, 但使用 info tar 才发现,选项功能已经变成了『 --exclude=file 』的模式


tar -zpcv -f /root/etc.tar.gz /etc

tar -jpcv -f /root/etc.tar.bz2 /etc

tar -jpPcv -f /root/etc.and.root.tar.bz2 /etc   鸟哥个人建议,还是不要加上 -P 这个选项来备份! 毕竟很多时候,我们备份是为了要未来追踪问题用的,倒不一定需要还原回原本的系统中

 tar -jxv -f 打包档.tar.bz2 待解开档名

tar -jxv -f /root/etc.tar.bz2 etc/shadow

tar -jcv -f /root/etc.newer.then.passwd.tar.bz2  --newer-mtime="2008/09/29" /etc/*

tar -jtv -f /root/etc.newer.then.passwd.tar.bz2 |  grep -v '/$' 

tar -cvf - /etc | tar -xvf -   # 要注意的地方在於输出档变成 - 而输入档也变成 - ,又有一个 | 存在~

tar -jcv -f /backups/backup-system-20091130.tar.bz2  --exclude=/root/*.bz2 --exclude=/root/*.gz --exclude=/home/loop*  /etc /home /var/spool/mail /var/spool/cron /root


?:tar: Removing leading `/' from member names(移除了档名开头的 `/' )

拿掉了根目录,假设你将备份数据在 /tmp 解开,那么解压缩的档名就会变成『/tmp/etc/xxx』。 但『如果没有拿掉根目录,解压缩后的档名就会是绝对路径, 亦即解压缩后的数据一定会被放置到 /etc/xxx 去!』如此一来,你的原本的 /etc/ 底下的数据, 就会被备份数据所覆盖过去了


写成『-jcvf filename』,这样是对的, 但由於选项的顺序理论上是可以变换的,所以很多读者会误认为『-jvfc filename』也可以~事实上这样会导致产生的档名变成 c !


Windows 的 WinRAR 也支持 .tar.gz 档名的解压缩


tarfile

如果仅是打包而已,就是『 tar -cv -f file.tar 』而已

tarball 

还有进行压缩的支持,例如『 tar -jcv -f file.tar.bz2 』


磁带机由於是一次性读取/写入的装置,因此我们不能够使用类似 cp 等命令来复制的! 那如果想要将 /home, /root, /etc 备份到磁带机 (/dev/st0) 时,就可以使用:『tar -cv -f /dev/st0 /home /root /etc

######################################################################################################################################################################################

bzip2, bzcat

bzip2 [-cdkzv#] 檔名 

bzcat 檔名.bz2 

选顷参数: -c :将压缩得过程产生的数据输出到屏幕上! 

-d :解压缩的参数 

-k :保留源文件,而不会删除原始的档案喔! 

-z :压缩的参数 

-v :可以显示出原档案/压缩文件案的压缩比等信息;

 -# :不 gzip 同样的,都是在计算压缩比的参数, -9 最佳, -1 最差!

bzip2 -z man.config

bzcat man.config.bz2

bzip2 -d man.config.bz2

bzip2 -9 -c man.config > man.config.bz2


gzip 是为了取代 compress 并提供更好的压缩比而成立的,那么 bzip2 则是为了取代 gzip 并提供更佳的压缩比而来的

######################################################################################################################################################################################

gzip     zcat

gzip [-cdtv#] 檔名 


选顷与参数: 

-c :将压缩的数据输出到屏幕上,可透过数据流重导向处理;

 -d :解压缩的参数;

 -t :可以用来检验一个压缩文件的一致性~看看档案有无错误; 

-v :可以显示出原档案/压缩文件案的压缩比等信息; 

-# :压缩等级,-1 最快,但是压缩比最差;-9 最慢,但是压缩比最好!预设是 -6

gzip -d man.config.gz  会将源文件删除

gzip -v man.config       将源文件删除

gzip -9 -c man.config > man.config.gz  


zcat 檔名.gz 

zcat man.config.gz # 由亍 man.config 这个原本的档案是文本文件,因此我们可以尝试使用 zcat 去读取!


gzip 压缩的档案在 Windows 系统中,可以被 WinRAR 这个软件解压缩呢

zcat 这个指令可以同时读取 compress 和 gzip 的压缩文件

######################################################################################################################################################################################

★compress

gzip 已经可以解开使用 compress 压缩的档案


ompress [-rcv] 档案或目录 <==这里是压缩

 [root@www ~]# uncompress 档案.Z   <==这里是解压缩 

选顷与参数: -r :可以连同目录下的档案也同时给予压缩呢! 

-c :将压缩数据输出成为 standard output (输出到屏幕) 

-v :可以秀出压缩后的档案信息以及压缩过程中的一些档名变化。


compress -c man.config > man.config.back.Z

######################################################################################################################################################################################

格式化列印: printf

[root@www ~]# printf '列印格式' 实际内容
选项与参数:
关於格式方面的几个特殊样式:
       \a    警告声音输出
       \b    倒退键(backspace)
       \f    清除萤幕 (form feed)
       \n    输出新的一行
       \r    亦即 Enter 按键
       \t    水平的 [tab] 按键
       \v    垂直的 [tab] 按键
       \xNN  NN 为两位数的数字,可以转换数字成为字节。
关於 C 程序语言内,常见的变量格式
       %ns   那个 n 是数字, s 代表 string ,亦即多少个字节;
       %ni   那个 n 是数字, i 代表 integer ,亦即多少整数码数;
       %N.nf 那个 n 与 N 都是数字, f 代表 floating (浮点),如果有小数码数,
             假设我共要十个位数,但小数点有两位,即为 %10.2f 罗!

printf '%s\t %s\t %s\t %s\t %s\t \n' $(cat printf.txt)

printf '%10s %5i %5i %5i %8.2f \n' $(cat printf.txt |\
> grep -v Name)

printf '\x45\n'

######################################################################################################################################################################################

ssh-keygen

ssh-copy-id


ssh-keygen -t rsa

Generating public/private rsa key pair.

Enter file in which to save the key (/root/.ssh/id_rsa):

Enter passphrase (empty for no passphrase):           #=====>直接回车实现无密码登录远程主机

Enter same passphrase again:

Your identification has been saved in /root/.ssh/id_rsa.

Your public key has been saved in /root/.ssh/id_rsa.pub.

ssh-copy-id -i /root/.ssh/id_rsa.pub root@192.168.9.251


[root@catic ~]# ssh root@192.168.9.251

Last login: Wed Mar 22 18:20:34 2017 from 192.168.9.245

welcome login my computer!


ssh-copy-id -i ~/.ssh/id_rsa.pub "-p 23 root@192.168.9.251



  1 #!/bin/bash

  2 for i in $(cat ./hostname)

  3 do

  4 #PWD=$(echo $i | md5sum|head -c 24)

  5 #sed -i "s:${i}.*:${i}\t${PWD}:g" ./hostname           #记录下修改后的密码。

  7 #ssh $i "echo $PWD|passwd chensh --stdin"

  8 ssh $i "useradd appuser && echo appuser |passwd appuser --stdin"

  9 done

######################################################################################################################################################################################

grep

[root@www ~]# grep [-acinv] [--color=auto] '搜寻字符串' 
filename选项与参数:
-a :将 binary 文件以 text 文件的方式搜寻数据
-c :计算找到 '搜寻字符串' 的次数
-i :忽略大小写的不同,所以大小写视为相同
-n :顺便输出行号
-v :反向选择,亦即显示出没有 '搜寻字符串' 内容的那一行!
--color=auto :可以将找到的关键词部分加上颜色的显示喔!


对字节排序有影响的语系对正规表示法的影响:

LANG=C     时:0 1 2 3 4 ... A B C D ... Z a b c d ...z

LANG=zh_TW 时:0 1 2 3 4 ... a A b B c C d D ... z Z

LANG=zh_CN.UTF-8时:


grep 'mail' /etc/init.d/*



特殊符号代表意义
[: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 的数字与字节

注:红色部分必须掌握!

.(小数点):代表『一定有一个任意字节』的意思

* (星星号):代表『重复前一个字节, 0 到无穷多次』的意思,为组合形态

.* 代表零个或多个任意字节

o*:代表的是拥有空字节或一个 o 以上的字节

oo*:代表的是o, oo, ooo, oooo 等

grep -n 'g..d' regular_express.txt

grep -n 'goo*g' regular_express.txt

grep -n 'g.*g' regular_express.txt   

 grep -n '[0-9][0-9]*' regular_express.txt        ====>任意数字


[root@www ~]# grep [-A] [-B] [--color=auto] '搜寻字串' filename

选项与参数:

-A :后面可加数字,为 after 的意思,除了列出该行外,后续的 n 行也列出来;

-B :后面可加数字,为 befer 的意思,除了列出该行外,前面的 n 行也列出来;

--color=auto 可将正确的那个撷取数据列出颜色


[root@www ~]# dmesg | grep 'eth'

eth0: RealTek RTL8139 at 0xee846000, 00:90:cc:a6:34:84, IRQ 10

[root@www ~]# dmesg | grep -n --color=auto 'eth'

247:eth0: RealTek RTL8139 at 0xee846000, 00:90:cc:a6:34:84, IRQ 10

[root@www ~]# dmesg | grep -n -A3 -B2 --color=auto 'eth'


alias grep='grep --color=auto'

grep -vn 'the' regular_express.txt        ====>反向选择

grep -in 'the' regular_express.txt         ====>不论大小写

grep -n 't[ae]st' regular_express.txt      ====>搜寻 test 或 taste 

grep -n '[^g]oo' regular_express.txt      ====>不想要 oo 前面有 g

         19:goooooogle yes!

grep -n '[^a-z]oo' regular_express.txt           

grep -n '[0-9]' regular_express.txt

grep -n '[^[:lower:]]oo' regular_express.txt      ====>非 a-z 

grep -n '[[:digit:]]' regular_express.txt              ====>数字

grep -n '^[a-z]' regular_express.txt

grep -n '^the' regular_express.txt                  ====> '^’中^为行首,【 ^】中^为非

grep -n '^[^a-zA-Z]' regular_express.txt

grep -n '\.$' regular_express.txt        ====> 行尾结束为小数点,\是由于小数点具有其他意义


断行字节在 Linux 与 Windows 上的差异:

Windows 的断行字节 为(^M$) 

Linux 的断行字节 为 ($)

grep -n '\.$' regular_express.txt

4:this dress doesn't fit me.

10:motorcycle is cheap than car.

cat -An regular_express.txt | head -n 10 | tail -n 1

 5  However, this dress is about $ 3183 dollars.^M$


grep -n '^$' regular_express.txt

grep -v '^$' /etc/syslog.conf | grep -v '^#'


grep -n 'o\{2\}' regular_express.txt                ====>两个 o,{ 与 } 的符号在 shell有特殊意义

grep -n 'go\{2,5\}g' regular_express.txt        ====>两个到五个 o

grep -n 'go\{2,\}g' regular_express.txt         ====>2 个 o 以上


RE 字符意义与范例
^word意义:待搜寻的字串(word)在行首!
范例:搜寻行首为 # 开始的那一行,并列出行号
grep -n '^#' regular_express.txt
word$意义:待搜寻的字串(word)在行尾!
范例:将行尾为 ! 的那一行列印出来,并列出行号
grep -n '!$' regular_express.txt
.意义:代表『一定有一个任意字节』的字符!
范例:搜寻的字串可以是 (eve) (eae) (eee) (e e), 但不能仅有 (ee) !亦即 e 与 e 中间『一定』仅有一个字节,而空白字节也是字节!
grep -n 'e.e' regular_express.txt
\意义:跳脱字符,将特殊符号的特殊意义去除!
范例:搜寻含有单引号 ' 的那一行!
grep -n \' regular_express.txt
*意义:重复零个到无穷多个的前一个 RE 字符
范例:找出含有 (es) (ess) (esss) 等等的字串,注意,因为 * 可以是 0 个,所以 es 也是符合带搜寻字串。另外,因为 * 为重复『前一个 RE 字符』的符号, 因此,在 * 之前必须要紧接著一个 RE 字符喔!例如任意字节则为 『.*』 !
grep -n 'ess*' regular_express.txt
[list]意义:字节集合的 RE 字符,里面列出想要撷取的字节!
范例:搜寻含有 (gl) 或 (gd) 的那一行,需要特别留意的是,在 [] 当中『谨代表一个待搜寻的字节』, 例如『 a[afl]y 』代表搜寻的字串可以是 aay, afy, aly 即 [afl] 代表 a 或 f 或 l 的意思!
grep -n 'g[ld]' regular_express.txt
[n1-n2]意义:字节集合的 RE 字符,里面列出想要撷取的字节范围!
范例:搜寻含有任意数字的那一行!需特别留意,在字节集合 [] 中的减号 - 是有特殊意义的,他代表两个字节之间的所有连续字节!但这个连续与否与 ASCII 编码有关,因此,你的编码需要配置正确(在 bash 当中,需要确定 LANG 与 LANGUAGE 的变量是否正确!) 例如所有大写字节则为 [A-Z]
grep -n '[A-Z]' regular_express.txt
[^list]意义:字节集合的 RE 字符,里面列出不要的字串或范围!
范例:搜寻的字串可以是 (oog) (ood) 但不能是 (oot) ,那个 ^ 在 [] 内时,代表的意义是『反向选择』的意思。 例如,我不要大写字节,则为 [^A-Z]。但是,需要特别注意的是,如果以 grep -n [^A-Z] regular_express.txt 来搜寻,却发现该文件内的所有行都被列出,为什么?因为这个 [^A-Z] 是『非大写字节』的意思, 因为每一行均有非大写字节,例如第一行的 "Open Source" 就有 p,e,n,o.... 等等的小写字
grep -n 'oo[^t]' regular_express.txt
\{n,m\}意义:连续 n 到 m 个的『前一个 RE 字符』
意义:若为 \{n\} 则是连续 n 个的前一个 RE 字符,
意义:若是 \{n,\} 则是连续 n 个以上的前一个 RE 字符!
 范例:在 g 与 g 之间有 2 个到 3 个的 o 存在的字串,亦即 (goog)(gooog)
grep -n 'go\{2,3\}g' regular_express.txt

正则与通配符区别:

通配符:ls -l a*

正则:ls | grep -n '^a.*'


######################################################################################################################################################################################

延伸正规表示法:egrep ===grep -E


egrep -v '^$|^#' regular_express.txt     ===  

                                                      基础正则     grep -v '^$' regular_express.txt | grep -v '^#'


RE 字符意义与范例
+意义:重复『一个或一个以上』的前一个 RE 字符
范例:搜寻 (god) (good) (goood)... 等等的字串。 那个 o+ 代表『一个以上的 o 』所以,底下的运行成果会将第 1, 9, 13 行列出来。
egrep -n 'go+d' regular_express.txt
?意义:『零个或一个』的前一个 RE 字符
范例:搜寻 (gd) (god) 这两个字串。 那个 o? 代表『空的或 1 个 o 』所以,上面的运行成果会将第 13, 14 行列出来。 有没有发现到,这两个案例( 'go+d' 与 'go?d' )的结果集合与 'go*d' 相同? 想想看,这是为什么喔! ^_^
egrep -n 'go?d' regular_express.txt
|意义:用或( or )的方式找出数个字串
范例:搜寻 gd 或 good 这两个字串,注意,是『或』! 所以,第 1,9,14 这三行都可以被列印出来喔!那如果还想要找出 dog 呢?
egrep -n 'gd|good' regular_express.txt
egrep -n 'gd|good|dog' regular_express.txt
()意义:找出『群组』字串
范例:搜寻 (glad) 或 (good) 这两个字串,因为 g 与 d 是重复的,所以, 我就可以将 la 与 oo 列於 ( ) 当中,并以 | 来分隔开来,就可以啦!
egrep -n 'g(la|oo)d' regular_express.txt
()+意义:多个重复群组的判别
范例:将『AxyzxyzxyzxyzC』用 echo 叫出,然后再使用如下的方法搜寻一下!
echo 'AxyzxyzxyzxyzC' | egrep 'A(xyz)+C'
上面的例子意思是说,我要找开头是 A 结尾是 C ,中间有一个以上的 "xyz" 字串的意思~

! 在正规表示法当中并不是特殊字节

grep -n '[!>]' regular_express.txt                    ====> 含有 ! 与 >




######################################################################################################################################################################################

awk:好用的数据处理工具

awk '条件类型1{动作1} 条件类型2{动作2} ...' filename


awk 的处理流程是:

  1. 读入第一行,并将第一行的数据填入 $0, $1, $2.... 等变量当中;

  2. 依据 "条件类型" 的限制,判断是否需要进行后面的 "动作";

  3. 做完所有的动作与条件类型;

  4. 若还有后续的『行』的数据,则重复上面 1~3 的步骤,直到所有的数据都读完为止。

    变量名称代表意义
    NF每一行 ($0) 拥有的栏位总数
    NR目前 awk 所处理的是『第几行』数据
    FS目前的分隔字节,默认是空白键

last -n 5 | awk '{print $1 "\t" $3}'

last -n 5| awk '{print $1 "\t lines: " NR "\t columns: " NF}'


awk 的逻辑运算字节

运算单元代表意义
>大於
<小於
>=大於或等於
<=小於或等於
==等於
!=不等於
  • awk 的命令间隔:所有 awk 的动作,亦即在 {} 内的动作,如果有需要多个命令辅助时,可利用分号『;』间隔, 或者直接以 [Enter] 按键来隔开每个命令,例如上面的范例中,鸟哥共按了三次 [enter] 喔!

  • 逻辑运算当中,如果是『等於』的情况,则务必使用两个等号『==』!

  • 格式化输出时,在 printf 的格式配置当中,务必加上 \n ,才能进行分行!

  • 与 bash shell 的变量不同,在 awk 当中,变量可以直接使用,不需加上 $ 符号。


cat /etc/passwd | \

> awk '{FS=":"} $3 < 10 {print $1 "\t " $3}'

cat /etc/passwd | \

> awk 'BEGIN {FS=":"} $3 < 10 {print $1 "\t " $3}'


[root@www ~]# cat pay.txt | \

> awk 'NR==1{printf "%10s %10s %10s %10s %10s\n",$1,$2,$3,$4,"Total" }

NR>=2{total = $2 + $3 + $4

printf "%10s %10d %10d %10d %10.2f\n", $1, $2, $3, $4, total}'


[root@www ~]# cat pay.txt | \

> awk '{if(NR==1) printf "%10s %10s %10s %10s %10s\n",$1,$2,$3,$4,"Total"}

NR>=2{total = $2 + $3 + $4

printf "%10s %10d %10d %10d %10.2f\n", $1, $2, $3, $4, total}'

######################################################################################################################################################################################


sed

sed [-nefri] ‘command’ 输入文本        

常用选项:
        
-n∶使用安静(silent)模式。在一般 sed 的用法中,所有来自 STDIN的资料一般都会被列出到萤幕上。但如果加上 -n 参数后,则只有经过sed 特殊处理的那一行(或者动作)才会被列出来。
        -e∶直接在指令列模式上进行 sed 的动作编辑;
        -f∶直接将 sed 的动作写在一个档案内, -f filename 则可以执行 filename 内的sed 动作;
        -r∶sed 的动作支援的是延伸型正规表示法的语法。(预设是基础正规表示法语法)
        -i∶直接修改读取的档案内容,而不是由萤幕输出。
       

常用命令:
        a   ∶新增, a 的后面可以接字串,而这些字串会在新的一行出现(目前的下一行)~
        c   ∶取代, c 的后面可以接字串,这些字串可以取代 n1,n2 之间的行!
        d   ∶删除,因为是删除啊,所以 d 后面通常不接任何咚咚;
         i   ∶插入, i 的后面可以接字串,而这些字串会在新的一行出现(目前的上一行);
         p  ∶列印,亦即将某个选择的资料印出。通常 p 会与参数 sed -n 一起运作~
         s  ∶取代,可以直接进行取代的工作哩!通常这个 s 的动作可以搭配正规表示法!例如 1,20s/old/new/g 就是啦!

[root@localhost ruby] # sed '$d' ab              #删除最后一行
 [root@localhost ruby] # sed '1,2d' ab           #删除第一行到第二行

[root@localhost ruby# sed -n '1p' ab           #显示第一行 

[root@localhost ruby] # sed -n '$p' ab           #显示最后一行
[root@localhost ruby] # sed -n '1,2p' ab        #显示第一行到第二行
[root@localhost ruby] # sed -n '2,$p' ab        #显示第二行到最后一行

[root@localhost ruby] # sed -n '/ruby/p' ab    #查询包括关键字ruby所在所有行
[root@localhost ruby] # sed -n '/\$/p' ab        #查询包括关键字$所在所有行,使用反斜线\屏蔽特殊含义

 [root@localhost ruby] # sed '1a drink tea' ab

 [root@localhost ruby] # sed '1,3a drink tea' ab


[root@hxin241 ~]#nl /etc/passwd | sed '2a Drink tea or ......\

> drink beer ?'

[root@hxin241 ~]#nl /etc/passwd | sed '2,5c No 2-5 number'

     1  root:x:0:0:root:/root:/bin/bash

[root@hxin241 ~]#No 2-5 number

[root@hxin241 ~]#nl /etc/passwd | sed -n '5,7p'



[root@hxin241 ~]# sed '1a 1\n2\n3' backup.bk

[root@hxin241 ~]# sed '1c wo fang qi le' backup.bk

[root@hxin241 ~]# sed '1,2c wo fang qi le' backup.bk

sed -i 's/\.$/\!/g' regular_express.txt

sed -i '$a # This is a test' regular_express.txt                       ====>最后一行新增

s/pattern/repacement/flags

1> 数字,表明新文本将替换第几处模式匹配的地方;
2> g,表明新文本将会替换所有已有文本出现的地方;
3> p,表明原来行的内容要打印出来;
4> w file,将替换原来行的结果写到文件中。

sed -n '/fa/p' backup.bk | sed 's/fang/bu fang/g'

sed -n '/fa/p' backup.bk | sed 's/fang//g'

ssed -n "/$test/p" backup.bk (注:若匹配字符串是变量,则需要“”)

 sed -i '/fang/s/fang/bu fang/g' backup.bk      #替换匹配行中的某个字符串

sed -i '1,33s/\t/\n/g' allnum

sed -e 's/brown/green/; s/dog/cat/' data1

sed -f script1.sed data1


单行上执行多条命令

sed '2{

> s/fox/elelhant/
> s/dog/cat/
> }' data1


line1
line2
line3
line4

 sed 'y/1234/6789/' data2

line6
line7
line8
line9


 截取一段(运维实用):

sed -n '/23 13:00:09/,/24 00:01:09/p' /var/log/maillog > backup.bk



  1. #!/bin/bash  

  2.   

  3. ip=`sed -n 's/ /\n/gp' /proc/cmdline | sed -n '/ipaddr/p' | sed -n 's/ipaddr=//gp'`  

  4. netmask=`sed -n 's/ /\n/gp' /proc/cmdline | sed -n '/netmask/p' | sed -n 's/netmask=//gp'`  

  5. gw=`sed -n 's/ /\n/gp' /proc/cmdline | sed -n '/gw/p' | sed -n 's/gw=//gp'`  

  6.   

  7. if [ "$ip" != "" -a "$netmask" != "" ]; then  

  8.     ifconfig eth0 $ip netmask $netmask  

  9. fi  

  10.   

  11. if [ "$gw" != "" ]; then  

  12.     route add default gw $gw   

  13. fi  


######################################################################################################################################################################################

★ACL:


dmesg | grep -i acl


setfacl:設定某個目錄/檔案的 ACL 規範。

[root@study ~]# setfacl [-bkRd] [{-m|-x} acl參數] 目標檔名選項與參數:

-m :設定後續的 acl 參數給檔案使用,不可與 -x 合用;

-x :刪除後續的 acl 參數,不可與 -m 合用;

-b :移除『所有的』 ACL 設定參數;

-k :移除『預設的』 ACL 參數,關於所謂的『預設』參數於後續範例中介紹;

-R :遞迴設定 acl ,亦即包括次目錄都會被設定起來;

-d :設定『預設 acl 參數』的意思!只對目錄有效,在該目錄新建的資料會引用此預設值


[root@study ~]# setfacl -m u:vbird1:rx acl_test1

[root@study ~]# setfacl -m u::rwx acl_test1

# 設定值中的 u 後面無使用者列表,代表設定該檔案擁有者,所以上面顯示 root 的權限成為 rwx 了


# 設定規範:『 g:[群組列表]:[rwx] 』,例如針對 mygroup1 的權限規範 rx :

[root@study ~]# setfacl -m g:mygroup1:rx acl_test1[root@study ~]

# getfacl acl_test1




getfacl:取得某個檔案/目錄的 ACL 設定項目;

[root@study ~]# getfacl filename選項與參數:

getfacl 的選項幾乎與 setfacl 相同!所以鳥哥這裡就免去了選項的說明啊!


# 請列出剛剛我們設定的 acl_test1 的權限內容:[root@study ~]

# getfacl acl_test1

# file: acl_test1   <==說明檔名而已!

# owner: root       <==說明此檔案的擁有者,亦即 ls -l 看到的第三使用者欄位

# group: root       <==此檔案的所屬群組,亦即 ls -l 看到的第四群組欄位

user::rwx           <==使用者列表欄是空的,代表檔案擁有者的權限

user:vbird1:r-x     <==針對 vbird1 的權限設定為 rx ,與擁有者並不同!

group::r--          <==針對檔案群組的權限設定僅有 r 

mask::r-x           <==此檔案預設的有效權限 

(mask)other::r--          <==其他人擁有的權限囉!


針對有效權限設定:『 m:權限 』

# 設定規範:『 m:[rwx] 』,例如針對剛剛的檔案規範為僅有 r :

[root@study ~]# setfacl -m m:r acl_test1

[root@study ~]# getfacl acl_test1# file: acl_test1

# owner: root

# group: root

user::rwxuser:vbird1:r-x        

#effective:r-- <==vbird1+mask均存在者,僅有 r 而已,x 不會生效

group::r--group:mygroup1:r-x     #effective:r--

mask::r--other::r--

通常鳥哥都是將 mask 設定為 rwx 啦!然後再分別依據不同的使用者/群組去規範她們的權限就是了。


使用預設權限設定目錄未來檔案的 ACL 權限繼承『 d:[u|g]:[user|group]:權限 』

[root@study ~]# setfacl -m d:u:myuser1:rx /srv/projecta

[root@study ~]# getfacl /srv/projecta


讓 ACL 的屬性全部消失又要如何處理?透過『 setfacl -b 檔名 』



單一設定值的取消

# 1.1 找到針對 myuser1 的設定值

[root@study ~]# getfacl /srv/projecta | grep myuser1

user:myuser1:r-x

default:user:myuser1:r-x


# 1.2 針對每個設定值來處理,注意,取消某個帳號的 ACL 時,不需要加上權限項目!

[root@study ~]# setfacl -x u:myuser1 /srv/projecta

[root@study ~]# setfacl -x d:u:myuser1 /srv/projecta


# 2.1 開始讓 pro3 這個用戶無法使用該目錄囉!

[root@study ~]# setfacl -m u:pro3:- /srv/projecta


當設定一個用戶/群組沒有任何權限的 ACL 語法中,在權限的欄位不可留白,而是應該加上一個減號 (-)

######################################################################################################################################################################################

对于输入重定向有这些情况:

符号作用
命令 < 文件将文件作为命令的标准输入
命令 << 分界符从标准输入中读入,直到遇见“分界符”才停止
命令 < 文件1 > 文件2将文件1作为命令的标准输入并将标准输出到文件2

对于输出重定向符有这些情况:

符号作用
命令 > 文件将标准输出重定向到一个文件中(清空原有文件的数据)
命令 2> 文件将错误输出重定向到一个文件中(清空原有文件的数据)
命令 >> 文件将标准输出重定向到一个文件中(追加到原有内容的后面)
命令 2>> 文件将错误输出重定向到一个文件中(追加到原有内容的后面)
命令 >> 文件 2>&1 或 命令 &>> 文件将标准输出与错误输出共同写入到文件中(追加到原有内容的后面)




######################################################################################################################################################################################

档案与目录的检视: ls

[root@linux ~]# ls [-aAdfFhilRS] 目录名称
[root@linux ~]# ls [--color={none,auto,always}] 目录名称
[root@linux ~]# ls [--full-time] 目录名称
              ls -al --full-time  ~
参数:
-a  :全部的档案,连同隐藏档( 开头为 . 的档案) 一起列出来~
-A  :全部的档案,连同隐藏档,但不包括 . 与 .. 这两个目录,一起列出来~
-d  :仅列出目录本身,而不是列出目录内的档案数据
-f  :直接列出结果,而不进行排序 (ls 预设会以档名排序!)
-F  :根据档案、目录等信息,给予附加数据结构,例如:
      *:代表可执行文件; /:代表目录; =:代表 socket 档案; |:代表 FIFO 档案;
-h  :将档案容量以人类较易读的方式(例如 GB, KB 等等)列出来;
-i  :列出 inode 位置,而非列出文件属性;
-l  :长数据串行出,包含档案的属性等等数据;
-n  :列出 UID 与 GID 而非使用者与群组的名称 (UID与GID会在账号管理提到!)
-r  :将排序结果反向输出,例如:原本档名由小到大,反向则为由大到小;
-R  :连同子目录内容一起列出来;
-S  :以档案容量大小排序!
-t  :依时间排序
--color=never  :不要依据档案特性给予颜色显示;
--color=always :显示颜色
--color=auto   :让系统自行依据设定来判断是否给予颜色
--full-time    :以完整时间模式 (包含年、月、日、时、分) 输出
--time={atime,ctime} :输出 access 时间或 改变权限属性时间 (ctime)
                       而非内容变更时间 (modification time)

######################################################################################################################################################################################

★cp [-adfilprsu]  来源文件(source)  目标文件(destination)

cp [options] source1 source2 source3 .... directory

cp ~/.bashrc /tmp/bashrc

cp -i ~/.bashrc /tmp/bashrc

cp -a /var/log/wtmp wtmp_2

cp -a /etc /tmp

cp -s bashrc bashrc_slink

cp -l bashrc bashrc_hlink

cp -u ~/.bashrc /tmp/bashrc

cp ~/.bashrc ~/.bash_history /tmp

cp bashrc_slink bashrc_slink_1

cp -d bashrc_slink bashrc_slink_2

-a :同-pdr ;(常用)

-p :连同档案属性一起复制,而非默认属性(备份常用); 

-r :递归持续复制;(常用)  

-i :已经存在时,在覆盖时会先询问(常用) 

-d :若为链接文件的属性(link file),则复制链接文件属性而非本身;

-f :强制,若目标档案已经存在且无法开启,则移除后再尝试; 

-l :建立硬式连结(hard link)连结档,而非本身; 

-s :复制为符号链接文件 (symbolic link); 

-u :若 destination 比 source 旧才更新 destination !

######################################################################################################################################################################################

★mv [-fiu] source destination

mv [options] source1 source2 source3 .... directory

-f :force 强制,目标已经存在不询问而直接覆盖; 

-i :询问是否覆盖

-u :若目标档案已经存在,且source较新,才会更新 (update)

mv bashrc mvtest

mv mvtest mvtest2(rename专职进行多个档名更名)


######################################################################################################################################################################################

★移除档案或目录:rm

rm [-fir] 档案或目录

rm -i bashrc

rm -i bashrc*

rmdir /tmp/etc

\rm -r /tmp/etc(忽略alias)

rm ./-aaa-

-f :就是 force 的意思

-i :预设互动模式

-r :递归删除

######################################################################################################################################################################################

★显示日历:cal

        cal [month] [year] 

        cal 10 2009

        cal 2009

######################################################################################################################################################################################

简单好用的计算器: bc

bc 

1+2+3+4  <==只有加法时 

10 

7-8+3 

10*52 

520 

10%3     <==计算『余数』 

10^2 

100 

10/100   <==这个最奇怪!不是应该是 0.1 吗? 

quit 

bc默认仅输出整数,如果要输出小数点下位数,那么就必须要运行 scale=number ,那个number就是小数点位数


scale=3     <==没错!就是这里!! 

1/3 

.333

######################################################################################################################################################################################

★取得路径文件名:basename

取得路径目录名:dirname

basename /etc/sysconfig/network

dirname /etc/sysconfig/network

######################################################################################################################################################################################

★变换目录:cd(Change Directory)

cd .. 上层目录

cd ~  家目录

cd -  刚刚的那个目录

######################################################################################################################################################################################

★检视档案:cat (concatenate) 

cat -n /etc/issue

cat -A /etc/xinetd.conf

-A :同-vET 的整合选项

-b :列出行号,仅针对非空白行做行号显示

-E :显示出结尾的断行字符 $ ;

-n :打印出行号,连同空白行也会有行号

-T :显示出[tab] 按键以 ^I ; 

-v :列出一些看不出的特殊字符

######################################################################################################################################################################################

★密码参数显示:chage

chage [-ldEImMW] 账号名

chage -l vbird2

-l :列出该账号的详细密码参数; 

-d :后面接日期,修改 shadow 第三字段(最近一次更改密码的日期)

-E :后面接日期,修改 shadow 第八字段(账号失效日),格式 YYYY-MM-DD 

-I :后面接天数,修改 shadow 第七字段(密码失效日期) 

-m :后面接天数,修改 shadow 第四字段(密码最短保留天数) 

-M :后面接天数,修改 shadow 第五字段(密码多久需要进行变更) 

-W :后面接天数,修改 shadow 第六字段(密码过期前警告日期)

★必须要更改过密码后才能够登入系统使用 bash 环境

useradd agetest

echo "agetest" | passwd --stdin agetest

chage -d 0 agetest

######################################################################################################################################################################################

★配置文件案隐藏属性:chattr

+ :增加某一个特殊参数,原本存在参数不动

- :移除某一个特殊参数,原本存在参数不动 

= :设定一定,且仅有后面接的参数

chattr +i attrtest

chattr -i attrtest

a :设定a后,只能增加数据,而不能删除也不能修改数据

i :不能被删除、改名、设定连结也无法写入或新增资料

A :设定A 这个属性时,若你有存取此档案(目录)时,他的访问时间 atime 将将会被修改,可避免I/O较慢的机器过度的存取磁盘

S :一般档案是异步写入磁盘,加上 S会『同步』写入磁盘中

c :自动将此档案『压缩』,读取时自动解压缩;储存时,先压缩再储存(对大档案蛮有用)

d :当dump程序被执行时,讴定 d 属性将可使该档案(目录)不会被 dump 备份 

s :删除档案被完全的移除出这个硬盘空间,误删完全无法救回 

u :与s 相反,删除档案数据内容存在磁盘中,可以救援该档案

######################################################################################################################################################################################

★改变所属群组:chgrp

chgrp [-R] dirname/filename ...

-R : 递归(recursive)

chgrp users install.log

######################################################################################################################################################################################

★改变档案拥有者:chown

-R : 递归(recursive)

chown bin install.log

chown root:root install.log

chown [-R]  账号名称    档案或目录

chown [-R]  账号名称:组名 档案或目录

######################################################################################################################################################################################

★改变权限:chmod

chmod 777 .bashrc

chmod 740 filename

chmod u=rwx,go=rx .bashrc

chmod a+w .bashrc

chmod a-x .bashrc

-R : 递归(recursive)

chmod [-R] xyz 档案或目录

chmod (u g o a)(+ - =)(r w x) 档案或目录

######################################################################################################################################################################################

★chkconfig --list [服务名称]

chkconfig [--level [0123456]] [服务名称] [on|off]

chkconfig --list |more

chkconfig --list | grep '3:on'

chkconfig --level 345 atd on

/etc/init.d/httpd status

chkconfig --list httpd

chkconfig httpd on; chkconfig --list httpd

chkconfig rsync off; chkconfig --list rsync


★设定自己的系统服务:chkconfig

chkconfig [--add|--del] [服务名称]

chkconfig: 35 80 70

chkconfig --add myvbird; chkconfig --list myvbird

chkconfig --del myvbird

rm /etc/init.d/myvbird

--add :增加一个服务名称给 chkconfig 来管理,该服务名称必须在 /etc/init.d/ 内 

--del :删除一个给 chkconfig 管理的服务

######################################################################################################################################################################################

★类图形接口管理模式:ntsysv

ntsysv [--level <levels>]

ntsysv --level 35

上下键: 在各个服务之间移动

空格键: 可以用来选择你所需要的服务是否自启动

tab 键: 可以在方框、OK、Cancel之间移动

[F1]键: 可以显示该服务的说明

######################################################################################################################################################################################

★显示日期:date

date +%Y/%m/%d

date +%H:%M

filename=${fileuser:-"filename"}

date1=$(date --date='2 days ago' +%Y%m%d)

date2=$(date --date='1 days ago' +%Y%m%d)

date3=$(date +%Y%m%d)


GMT(Greenwich Mean Time,格林威治标准时间)

UTC(Universal Time/Temps Cordonné 世界标准时间)

CST(Central Standard Time); 中国标准时间(China Standard Time)

GMT + 8 = UTC + 8 = CST


查看当前时区:date -R

设置系统时间:date --set “07/07/06 10:19" 


写入BIOS:hwclock -w

查看硬件时间:hwclock --show  | clock --show

设置硬件时间:hwclock --set --date="07/07/06 10:19"  |   clock --set --date="07/07/06 10:19"

硬件时间和系统时间同:hwclock --hctosys(hc代表硬件时间,sys代表系统时间) | clock --hctosys

系统时钟和硬件时钟同步:hwclock --systohc  | clock --systohc


修改设置时区:vi /etc/sysconfig/clock      ==>  

###############

ZONE=Asia/Shanghai(查/usr/share/zoneinfo下面的文件) 

# UTC=false 

# ARC=false                                       

###############

rm /etc/localtime                                  

ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime  


★window设置ntp服务器:

regedit   ==> 

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\W32Time\TimeProviders\NtpServer ==>

Enabled= 1

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\W32Time\Config      ==> 

AnnounceFlags=5                              

net stop w32time && net start w32time


vim /etc/crontab       ==>

/usr/sbin/ntpdate 192.168.9.20;hwclock -w >> /var/log/ntpdate.log


######################################################################################################################################################################################

★宣告变量类型:declare / typeset

declare [-aixr] variable

-a :定义变量variable为数组 (array) 类型

-i :定义变量variable为整数数字 (integer) 类型

-x :用法同export,定义变量variable为环境发量

-r :定义变量variable为 readonly 类型,不可更改内容,也不能 unset

declare -i sum=100+300+50

declare -r sum

declare -x sum(定义)

declare +x sum(取消)

declare -p sum(单独列出变量类型)

declare -i number=$RANDOM*10/32768 ; echo $number


  • 变量类型默认为『字符串』,所以若不指定变量类型,则 1+2 为一个『字符串』而不是『计算式』。 所以上述第一个运行的结果才会出现那个情况的;

  • bash 环境中的数值运算,默认最多仅能到达整数形态,所以 1/3 结果是 0;

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

★数组 (array) 变量类型

  • var[index]=content

范例:配置上面提到的 var[1] ~ var[3] 的变量。

[root@www ~]# var[1]="small min"

[root@www ~]# var[2]="big min"

[root@www ~]# var[3]="nice min"

[root@www ~]# echo "${var[1]}, ${var[2]}, ${var[3]}"

与循环或者其他判断式交互使用才有比较高的存在意义

######################################################################################################################################################################################

★列出文件系统整体磁盘使用量:df

df  [-ahikHTm]  [目录或文件名]

-a :列出所有文件系统,包括/proc等

-k :以 KBytes 显示

-m :以 MBytes显示

-h :以人们较易阅GBytes, MBytes, KBytes等显示

-H :以M=1000K进位方式

-T :连同该 partition filesystem名称也列出

-i :不用硬盘容量,而以inode数量显示

df -h

df -aT

df -ih

######################################################################################################################################################################################

★评估文件系统磁盘使用量:du

du  [-ahskm]  档案或目录名称

-a :列出所有档案与目录容量,默认仅统计目录

-h :以人们较易阅MBytes, GBytes等显示

-s :列出总量而已

-S :不包括子目录下的总计

-k :以 KBytes 显示 

-m :以 MBytes显示

du -a(将档案容量也列出来)

du -sm /*

######################################################################################################################################################################################

★档案比对:diff

diff  [-bBi]  from-file  to-file

from-file或to-file可以用-(Standard input)取代

-b :忽略一行当中,仅有多个空白的差异

-B :忽略空白行的差异。

-i :忽略大小写的不同。

diff passwd.old passwd.new

diff /etc/rc3.d/ /etc/rc5.d/(比对目录)


★旧档案升级为新档案:patch

diff -Naur passwd.old passwd.new > passwd.patch(扩展名默认为 .patch)

patch -pN < patch_file

patch -R -pN < patch_file <==还原

-p :后面可以接『取消几层目彔』癿意思。 

-R :代表还原,将新的文件还原成旧的版本。

patch -p0 < passwd.patch(更新旧版数据)

patch -R -p0 < passwd.patch(恢复)


★比对binary file:cmp

cmp [-s] file1 file2

-s :将所有不同点字节处都列出。预设输出第一个不同点。

cmp passwd.old passwd.new

######################################################################################################################################################################################

★分析核心产生的讯息:dmesg

dmesg | more

dmesg | grep -i hd

dmesg | grep -i eth

######################################################################################################################################################################################

★侦测系统资源变化:vmstat

vmstat  [-a]  {延迟  [总计侦测次数]}   ==》 CPU/内存等信息

vmstat  [-fs]                   ==》内存相关

vmstat  [-S 单位]                 ==》设定显示数据的单位

vmstat  [-d]                     ==》与磁盘有关

vmstat  [-p 分割槽]               ==》与磁盘有关

-a :使用inactive/active(活跃不否) 取代 buffer/cache的内存输出信息

-f :将开机到目前为止,系统复制 (fork) 的程序数

-s :将一些事件 (开机至目前为止) 导致的内存变化情况列表说明

-S :后面可以接单位,例如 K/M 取代 bytes

-d :列出磁盘的读写总量统计表 

-p :后面列出分割槽,可显示该分割槽癿读写总量统计表

vmstat 1 3

vmstat -d

wKiom1g3sO-RtyAoAAAat3DzNu0535.png-wh_50

wKiom1g3r8LxQPwwAAG2Ts-0B8k063.png-wh_50

######################################################################################################################################################################################

★观察系统启动时间与工作负载:uptime

uptime(显示出 top 的最上面一行)

######################################################################################################################################################################################

★查阅系统与核心相关信息:uname

uname [-asrmpi]

uname -a

-a :所有系统信息,包括底下的数据

-s :系统核心名称 

-r :核心版本 

-m :本系统硬件名称,例如 i686、x86_64

-p :CPU 癿类型,同-m 类似,显示的是CPU的类型

-i :硬件的平台 (ix86)

######################################################################################################################################################################################

★观察内存使用情况:free

free [-b|-k|-m|-g] [-t]

-b :直接free显示单位是 Kbytes,使用 b(bytes), m(Mbytes) k(Kbytes), 及 g(Gbytes) 显示

-t :在输出最终结果,显示物理内存、swap的总量。

######################################################################################################################################################################################

★完整备份工具:dump

dump [-Suvj] [-level] [-f 备份档] 待备份资料

dump -S /dev/hdc1

dump -0u -f /root/boot.dump /boot

cat /etc/dumpdates

dump -W


dd if=/dev/zero of=/boot/testing.img bs=1M count=10

dump -1u -f /root/boot.dump.1 /boot


dump -0j -f /root/etc.dump.bz2 /etc

-S :仅列出后面待备份数据需要多少磁盘空间才能够备份完毕

-u :将dump的时间记录到/etc/dumpdates

-v :显示出dump的档案过程;

-j :支持bzip2,将数据压缩,默认bzip2压缩等级为2 

-level:等级,从 -0 ~ -9 共十个等级

-f :类似 tar 啦!后面接产生的档案,亦可接例如 /dev/st0 装置文件名等 

-W :列出在 /etc/fstab 里面的具有dump设定的partition是否有备份过


★dump的复原工具:restore

restore -t [-f dumpfile] [-h]      ==>   用杢察看 dump 檔

restore -C [-f dumpfile] [-D 挂载点]  ==>  比较dump与实际档案

restore -i [-f dumpfile]          ==>互动模式

restore -r [-f dumpfile]          ==>还原整个文件系统

各种模式无法混用

-t :察看 dump的备份文件中有什么重要数据,同tar -t 

-C :比较dump 内的数据跟实际的文件系统,最终会列出在 dump档案内有记录的且目前文件系统不一样』的档案

-i :互动模式,可以仅还原部分档案,用在 dump 目录时的还原! 

-r :将整个 filesystem 还原的一种模式,用在还原针对文件系统的dump备份;

其他较常用到癿选顷功能: 

-h :察看完整备份数据中的inode与文件系统 label 等信息 

-f :后面就接你要处理的那个 dump 档案啰! 

-D :与-C 迚行搭配,可以查出后面接的挂载点与dump内有不同的档案!

restore -t -f /root/boot.dump


restore -C -f /root/boot.dump

restore -r -f /root/boot.dump


restore -i -f /root/etc.dump

######################################################################################################################################################################################

★将 [tab]键转成空格键:expand

expand [-t] file

-t :后面可以接数字。一般一个 tab 键可以用 8 个空格键取代。

grep '^MANPATH' /etc/man.config | head -n 3 |cat -A

grep '^MANPATH' /etc/man.config | head -n 3 | \ > expand -t 6 - | cat -A


★unexpand

######################################################################################################################################################################################

★观察所有变量:set

★PS1:(提示字符的设定)

\d :可显示出『星期 月 日』的日期格式,如:"Mon Feb 2"

\H :完整的主机名。丼例杢说,鸟哥的练习机为『www.vbird.tsai』

\h :仅取主机名在第一个小数点之前癿名字,如鸟哥主机则为『www』后面省略

\t :显示时间,为 24 小时格式『HH:MM:SS』

\T :显示时间,为 12 小时格式『HH:MM:SS』

\A :显示时间,为 24 小时格式『HH:MM』

\@ :显示时间,为 12 小时格式『am/pm』样式

\u :目前使用者的账号名称,如『root』;

\v :BASH 的版本信息,如鸟哥的测试主板本为 3.2.25(1),仅取『3.2』显示

\w :完整的工作目录名称,由根目录写起的目录名称。但家目录会以 ~ 取代;

\W :利用 basename 凼数取得工作目录名称,所以仅会列出最后一个目录名。

\# :下达的第几个指令。

\$ :提示字符,如果是 root 时,提示字符为 # ,否则就是 $ 啰~


PS1='[\u@\h \w \A #\#]\$ '


★自定义发量转成环境发量:export

export 发量名称

export   ==>   查询环境变量

######################################################################################################################################################################################

★影响显示结果的语系变量:locale

locale -a

语系文件位置:/usr/lib/locale/

系统默认语系:/etc/sysconfig/i18n

######################################################################################################################################################################################

★观察文件类型:file

file ~/.bashrc                   ==>  /root/.bashrc: ASCII text

file /usr/bin/passwd               ==>   ...(uses shared libs)...

file /var/lib/mlocate/mlocate.db       ==>   /var/lib/mlocate/mlocate.db: data

######################################################################################################################################################################################

★寻找执行档:which 

which [-a] command

-a :将所有由 PATH 目录中可以找到的指令均列出,而不止第一个被找到的指令名称

which ifconfig

which which

which cd

######################################################################################################################################################################################

★寻找特定档案:whereis

whereis [-bmsu] 档案或目录名

whereis ifconfig         ==> 用which一般使用者找不到ifconfig,用whereis可以

whereis -m passwd

-b :只找 binary格式的档案 

-m :只找在说明文件 manual 路径下的档案 

-s :只找 source 来源档案 

-u :搜寻不在上述三个项目中的其他特殊档案

######################################################################################################################################################################################

★locate

locate [-ir] keyword

locate passwd

-i :忽略大小写

-r :后面可接正则表示法的显示方式

寻找数据库:/var/lib/mlocate/

手动更新数据库:updatedb

######################################################################################################################################################################################

★find

find [PATH] [option] [action]

find / -mtime 0

find / -mtime 3

find /etc -newer /etc/passwd

find /home -user vbird

find / -nouser

find /var -type s

find / -perm +7000

find / -perm -7000

find /bin /sbin -perm +6000

find / -perm +7000 -exec ls -l {} \;

find / -size +1M

find /etc -name '*httpd*'


-mtime n :n 为数字,意义为在 n 天之前的『一天之内』被更改过内容癿档案 

-mtime +n :列出在 n 天之前(不含n 天本身)被更改过内容的档案档名

-mtime -n :列出在 n 天之内(含 n 天本身)被更改过内容的档案档名

-newer file :file 为一个存在的档案,列出比 file 还要新的档案档名

wKioL1g3-byw2hShAAAK5vkC_lY398.png-wh_50

-uid n    :   n 为数字,UID

-gid n     :  n 为数字,这个数字是组名的UID,

-user name  :  name 为使用者账号名称

-group name :  name 为组名

-nouser   :  寻找档案的拥有者不在/etc/passwd 的

-nogroup :寻找档案的拥有者不在/etc/group的

-name filename:搜寻文件名为 filename 的档案

-size [+-]SIZE:搜寻比 SIZE 还要大(+)或小(-)的档案。这个 SIZE 有c:代表 byte,k:代表 1024bytes。

-type TYPE :搜寻档案的类型为TYPE的,类型主要有:一般正规档案 (f), 装置档案 (b, c), 目录 (d), 连结档 (l), socket (s), 及 FIFO (p) 等属性。

-perm mode :搜寻档案权限为mode的档案,例如  -perm 4755

-perm -mode :搜寻档案权限必须要全部囊括mode的权限的档案,例如 -rwsr-xr-x(4755)囊括-rwxr--r--(0744)

-perm +mode :搜寻档案权限包含mode任一权限的档案,例如 -rwxr-xr-x (755)含-rw-------

-exec command :command 为其他指令,-exec 后面可再接额外的指令来处理搜寻到的结果(不支持命令别名)

######################################################################################################################################################################################

★xargs

 xargs 可以读入 stdin 的数据,并且以空格符或断行字符作为分辨,将 stdin 的数据分隔成为 arguments 。 因为是以空格符作为分隔,所以,如果有一些档名或者是其他意义的名词内含有空格符的时候, xargs 可能就会误判

xargs [-0epn] command

cut -d':' -f1 /etc/passwd |head -n 3| xargs finger

cut -d':' -f1 /etc/passwd |head -n 3| xargs -p finger

cut -d':' -f1 /etc/passwd | xargs -p -n 5 finger

cut -d':' -f1 /etc/passwd | xargs -p -e'lp' finger

ll (ls) 不支持管线命令

find /sbin -perm +7000 | xargs ls -l

-0 :如果输入stdin有特殊字符,如 `, \, 空格键等等字符,-0将他还原成一般字符。这个参数可以用于特殊状态喔

-e :这个是 EOF (end of file)的意思。后面可以接一个字符串,当 xargs 分析到这个字符串时,就停止工作

-p :在执行每个指令的argument 时,都会询问使用者的意思

-n :后面接次数,每次 command 指令执行时,要使用几个参数癿意思

当 xargs 后面没有接任何指令时,默讣是以 echo 输出


减号 - 的用途

tar -cvf - /home | tar -xvf -

######################################################################################################################################################################################

★查阅用户相关信息:finger

finger [-s] username

-s :仅列出用户账号、全名、终端机代号、登入时间等等; 

-m :列出与后面接的账号相同者,而不是利用部分比对 (包括全名部分)


echo "I will study Linux during this year." > ~/.plan

finger vbird1


★chfn [-foph] [账号名]

-f :后面接完整的大名; 

-o :您办公室的房间号码; 

-p :办公室的电话号码; 

-h :家里的电话号码!


★chsh [-ls]

-l :列出目前系统上面可用的 shell ,其实就是 /etc/shells 的内容

-s :设定修改自己的Shell

chsh -s /bin/csh; grep vbird1 /etc/passwd

chsh -s /bin/bash


★查询某人、自己的相关 UID/GID 等等信息:id 

id [username]

######################################################################################################################################################################################

★磁盘检验: fsck, badblocks

fsck [-t 文件系统] [-ACay] 装置名称

fsck -C -f -t ext3 /dev/hdc6

fsck[tab][tab]

-t :如同 mkfs 一样,fsck 也是个综合软件而已!因此我们同样需要指定文件系统。 不过现今的Linux 太聪明了,他会自动的透过 superblock 去分辨文件系统, 因此通帯可以不需要

-A :依据 /etc/fstab 的内容,将需要的装置扫瞄一次。/etc/fstab

-a :自动修复检查到的有问题的扇区,所以你不用一直按 y 

-y :与-a 类似,但是某些 filesystem 仅支持 -y 这个参数! 

-C :可以在检验的过程当中,使用一个直方图来显示目前的进度!

EXT2/EXT3 的额外选顷功能:(e2fsck 这支指令所提供) 

-f :强制检查!一般来说,如果 fsck 没有发现任何unclean的旗标,丌会不会主动进入细部检查的,如果您想要强制 fsck 迚入细部检查,就得加上 -f 旗标

-D :针对文件系统下的目录进行优化配置。

Linux 开机进入单人单机模式下进行维护的行为时,才必项使用此一指令!

刚刚格式化成功癿硬盘有问题时,

可能会造成部分 filesystem的损坏,所以『执行 fsck 时, 被检查的partition 务必不可挂载到系统上

fsck 检查文件系统后,若出现问题时,有问题的数据会被放置到『lost+found』


★badblocks -[svw] 装置名称 

-s :在屏幕上列出进度 

-v :可以在屏幕上看到进度 

-w :使用写入的方式来测试,建议不要使用此一参数,尤其是待检查的装置已有档案时!

badblocks -sv /dev/hdc6

######################################################################################################################################################################################

★函数:function

function fname() {

   程序段 

}

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

function printit()

echo "Your choice is $1" 

}

case $1 in 

"one") 

printit 1;; 

"two") 

printit 2;; 

"three") 

printit 3 ;; 

*) echo "Usage $0 {one|two|three}" ;; 

esac

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

######################################################################################################################################################################################

★由档案(或文件系统)找出正在使用该档案的程序:fuser

fuser [-umv] [-k [i] [-signal]] file/dir

fuser -uv .

fuser -uv /proc

fuser -mvu /proc

find /var -type p   ===》   fuser -uv /var/gdm/.gdmfifo   ===》 

fuser -ki /var/gdm/.gdmfifo


-u :除了程序PID外,同时列出该程序拥有者

-m :后面接的那个档名会主动上提到该文件系统的最顶局,对 umount 不成功很有用

-v :可以列出每个档案与程序还有挃令的完整相关性

-k :找出使用该档案/目录的 PID ,并试图以 SIGKILL 这个讯号给予该 PID

-i :必项不 -k 配合,在删除 PID 前会先询问使用者意愿

-signal:例如 -1 -15 等等,若不加默认SIGKILL (-9) 


c :此程序在当前目录下(非次目录);

e :可被触发为执行状忞;

f :是一个被开启档案;

r :代表顶局目录 (root directory);

F :该档案被开启了,不过在等待回应中;

m :可能为分享的动态凼式库;

######################################################################################################################################################################################

★列出被程序所开启的档案文件名:lsof 

lsof [-aUu] [+d]

lsof 

lsof -u root -a -U

lsof +d /dev

lsof -u root | grep bash

-a :多项数据需要『同时成立』才显示出结果时

-U :仅列出 Unix like 系统的socket 文件类型

-u :后面接 username,列出该用户相关程序所所开启的档案

+d :后面接目录,亦找出某个目录底下已经被开启的档案!


★找出某支正在执行的程序的:PIDpidof 

pidof [-sx] program_name

-s :仅列出一个 PID 而不列出所有的PID 

-x :同时列出该 program name 可能的PPID 那个程序的PID

pidof init syslogd

######################################################################################################################################################################################

★新增与移除群组:groupadd

groupadd [-g gid] [-r] 组名

groupadd group1

-g :后面接某个特定的 GID ,用来直接给予某个 GID ~ 

-r :建立系统群组啦!与/etc/login.defs 内的GID_MIN 有关。


★groupmod

groupmod [-g gid] [-n group_name] 群组名

groupmod -g 201 -n mygroup group1

-g :修改既有的GID 数字 

-n :修改既有的组名

随意的更动GID ,容易造成系统资源错乱


★groupdel

groupdel [groupname]

groupdel mygroup


★群组管理员功能:gpasswd

gpasswd groupname

gpasswd [-A user1,...] [-M user3,...] groupname

gpasswd [-rR] groupname

groupadd testgroup

gpasswd testgroup

gpasswd -A vbird1 testgroup

:若没有任何参数时,表示给予 groupname 一个密码(/etc/gshadow) 

-A :将 groupname 的主控权交由后面的使用者管理(该群组的管理员) 

-M :将某些账号加入这个群组中! 

-r :将 groupname的密码移除 

-R :让 groupname 的密码栏失效


群组管理员执行:

gpasswd [-ad] user groupname

-a :将某位使用者加入到groupname 这个群组中

-d :将某位使用者移除出 groupname 这个群组中

gpasswd -a vbird1 testgroup

grep testgroup /etc/group

######################################################################################################################################################################################

★新增、移除使用者: useradd, 相关配置文件, passwd, usermod, userdel

★新增使用者useradd

useradd [-u UID] [-初始群组] [-G 次要群组] [-mM]\ 

> [-c 说明栏] [-d 家目录绝对路径] [-s shell] 使用者账号名

useradd vbird1

grep vbird1 /etc/passwd /etc/shadow /etc/group

useradd -u 700 -g users vbird2

useradd -D

系统账号主要是用来进行运作系统所需服务的权限设定  ===》  useradd -r vbird3

-u :后面接UID 

-g :后面接的那个组名就是我们上面提到的initial group,该群组的GID 会被放置到/etc/passwd的第四个字段内。

-G :后面接组名则是这个账号还可以加入的群组。 这个选项不参数会修改 /etc/group 内的相关资料

-M :强制!不要建立用户家目录!(系统账号默认值) 

-m :强制!要建立用户家目录!(一般账号默认值) 

-c :这个就是 /etc/passwd的第五栏的说明内容

-d :指定某个目录成为家目录,而不要使用默认值。务必使用决定路径! 

-r :建立一个系统的账号,这个账号的UID 会有限制 (参考 /etc/login.defs) 

-s :后面接一个shell ,若没有指定则预设是 /bin/bash 

-e :后面接一个日期,格式为『YYYY-MM-DD』此项目可写入 shadow 第八字段, 亦账号失效日的设定项目

-f :后面接 shadow 的第七字段项目,制定密码是否会失效。0为立刻失效, -1 为永进性失效(密码叧会过期而强制于登入时重新设定而已。)


★usermod

usermod [-cdegGlsuLU] username

usermod -c "VBird's test" vbird2

usermod -e "2009-12-31" vbird2

ll -d ~vbird3

cp -a /etc/skel /home/vbird3

chown -R vbird3:vbird3 /home/vbird3

chmod 700 /home/vbird3

-c :后面接账号的说明,即/etc/passwd 第五栏的说明栏,可以加入一些账号的说明

-d :后面接账号的家目录,即修改 /etc/passwd 的第六栏

-e :后面接日期,格式是 YYYY-MM-DD 也就是在 /etc/shadow 内的第八个字段数据

-f :后面接天数,为 shadow的第七字段。 

-g :后面接初始群组,修改 /etc/passwd 的第四个字段,亦即是 GID的字段

-G :后面接次要群组,修改这个使用者能够支持的群组,修改的是 /etc/group

-a :与-G 合用,可『增加次要群组的支持』而非『设置定』

-l :后面接账号名称。亦即是修改账号名称,/etc/passwd 的第一栏

-s :后面接 Shell的实际档案,例如 /bin/bash或/bin/csh 等等

-u :后面接 UID 数字啦!即/etc/passwd 第三栏的资料; 

-L :暂时将用户的密码冻结,使他无法登入。其实仅改 /etc/shadow 得密码栏

-U :将 /etc/shadow 密码栏的 ! 拿掉,解冻


★userdel

userdel [-r] username 

-r :连同用户的家目录也一起移除

userdel -r vbird2

find / -user username   ===》   userdel [-r] username 


★passwd

passwd [--sdtin] <==所有人均可使用来改自己的密码

passwd [-l] [-u] [--sdtin] [-S] \ 

> [-n 日数] [-x 日数] [-w 日数] [-i 日期] 账号 <==root 功能

passwd vbird2

passwd -S vbird2

passwd -x 60 -i 10 vbird2

passwd -l vbird2

passwd -u vbird2

--stdin :可以透过自前一个管线的数据,作为密码输入,对 shell script 有帮助

-l :是 Lock 癿意思,会将 /etc/shadow 第二栏最前面加上 ! 使密码失效

-u :与-l 相对,是 Unlock 癿意思! 

-S :列出密码相关参数,亦shadow 档案内的大部分

-n :后面接天数,shadow 的第 4 字段,多久不可修改密码天数 

-x :后面接天数,shadow 的第 5 字段,多久内必须要修改密码 

-w :后面接天数,shadow的第 6 字段,密码过期前的警告天数 

-i :后面接『日期』,shadow 的第 7 字段,密码失效日期

######################################################################################################################################################################################

★cat (concatenate)

cat [-AbEnTv] 

cat -n /etc/issue

cat -A /etc/xinetd.conf


-A :相当于-vET的整合选项,可列出一些特殊字符而不是空白而已

-b :列出行号,仅针对非空白行做行号显示,空白行不标行号

-E : 显示结尾的断行字符 $

-n :打印出行号,连同空白行也会有行号,与-b的选项不同

-T :显示[tab] 键以 ^I

-v :列出一些看不出来的特殊字符


★tac (反向列示)

tac /etc/issue


添加行号打印:nl

nl [-bnw] 档案

nl /etc/issue 

nl -b a /etc/issue

nl -b a -n rz /etc/issue

nl -b a -n rz -w 3 /etc/issue

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

-b a :表示开始是否为空行,也同样列出行号(类似 cat -n)

-b t :如果有空行,空的那一行不要列出行号(默认值)

-n :列出行号表示的方法,主要有三种: 

-n ln :行号在屏幕的最左方显示

-n rn :行号在自己字段的最右方显示,且不加 0 

-n rz :行号在自己字段的最右方显示,且加 0

-w :行号字段占用的位数


★一页一页翻动:more

more /etc/man.config


空格键 (space):代表向下翻一页;

Enter :代表向下翻『一行』

/字符串 :代表在这个显示的内容中,向下搜寻『字符串』这个关键词,重复搜寻同一个字符串, 可以直接按下 n

:f :立刻显示出文件名以及目前显示的行数

q :代表立刻离开 more

b 或[ctrl]-b :代表往回翻页,不过这动作只对档案有用,对管线无用


★一页一页翻动:less

空格键 :向下翻一页;

[pagedown]:向下翻一页;

[pageup] :向上翻一页;

/字符串 :向下搜寻『字符串』功能;

?字符串 :向上搜寻『字符串』功能;

n :重复前一个搜寻 (与/ 或? 有关!)

N :反向的重复前一个搜寻 (与/ 或 ? 有关!)

q :离开 less 这个程序

######################################################################################################################################################################################

★取出前面几行:head 

head [-n number] 档案

head -n -100 /etc/man.config

-n :后面接数字,代表显示几行的意思

head /etc/man.config  ==》 默认前面十行

head -n -100 /etc/man.config   前面41行,后面100行不会打印

head -n 20 /etc/man.config | tail -n 10


★取出后面几行:tail

tail [-n number] 档案

tail -n 20 /etc/man.config

tail -n +100 /etc/man.config  ==》 100行以后

-n :后面接数字,代表显示几行的意忠 

-f :表示持续侦测后面所接档名,要等到[ctrl]-c才会结束tail的侦测


★非纯文本档: od

od [-t TYPE] 档案

od -t c /usr/bin/passwd

od -t oCc /etc/issue

-t :后面可以接各种『类型 (TYPE)』输出,例如: 

a :利用默认的字符输出

c :使用 ASCII 字符输出 

d[size] :利用十进制(decimal)输出数据,每个整数占用 size bytes

f[size] :利用浮点数(floating)输出数据,每个数占用 size bytes 

o[size] :利用八进制(octal)输出数据,每个整数占用 size bytes

x[size] :利用十六进制(hexadecimal)输出数据,每个整数占用 size bytes 

######################################################################################################################################################################################

★modification time (mtime): 当该档案的『内容数据』变更时,就会更新这个时间!内容数据指的是档案的内容,而不是档案的属性、权限

status time (ctime): 当该档案的『状忞 (status)』改变时,就会更新这个时间,像是权限、属性被更改了,都会更新这个时间

access time (atime): 当『该档案的内容被取用』时,就会更新这个读取时间 (access)。我们使用 cat 去读取 /etc/man.config ,就会更新该档案的atime 了


ls -l /etc/man.config

ls -l --time=atime /etc/man.config

ls -l --time=ctime /etc/man.config

######################################################################################################################################################################################

★修改档案时间或建置新档: touch

touch [-acdmt] 档案

touch -d "2 days ago" bashrc

touch -t 0709150202 bashrc


-a :仅修订 access time

-c :仅修改档案的时间,若该档案不存在则不建立新档案

-d :后面可以接欲修订的日期而不用目前的日期,也可以使用 --date="日期或时间" 

-m :仅修改 mtime 

-t :后面可以接欲修订的时间而不用目前的时间,格式为[YYMMDDhhmm]

######################################################################################################################################################################################

★将某个时间点的程序运作情况截取下来:ps

ps aux  ==》   观察系统所有的程序数据

ps -lA  ==》  也是能够观察所有系统的数据

ps axjf  ==》   连同部分程序树状态

ps -l   ==》   查阅自己 bash 程序

ps -lA

ps aux | egrep '(cron|syslog)'


-A :所有的process 均显示出来,与-e 具有同样的效果

-a :不与terminal 有关的所有 process 

-u :有效使用者 (effective user) 相关的 process

x :通常与a 这个参数一起使用,可列出较完整信息

输出格式规划: 

l :较长、较详细的将该 PID 的信息列出

j :工作的格式 (jobs format) 

-f :做一个更为完整的输出 


S:代表这个程序的状态 (STAT),主要的状态有:

o R (Running):该程序正在运作中;

o S (Sleep):该程序目前正在睡眠状态(idle),但可以被唤醒(signal)

o D :不可被唤醒的睡眠状忞,通常这支程序可能在等待 I/O 癿情况(ex>打印)

o T :停止状忞(stop),可能是在工作控制(背景暂停)或除错 (traced) 状态

o Z (Zombie):僵尸状忞,程序已经终止但即无法被移除至内存外。

######################################################################################################################################################################################

★pstree

pstree -A

pstree -Aup


pstree [-A|U] [-up]

-A :各程序树之间的连接以 ASCII 字符来连接

-U :各程序树之间癿连接以万国码的字符来连接。在某些终端接口下可能会有错误

-p :并同时列出每个 process 的PID

-u :并同时列出每个 process 的所属账号名称

######################################################################################################################################################################################

★观察目前的工作:jobs

jobs [-lrs]

-l :列出 job number 、指令串、 PID号码

-r :仅列出正在背景 run的工作

-s :仅列出正在背景当中暂停 (stop) 的工作。


★fg %jobnumber

%jobnumber :jobnumber 为工作号码(数字),%可有可无

fg %1

fg -


★在背景下运行:bg

jobs ; bg %3 ; jobs



bash只能够管理自己的job,login out后job停止。

工作状态:『暂停 (stop)』     『运作中 (running)』   『完成 (done)』

tar -zpcf /tmp/etc.tar.gz /etc &

tar -zpcvf /tmp/etc.tar.gz /etc > /tmp/log.txt 2>&1 &



wKioL1g7-qHQLgZlAADidt2UIyk154.png-wh_50

★kill -signal PID(%jobnumber)

kill -l    ==>  列出够使用的讯号,R (Running),S (Sleep):D :不可被唤醒的睡眠状态,T :停止状忞(stop),Z (Zombie):僵尸状态  C:代表 CPU 使用率,SZ:使用内存

kill -9 %2; jobs

kill -SIGTERM %1

-1 :重新读取一次参数的配置文件 (类似 reload); 

-2 :代表不由键盘输入 [ctrl]-c 同样的劢作; 

-9 :立刻强制删除一个工作; 

-15:以正常的程序方式终止一个工作。

% 是专门用在工作控制


★kill -signal PID

kill -SIGHUP $(ps aux|grep 'syslog'|grep -v 'grep'|awk '{print $2}')


★killall -signal 指令名称

killall [-iIe] [command name]

killall -1 syslogd

killall -9 httpd

killall -i -9 bash

-i :interactive 的意思,会出现提示是否删除字符给用户

-e :exact的意思,表示『后面接的command name 要一致』,但整个完整的指令不能超过 15 个字符

-I :指令名称(可能含参数)忽略大小写


★pkill  选项 参数

-o:仅向找到的最小(起始)进程号发送信号

-n:仅向找到的最大(结束)进程号发送信号

-P:指定父进程号发送信号; 

-g:指定进程组

-t:指定开启进程的终端


★strace -e trace=file pkill bt_uinfo_memcached 2>&1 | grep open | tail★

/proc/31721/status

/proc/31721/cmdline

★strace -e trace=file killall bt_uinfo_memcached 2>&1 | grep open | tail★

/proc/31705/stat

★找出某支正在执行的程序的:PIDpidof   ==>  还查找/proc/pid/exe的symbol link

pidof [-sx] program_name

pidof init syslogd

-s :仅列出一个 PID 而不列出所有的PID 

-x :同时列出该 program name 可能的PPID 那个程序的PID



★脱机工作:nohup        <==不支持 bash 内建指令

nohup [指令与参数]    <==在终端机前景中工作

nohup [指令与参数] &  <==在终端机背景中工作

chmod a+x sleep500.sh

nohup ./sleep500.sh &

######################################################################################################################################################################################

★动态观察程序变化:top

top [-d 数字] | top [-bnp]

top -d 2

top -b -n 2 > /tmp/top.txt

top -d 2 -p 13639

==>  r   ==>  Renice PID 13639 to value: 10

-d :接秒数,程序画面更新的秒数

-b :以批次的方式执行 top,通常会搭配数据流重导向来将批次的结果输出成为档案

-n :与-b 搭配,需要进行几次 top 的输出结果

-p :指定某些个 PID 来进行观察监测而已

? :显示在 top 当中可以输入的指令; 

P :以 CPU排序

M :以 Memory排序

N :以 PID 排序

T :由CPU 时间排序

k :给予某个 PID一个讯号 (signal)

r :给予某个 PID 重新制订一个 nice 值

q :离开 top

######################################################################################################################################################################################

★磁盘配额 (Quota)

对整个 partition 的限制项目主要分为底下几个部分:

soft:这是最低限制容量的意思,用户在宽限期间之内,他的容量可以超过 soft ,但必需要宽限时间之内将磁盘容量降低到 soft 的容量限制之下!

hard:这是『绝对不能超过』的容量!

宽限时间:也就是当您的使用者使用的空间超过了 soft limit ,却还没有到达 hard limit 时,那么在这个『宽限时间』之内, 就必需要请用户将使用的磁盘容量降低到 soft limit 之下


[root@linux ~]# quota [-uvsl] [username]
[root@linux ~]# quota [-gvsl] [groupname]
参数:
-u  :后面可以接 username ,表示显示出该用户的 quota 限制值。若不接 username
      ,表示显示出执行者的 quota 限制值。
-g  :后面可接 groupname ,表示显示出该群组的 quota 限制值。
-v  :显示每个 filesystem 的 quota 值;
-s  :可选择以 inode 或磁盘容量的限制值来显示;
-l  :仅显示出目前本机上面的 filesystem 的 quota 值。

[root@linux ~]# quota -guvs
[root@linux ~]# quota -vs -u dmtsai

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

[root@linux ~]# quotacheck [-avug] [/mount_point]参数:
quotacheck -avug
-a  :扫瞄所有在 /etc/mtab 内,含有 quota 支持的 filesystem,加上此参数后, 
      /mount_point 可不必写,因为扫瞄所有的 filesystem 了嘛!
-u  :针对用户扫瞄档案与目录的使用情况,会建立 aquota.user
-g  :针对群组扫瞄档案与目录的使用情况,会建立 aquota.group
-v  :显示扫瞄过程的信息;
-M  :『强制』进行 quotacheck 的扫瞄。

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

★edquota

[root@linux ~]# edquota [-u username] [-g groupname]
[root@linux ~]# edquota -t  <==修改恕限时间
[root@linux ~]# edquota -p username_demo -u username

edquota -u dmtsai

edquota -p dmtsai -u vbird1
edquota -t

参数:
-u  :后面接账号名称。可以进入 quota 的编辑画面 (vi) 去设定 username 的限制值;
-g  :后面接组名。可以进入 quota 的编辑画面 (vi) 去设定 groupname 的限制值;
-t  :可以修改恕限时间 (就是超过 quota 的 soft limit 值后,还能使用硬盘的宽限期限)
-p  :复制范本。那个 username_demo 为已经存在并且已设定好 quota 的使用者,
      意义为『将 username_demo 这个人的 quota 限制值复制给 username 』!

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~


★quotaon

quotaon -auvg
quotaon -uv /disk2

[root@linux ~]# quotaon [-avug]
[root@linux ~]# quotaon [-vug] [/mount_point]
参数:
-u  :针对使用者启动 quota (aquota.user)
-g  :针对群组启动 quota (aquota.group)
-v  :显示启动过程的相关讯息;
-a  :根据 /etc/mtab 内的 filesystem 设定启动有关的 quota ,若不加 -a 的话,
      则后面就需要加上特定的那个 filesystem 喔!

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

quotaoff

[root@linux ~]# quotaoff [-a]
[root@linux ~]# quotaoff [-ug] [/mount_point]
参数:
-a  :全部的 filesystem 的 quota 都关闭 (根据 /etc/mtab)
-u  :仅针对后面接的那个 /mount_point 关闭 user quota
-g  :仅针对后面接的那个 /mount_point 关闭 group quota

[root@linux ~]# quotaoff -a


######################################################################################################################################################################################

★惯用的关机命令: shutdown

 /sbin/shutdown [-t 秒] [-arkhncfF] 时间 [警告信息] 

选项与参数: 

-t sec : -t 后面加秒数,亦即『过几秒后关机』的意思 

-k     : 不要真的关机,只是发送警告信息出去! 

-r     : 在将系统的服务停掉之后就重新启动(常用) 

-h     : 将系统的服务停掉后,立即关机。 (常用) 

-n     : 不经过 init 程序,直接以 shutdown 的功能来关机 

-f     : 关机并启动之后,强制略过 fsck 的磁盘检查 

-F     : 系统重新启动之后,强制进行 fsck 的磁盘检查 

-c     : 取消已经在进行的 shutdown 命令内容。 

时间   : 这是一定要加入的参数!指定系统关机的时间!时间的范例底下会说明。 

/sbin/shutdown -h 10 'I will shutdown after 10 mins'      ===>十分钟后关机!并且会显示在目前登陆者的屏幕前方

时间参数请务必加入命令中,否则shutdown会自动跳到 run-level 1 (就是单人维护的登陆情况)

[root@www ~]# shutdown -h now 

立刻关机,其中 now 相当于时间为 0 的状态 

[root@www ~]# shutdown -h 20:25 

系统在今天的 20:25 分会关机,若在21:25才下达此命令,则隔天才关机 

[root@www ~]# shutdown -h +10 

系统再过十分钟后自动关机 

[root@www ~]# shutdown -r now 

系统立刻重新启动 

[root@www ~]# shutdown -r +30 'The system will reboot'  

再过三十分钟系统会重新启动,并显示后面的信息给所有在在线的使用者 

[root@www ~]# shutdown -k now 'This system will reboot'  

仅发出警告信件的参数!系统并不会关机啦!吓唬人!


sync; sync; sync; reboot 


poweroff -f


切换运行等级: init

  • run level 0:关机

  • run level 3:纯文本模式

  • run level 5:含有图形接口模式

  • run level 6:重新启动

init 0 

##############################################################################################################################################

  • # :符合取代文字的『最短的』那一个;

  • ##:符合取代文字的『最长的』那一个

范例一:先让小写的 path 自定义变量配置的与 PATH 内容相同
[root@www ~]# path=${PATH}
[root@www ~]# echo $path
/usr/kerberos/sbin:/usr/kerberos/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:
/usr/sbin:/usr/bin:/root/bin  <==这两行其实是同一行啦!
范例二:假设我不喜欢 kerberos,所以要将前两个目录删除掉,如何显示?
[root@www ~]# echo ${path#/*kerberos/bin:}
/usr/local/sbin:/usr/local/bin:/sbin:/bin:
/usr/sbin:/usr/bin:/root/bin
范例三:我想要删除前面所有的目录,仅保留最后一个目录
[root@www ~]# echo ${path#/*:}
/usr/kerberos/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin
[root@www ~]# echo ${path##/*:}
/root/bin
范例四:我想要删除最后面那个目录,亦即从 : 到 bin 为止的字符串
[root@www ~]# echo ${path%:*bin}
/usr/kerberos/sbin:/usr/kerberos/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin 

范例五:那如果我只想要保留第一个目录呢?
[root@www ~]# echo ${path%%:*bin}
/usr/kerberos/sbin  <==这两行其实是同一行啦!
范例六:将 path 的变量内容内的 sbin 取代成大写 SBIN:
[root@www ~]# echo ${path/sbin/SBIN}
/usr/kerberos/:/usr/kerberos/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin
# 后面的是新字符串,所以结果就会出现如上述的特殊字体部分啰!
[root@www ~]# echo ${path//sbin/SBIN}
/usr/kerberos/:/usr/kerberos/bin:/usr/local/:/usr/local/bin:/:/bin:/usr/:/usr/bin:/root/bin
变量配置方式说明
${变量#关键词}
${变量##关键词}
若变量内容从头开始的数据符合『关键词』,则将符合的最短数据删除
若变量内容从头开始的数据符合『关键词』,则将符合的最长数据删除
${变量%关键词}
${变量%%关键词}
若变量内容从尾向前的数据符合『关键词』,则将符合的最短数据删除
若变量内容从尾向前的数据符合『关键词』,则将符合的最长数据删除
${变量/旧字符串/新字符串}
${变量//旧字符串/新字符串}
若变量内容符合『旧字符串』则『第一个旧字符串会被新字符串取代』
若变量内容符合『旧字符串』则『全部的旧字符串会被新字符串取代』

变量的测试与内容替换

范例一:测试一下是否存在 username 这个变量,若不存在则给予 username 内容为 root
[root@www ~]# echo $username
           <==由于出现空白,所以 username 可能不存在,也可能是空字符串
[root@www ~]# username=${username-root}
[root@www ~]# echo $username
root       <==因为 username 没有配置,所以主动给予名为 root 的内容。
[root@www ~]# username="vbird tsai" <==主动配置 username 的内容
[root@www ~]# username=${username-root}
[root@www ~]# echo $username
vbird tsai
范例二:若 username 未配置或为空字符串,则将 username 内容配置为 root
[root@www ~]# username=""
[root@www ~]# username=${username-root}
[root@www ~]# echo $username
      <==因为 username 被配置为空字符串了!所以当然还是保留为空字符串!
[root@www ~]# username=${username:-root}
[root@www ~]# echo $username
root  <==加上『 : 』后若变量内容为空或者是未配置,都能够以后面的内容替换!
变量配置方式str 没有配置str 为空字符串str 已配置非为空字符串
var=${str-expr}var=exprvar=var=$str
var=${str:-expr}var=exprvar=exprvar=$str
var=${str+expr}var=var=exprvar=expr
var=${str:+expr}var=var=var=expr
var=${str=expr}str=expr
var=expr
str 不变
var=
str 不变
var=$str
var=${str:=expr}str=expr
var=expr
str=expr
var=expr
str 不变
var=$str
var=${str?expr}expr 输出至 stderrvar=var=$str
var=${str:?expr}expr 输出至 stderrexpr 输出至 stderrvar=$str
测试:先假设 str 不存在 (用 unset) ,然后测试一下减号 (-) 的用法:
[root@www ~]# unset str; var=${str-newvar}
[root@www ~]# echo var="$var", str="$str"
var=newvar, str=        <==因为 str 不存在,所以 var 为 newvar


测试:若 str 已存在,测试一下 var 会变怎样?:
[root@www ~]# str="oldvar"; var=${str-newvar}
[root@www ~]# echo var="$var", str="$str"
var=oldvar, str=oldvar  <==因为 str 存在,所以 var 等于 str 的内容


测试:先假设 str 不存在 (用 unset) ,然后测试一下等号 (=) 的用法:
[root@www ~]# unset str; var=${str=newvar}
[root@www ~]# echo var="$var", str="$str"
var=newvar, str=newvar  <==因为 str 不存在,所以 var/str 均为 newvar


测试:如果 str 已存在了,测试一下 var 会变怎样?
[root@www ~]# str="oldvar"; var=${str=newvar}
[root@www ~]# echo var="$var", str="$str"
var=oldvar, str=oldvar  <==因为 str 存在,所以 var 等于 str 的内容


测试:若 str 不存在时,则 var 的测试结果直接显示 "无此变量"
[root@www ~]# unset str; var=${str?无此变量}
-bash: str: 无此变量    <==因为 str 不存在,所以输出错误信息 


测试:若 str 存在时,则 var 的内容会与 str 相同!
[root@www ~]# str="oldvar"; var=${str?novar}
[root@www ~]# echo var="$var", str="$str"
var=oldvar, str=oldvar  <==因为 str 存在,所以 var 等于 str 的内容


##############################################################################################################################################

别名

alias lm='ls -al | more'

unalias lm

alias cls='clear'
alias dir='ls -l'

##############################################################################################################################################