Bash Shell使用环境

Bash Shell使用环境

1.登录讯息显示数据:/etc/issue,/etc/motd

我们在终端机接口(tty1~tty6)登入的时候,会有几行提示的字符串,那个字符串就写在/etc/issue里面。

issue内的各代码意义
\d 本地端时间的日期;
\l 显示第几个终端机接口;
\m 显示硬件的等级(i386/i486/i586/i686…);
\n 显示主机的网络名称;
\o 显示domain name;
\r 操作系统的版本(相当于uname -r);
\t 显示本地端时间的时间;
\s 操作系统的名称;
\v 操作系统的版本。

所以,如果想要显示终端机的号码,就可以加上\l在/etc/issue档案内,就能够修改登入字符。而/etc/issue.net是提供给telnet这个远程登入程序用的。当我们使用telnet连结到主机时,主机的登入画面就会显示/etc/issue.net。

至于如果想要让使用者登入后取得一些讯息,那么可以将讯息加入/etc/motd中去。

2.环境设定档:bashrc,~/.bashrc,~/.profile,profile…,/etc/inputrc,source

关于取得bash的环境变量等数据,其实可以有系统规划与个人喜好,一般来说,建议使用者直接修改个人设定值即可,不需要更动到系统。

系统设定值

所谓系统设定值,也就是说每个使用者进入到bash shell之后,会先读取的设定档案。预设的设定档案有:

1./etc/sysconfig/i18n

2./etc/profile

3./etc/bashrc

4./etc/profile.d/*.sh

5./etc/man.config

个人设定值

1.~/.bash_profile,~/.bash_login,~/.profile

2.~/.bashrc

3.~/.bash_history

4.~/.bash_logout

3.终端机的环境设定:stty,set

[root@linux ~]# stty [-a]
参数:
-a
:将目前所有的 stty 参数列出来;
范例:
范例一:列出所有的按键与按键内容
[root@linux ~]# stty -a
speed 38400 baud; rows 40; columns 80; line = 0;
intr = ^C; quit = ^\; erase = ^?; kill = ^U; eof = ^D; eol = ;
eol2 = ; start = ^Q; stop = ^S; susp = ^Z; rprnt = ^R; werase
= ^W; lnext = ^V; flush = ^O; min = 1; time = 0;
-parenb -parodd cs8 -hupcl -cstopb cread -clocal -crtscts
-ignbrk -brkint -ignpar -parmrk -inpck -istrip -inlcr -igncr icrnl
ixon -ixoff -iuclc -ixany -imaxbel opost -olcuc -ocrnl onlcr -onocr
-onlret -ofill -ofdel nl0 cr0 tab0 bs0 vt0 ff0 isig icanon iexten
echo echoe echok -echonl -noflsh -xcase -tostop -echoprt echoctl echoke

•eof : End of file 的意思,代表『结束输入』。

• erase : 向后删除字符,

• intr : 送出一个 interrupt (中断) 的讯号给目前正在 run 的程序;

• kill : 删除在目前指令列上的所有文字;

• quit : 送出一个 quit 的讯号给目前正在 run 的程序;

• start : 在某个程序停止后,重新启动他的 output

• stop : 停止目前屏幕的输出;

• susp : 送出一个 terminal stop 的讯号给正在 run 的程序。

[root@linux ~]# stty erase ^h

那么从此之后,你的删除字符就得要使用 [ctrl]+h ,按下 [backspace] 则会出现 ^? 字样,如果想要回复利用 [backspace] ,就下达 stty erase ^? 即可啊! 至于更多的 stty 说明,记得参考一下 man stty 的内容。

除了 stty 之外,其实我们的 bash 还有自己的一些终端机设定值。那就是利用 set 来设定的,它可以帮我们设定整个指令输出/输入的环境, 例如记录历史命令、显示错误内容等等。

[root@linux ~]# set [-uvCHhmBx]
参数:
-u :预设不启用。若启用后,当使用未设定变量时,会显示错误讯息;
-v :预设不启用。若启用后,在讯息被输出前,会先显示讯息的原始内容;
-x :预设不启用。若启用后,在指令被执行前,会显示指令内容(前面有 ++ 符号)
-h :预设启用。与历史命令有关;
-H :预设启用。与历史命令有关;
-m :预设启用。与工作管理有关;
-B :预设启用。与括号 [] 的作用有关;
-C :预设不启用。若使用 >等,则若档案存在时,该档案不会被覆盖。
范例:
范例一:显示目前所有的 set 设定值
[root@linux ~]# echo $-
himBH
# 那个 $- 变量内容就是 set 的所有设定! bash 预设是 himBH !
范例二:设定 "若使用未定义变量时,则显示错误讯息"
[root@linux ~]# set -u
[root@linux ~]# echo $vbirding
-bash: vbirding: unbound variable
# 预设情况下,未设定/未宣告 的变量都会是『空的』,不过,若设定 -u 参数,
# 那么当使用未设定的变量时,就会有问题啦!很多的 shell 都预设启用 -u 参数。
# 若要取消这个参数,输入 set +u 即可!
范例三:执行前,显示该指令内容。
[root@linux ~]# set -x
[root@linux ~]# echo $HOME
+ echo /root
/root
++ echo -ne '\033]0;root@linux:~\007'
# 要输出的指令都会先被打印到屏幕上喔!前面会多出 + 的符号!

另外,其实我们还有其它的按键设定功能!就是在 /etc/inputrc 这个档案里面设定。

[root@linux ~]# cat /etc/inputrc
# do not bell on tab-completion
#set bell-style none
set meta-flag on
set input-meta on
set convert-meta off
set output-meta on
.....以下省略.....

还有例如 /etc/DIR_COLORS* 与 /etc/termcap 等,也都是与终端机有关的环境设定档案。

4.万用字符与特殊符号:

符号 内容
* 万用字符,代表 0 个或多个字符(或数字)
? 万用字符,代表『一定有』一个字母
# 批注,这个最常被使用在 script 当中,视为说明!
跳脱符号,将『特殊字符或万用字符』还原成一般字符
分隔两个管线命令的界定;
; 连续性命令的界定(注意!与管线命令并不相同)
~ 使用者的家目录
$ 亦即是变量之前需要加的变量取代值
& 将指令变成背景下工作
! 逻辑运算意义上的『非』 not 的意思
/ 路径分隔的符号
, >> 输出导向,分别是『取代』与『累加』
单引号,不具有变量置换的功能
具有变量置换的功能
两个『 ` 』中间为可以先执行的指令
( ) 在中间为子 shell 的起始与结束
[ ] 在中间为字符的组合
{ } 在中间为命令区块的组合
组合按键 执行结果
Ctrl + C 终止目前的命令
Ctrl + D 输入结束(EOF),例如邮件结束的时候;
Ctrl + M 就是 Enter 啦!
Ctrl + S 暂停屏幕的输出
Ctrl + Q 恢复屏幕的输出
Ctrl + U 在提示字符下,将整列命令删除
Ctrl + Z 『暂停』目前的命令

5.数据流重导向

数据流重导向 (redirect) 就是将『数据给他传导到其它地方去』,即将某个指令执行后应该要出现在屏幕上的数据, 给他传输到其它的地方,例如档案或者是装置 (例如打印机之类的!)。

当我们执行一个指令的时候,这个指令可能会由档案读入资料,经过处理之后,再将数据输出到屏幕上。standard output(标准输出)与standard error(标准错误输出)这两个预设都是输出到屏幕上面来的。

在这样的过程中,我们可以将standard error(简称stderr)与standard output(简称stdout)给传送到其他不同地方 ,而不是屏幕上头!传送目标处,通常是档案或者装置。而传送的指令则是:

  1. 标准输入(stdin) :代码为 0 ,使用 < 或 << ;
  2. 标准输出(stdout):代码为 1 ,使用 > 或 >> ;
  3. 标准错误输出(stderr):代码为 2 ,使用 2> 或 2>> ;

    如果说我想将ls -l /这个指令的输出结果储存下来:
[root@linux ~]# ls -l / > ~/rootfile
# 本来 ls -l / 会将根目录的数据列出到屏幕上;
# 现在我使用了 > ~/rootfile 后,则本来应该在屏幕上出现的数据
# 就会被『重新导向』到 ~/rootfile 档案内了!就可以将该数据储存!

那么如果我再次下达:ls -l /home > ~/rootfile后,那么那个 ~/rootfile 档案的内容变成仅有 ls -l /home 的数据而已!原本的 ls -l / 数据就不见了,因为该档案的建立方式是:

  1. 该档案 (本例中是 ~/rootfile) 若不存在,系统会自动的将他建立起来,但是,
  2. 当这个档案存在的时候,那么系统就会先将这个档案内容清空,然后再将数据写入!
  3. 也就是若以 > 输出到一个既存盘案中,那个档案就会被覆盖掉!

    那如果我想要将数据累加,不想要将旧的数据删除,那就利用 >> 就好啦!例如上面的例子中,就变成ls -l / >> ~/rootfile 如此一来,当 ~/rootfile 不存在时,系统会主动建立这个档案,若该档案已存在, 则数据会在该档案的最下方累加进去!

    如果想要将正确的与错误的数据分别存入不同的档案中需要怎么做?其实在数据的重导向方面,正确的写法应该是『 1> 』与『 2> 』才对!但是如果只有 > 则预设是以 1> 来进

    行数据的!那个 1> 是输出正确数据, 2> 则是错误数据输出项目。也就是说:

    • 1> :是将正确的数据输出到指定的地方去

    • 2> :是将错误的数据输出到指定的地方去
[dmtsai@linux ~]$ find /home -name testing
find: /home/test1: Permission denied <== Starndard error
find: /home/root: Permission denied <== Starndard error
find: /home/masda: Permission denied <== Starndard error
/home/dmtsai/testing <== Starndard output
[dmtsai@linux ~]$ find /home -name testing > list_right 2> list_error

如果我只要正确的数据,错误的信息我不要了呢?这个时候 /dev/null 这个垃圾桶就很重要了!/dev/null 是什么呢? 基本上,那就有点像是一个『黑洞』的垃圾桶功能!当你输入的任何东西导向到这个虚拟的垃圾桶装置时, 『他就会凭空消失不见了』!例如上面的例子中,我们可以这么做,来将错误的信息丢掉!

[dmtsai@linux ~]$ find /home -name testing > list_right 2> /dev/null

如果我要将数据都写到同一个档案中呢?

[dmtsai@linux ~]$ find /home -name testing > list 2> list <==错误写法
[dmtsai@linux ~]$ find /home -name testing > list 2>&1 <==正确写法

我是否可以使用其它档案来取代键盘输入呢?我可以先编辑 somefile ,然后再以下面的指令来将数据输出到 catfile 去

[root@linux ~]# cat > catfile < somefile

<<这个连续两个小于的符号代表『结束的输入字符』。举例来讲:『我要用 cat 直接将输入的讯息输出到 catfile 中, 且当输入 eof 时,该次输入就结束』:

[root@linux ~]# cat > catfile <<eof
> This is a test testing
> OK now stop
> eof<==结束

6.命令执行的判断依据: ; , &&, ||

[root@linux ~]# sync; sync; shutdown -h now

在指令与指令中间利用分号 (;) 来隔开,这样一来,分号前的指令执行完后, 就会立刻接着执行后面的指令了。

[root@linux ~]# ls /tmp && touch /tmp/testingagin

使用ls判断/tmp是否存在,如果存在以touch建立一个档案。

[root@linux ~]# ls /tmp  ||  touch /tmp/testingagin

那个 || 刚好完全跟 && 相反,当前一个指令有错误时,在 || 后面的指令才会被执行!

7.管线命令(pipe)

假设我们想要知道 /etc/ 底下有多少档案,那么可以利用 ls /etc 来查阅,不过, 因为 /etc 底下的档案太多,导致一口气就将屏幕塞满了,不知道前面输出的内容是什么?此时,我们可以透过 less 指令的协助,利用:

[root@linux ~]# ls -al /etc | less

如此一来,使用 ls 指令输出后的内容,就能够被 less 读取, 并且利用 less 的功能,我们就能够前后翻动相关的信息了!

管线命令『 | 』仅能处理经由前面一个指令传来的正确信息,也就是 standard output ( STDOUT ) 的信息,对于 stdandard error 并没有直接处理的能力,请记得。

在每个管线的前后部分都是『指令』呢!而后一个指令的输入乃是由前一个指令的输出而来的! 不过,要注意的是,在 Linux 的环境中,很多的讯息处理都是以『行』为单位,也就是以是否具有 [Enter] 标志(CR) 来作为一段处理的依据!

8.撷取命令: cut, grep

撷取命令就是将一段数据经过分析后,取出我们所想要的。 或者是,经由分析关键词,取得我们所想要的那一行。

•cut

cut 主要的用途在于将『同一行里面的数据进行分解!』

[root@linux ~]# cut -d'分隔字符' -f fields
[root@linux ~]# cut -c 字符区间
参数:
-d :后面接分隔字符。与 -f 一起使用;
-f :依据 -d 的分隔字符将一段讯息分割成为数段,用 -f 取出第几段的意思;
-c :以字符 (characters) 的单位取出固定字符区间;
范例:
范例一:将 PATH 变量取出,我要找出第五个路径。
[root@linux ~]# echo $PATH
/bin:/usr/bin:/sbin:/usr/sbin:/usr/local/bin:/usr/X11R6/bin:/usr/games:
[root@linux ~]# echo $PATH | cut -d ':' -f 5
# 如此一来,就会出现 /usr/local/bin 这个目录名称!
# 因为我们是以 : 作为分隔符,第五个就是 /usr/local/bin !
# 那么如果想要列出第 3 与第 5 呢?,就是这样:
[root@linux ~]# echo $PATH | cut -d ':' -f 3,5
范例二:将 export 输出的讯息,取得第 12 字符以后的所有字符串
[root@linux ~]# export
declare -x HISTSIZE="1000"
declare -x INPUTRC="/etc/inputrc"
declare -x KDEDIR="/usr"
declare -x LANG="zh_TW.big5"
......其它省略......
[root@linux ~]# export | cut -c 12-
HISTSIZE="1000"
INPUTRC="/etc/inputrc"
KDEDIR="/usr"
LANG="zh_TW.big5"
......其它省略......
# 用 -c 可以处理比较具有格式的输出数据!
# 我们还可以指定某个范围的值,例如第 12-20 的字符,就是 cut -c 12-20 等等!
范例三:用 last 将这个月登入者的信息中,仅留下使用者大名
[root@linux ~]# last
vbird tty1 192.168.1.28 Mon Aug 15 11:55 - 17:48 (05:53)
vbird tty1 192.168.1.28 Mon Aug 15 10:17 - 11:54 (01:37)
[root@linux ~]# last | cut -d ' ' -f 1
# 用 last 可以取得最近一个月登入主机的使用者信息,
# 而我们可以利用空格符的间隔,取出第一个信息,就是使用者账号啰!
# 但是因为 vbird tty1 之间空格有好几个,并非仅有一个,所以,如果要找出
# tty1 其实不能以 cut -d ' ' -f 1,2 !输出的结果会不是我们想要的。

•grep

grep 是分析一行讯息, 若当中有我们所需要的信息,就将该行拿出来

[root@linux ~]# grep [-acinv] '搜寻字符串' filename
参数:
-a :将 binary 档案以 text 档案的方式搜寻数据
-c :计算找到 '搜寻字符串' 的次数
-i :忽略大小写的不同,所以大小写视为相同
-n :顺便输出行号
-v :反向选择,亦即显示出没有 '搜寻字符串' 内容的那一行!
范例:
范例一:将 last 当中,有出现 root 的那一行就取出来;
[root@linux ~]# last | grep 'root'
范例二:与范例一相反,只要没有 root 的就取出!
[root@linux ~]# last | grep -v 'root'
范例三:在 last 的输出讯息中,只要有 root 就取出,并且仅取第一栏
[root@linux ~]# last | grep 'root' |cut -d ' ' -f1
# 在取出 root 之后,利用上个指令 cut 的处理,就能够仅取得第一栏啰!

9.排序命令: sort, wc, uniq

•sort

[root@linux ~]# sort [-fbMnrtuk] [file or stdin]
参数:
-f :忽略大小写的差异,例如 A 与 a 视为编码相同;
-b :忽略最前面的空格符部分;
-M :以月份的名字来排序,例如 JAN, DEC 等等的排序方法;
-n :使用『纯数字』进行排序(预设是以文字型态来排序的);
-r :反向排序;
-u :就是 uniq ,相同的数据中,仅出现一行代表;
-t :分隔符,预设是 tab 键;
-k :以那个区间 (field) 来进行排序的意思,
范例:
范例一:个人账号都记录在 /etc/passwd 下,请将账号进行排序。
[root@linux ~]# cat /etc/passwd | sort
adm:x:3:4:adm:/var/adm:/sbin/nologin
apache:x:48:48:Apache:/var/www:/sbin/nologin
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
# 由上面的数据看起来, sort 是预设『以第一个』数据来排序,
# 而且预设是以『文字』型态来排序的!所以由 a 开始排到最后!
范例二:/etc/passwd 内容是以 : 来分隔的,我想以第三栏来排序,该如何?
[root@linux ~]# cat /etc/passwd | sort -t ':' -k 3
root:x:0:0:root:/root:/bin/bash
iiimd:x:100:101:IIIMF server:/usr/lib/iiim:/sbin/nologin
uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
bin:x:1:1:bin:/bin:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
# 如果是以文字型态来排序的话,原本就会是这样,想要使用数字排序:
# cat /etc/passwd | sort -t ':' -k 3 -n
# 用 -n 来告知 sort 以数字来排序!
范例三:利用 last ,将输出的数据仅取账号,并加以排序
[root@linux ~]# last | cut -d ' ' -f1 | sort

•uniq

[root@linux ~]# uniq [-ic]
参数:
-i :忽略大小写字符的不同;
-c :进行计数
范例:
范例一:使用 last 将账号列出,仅取出账号栏,进行排序后仅取出一位;
[root@linux ~]# last | cut -d ' ' -f1 | sort | uniq
范例二:承上题,如果我还想要知道每个人的登入总次数呢?
[root@linux ~]# last | cut -d ' ' -f1 | sort | uniq -c

•wc

[root@linux ~]# wc [-lwm]
参数:
-l :仅列出行;
-w :仅列出多少字(英文单字);
-m :多少字符;
范例:
范例一:那个 /etc/man.config 里面到底有多少相关字、行、字符数?
[root@linux ~]# cat /etc/man.config | wc
138
709
4506
# 输出的三个数字中,分别代表: 『行、字数、字符数』
范例二:我知道使用 last 可以输出登入者,但是 last 最后两行并非账号内容,
那么请问,我该如何以一行指令串取得这个月份登入系统的总人次?
[root@linux ~]# last | grep [a-zA-Z] | grep -v 'wtmp' | wc -l
# 由于 last 会输出空白行与 wtmp 字样在最底下两行,因此,我利用
# grep 取出非空白行,以及去除 wtmp 那一行,在计算行数,就能够了解!

10.双向重导向: tee

[root@linux ~]# tee [-a] file
参数:
-a
:以累加 (append) 的方式,将数据加入 file 当中!
范例:
[root@linux ~]# last | tee last.list | cut -d " " -f1
# 这个范例可以让我们将 last 的输出存一份到 last.list 档案中;
[root@linux ~]# ls -l /home | tee ~/homefile | more
# 这个范例则是将 ls 的数据存一份到 ~/homefile ,同时屏幕也有输出讯息!
[root@linux ~]# ls -l / | tee -a ~/homefile | more
# 要注意: tee 后接的档案会被覆盖,所以,我们要加上 -a
# 这个参数才能将讯息累加。

11.字符转换命令: tr, col, join, paste, expand

•tr

[root@linux ~]# tr [-ds] SET1 ...
参数:
-d :删除讯息当中的 SET1 这个字符串;
-s :取代掉重复的字符!
范例:
范例一:将 last 输出的讯息中,所有的小写变成大写字符:
[root@linux ~]# last | tr '[a-z]' '[A-Z]'
范例二:将 /etc/passwd 输出的讯息中,将冒号 (:) 删除
[root@linux ~]# cat /etc/passwd | tr -d ':'
范例三:将 DOS 档案的断行字符 ^M 符号删除:
[root@linux ~]# cat /home/test/dostxt | tr -d '\r' > dostxt-noM
# 那个 /r 指的是 DOS 的断行字符,关于更多的字符,请参考 man tr

•col

[root@linux ~]# col [-x]
参数:
-x:将 tab 键转换成对等的空格键
范例:
[root@linux ~]# cat -A /etc/man.config
<==此时会看到很多 ^I 的符号,那就是 tab
[root@linux ~]# cat /etc/man.config | col -x | cat -A | more
# [tab] 按键会被取代成为空格键

•join

[root@linux ~]# join [-ti12] file1 file2
参数:
-t:join 预设以空格符分隔数据,并且比对『第一个字段』的数据,如果两个档案相同,则将两笔数据联成一行,且第一个字段放在第一个!
-i :忽略大小写的差异;
-1 :这个是数字的 1 ,代表『第一个档案要用那个字段来分析』的意思;
-2 :代表『第二个档案要用那个字段来分析』的意思。
范例:
范例一:用 root 的身份,将 /etc/passwd 与 /etc/shadow 相关数据整合成一栏
[root@linux ~]# join -t ':' /etc/passwd /etc/shadow
bin:x:1:1:bin:/bin:/sbin/nologin:*:12959:0:99999:7:::
daemon:x:2:2:daemon:/sbin:/sbin/nologin:*:12959:0:99999:7:::
adm:x:3:4:adm:/var/adm:/sbin/nologin:*:12959:0:99999:7:::
# 因为 /etc/shadow 的权限问题,所以这里必须是 root 才能动作!而 /etc/passwd
# 与 /etc/shadow 都是以 : 来分隔字段,所以必须要使用 -t ':' 规范字段分隔字符。
# 且,因为 /etc/shadow 与 /etc/passwd 刚好都是以第一个字段为账号名称,所以,
# 就可以将同一行的数据给他贴在一起了!
# 另外,再仔细看一下 /etc/shadow 的内容与 /etc/passwd 的内容,您会发现,
# 两者都以账号为开始,而上面的输出数据中您会发现特殊字体部分,那代表
# 第二个档案的内容。在第二个档案的内容部分,由于账号(第一个字段)与
# 第一的档案是相同的,所以当然就省略掉,因此就成为上面的输出。
范例二:我们知道 /etc/passwd 第四个字段是 GID ,那个 GID 记录在
/etc/group 当中的第三个字段,请问如何将两个档案整合?
[root@linux ~]# join -t ':' -1 4 /etc/passwd -2 3 /etc/group
0:root:x:0:root:/root:/bin/bash:root:x:
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
4:adm:x:3:adm:/var/adm:/sbin/nologin:adm:x:root,adm,daemon
# 这个例子就更明显了!原本的 /etc/passwd 的第一行内容应该是:
# root:x:0:0:root:/root:/bin/bash
# 至于 /etc/group 第一行内容应该是:
# root:x:0:
# 我将第一个档案的第四栏与第二个档案的第三栏取出,放置到输出的最前方,
# 然后将剩下的数据给他加在一起!就成了上面的输出啦!

•paste

[root@linux ~]# paste [-d] file1 file2
参数:
-d :后面可以接分隔字符。预设是以 [tab] 来分隔的!
- :如果 file 部分写成 - ,表示来自 standard input 的资料的意思。
范例:
范例一:将 /etc/passwd 与 /etc/shadow 同一行贴在一起
[root@linux ~]# paste /etc/passwd /etc/shadow
bin:x:1:1:bin:/bin:/sbin/nologin
bin:*:12959:0:99999:7:::
daemon:x:2:2:daemon:/sbin:/sbin/nologin daemon:*:12959:0:99999:7:::
adm:x:3:4:adm:/var/adm:/sbin/nologin
adm:*:12959:0:99999:7:::
# 注意喔!同一行中间是以 [tab] 按键隔开的!
范例二:先将 /etc/group 读出(用 cat),然后与范例一贴上一起!且仅取出前三行
[root@linux ~]# cat /etc/group|paste /etc/passwd /etc/shadow -|head -n 3

•expand

[root@linux ~]# expand [-t] file
参数:
-t:后面可以接数字。一般来说,一个 tab 按键可以用 8 个空格键取代。我们也可以自行定义一个 [tab] 按键代表多少个字符!
范例:
范例一:将 /etc/man.config 内行首为 MANPATH 的字样就取出;仅取前三行;
[root@linux ~]# grep '^MANPATH' /etc/man.config | head -n 3
MANPATH /usr/man
MANPATH /usr/share/man
MANPATH /usr/local/man
# 行首的代表标志为 ^
范例二:承上,如果我想要将所有的符号都列出来?(用 cat)
[root@linux ~]# grep '^MANPATH' /etc/man.config | head -n 3 |cat -A
MANPATH^I/usr/man$
MANPATH^I/usr/share/man$
MANPATH^I/usr/local/man$
# [tab] 按键可以被 cat -A 显示成为 ^I
范例三:承上,我将 [tab] 按键设定成 6 个字符的话?
[root@linux ~]# grep '^MANPATH' /etc/man.config | head -n 3 | \
>
expand -t 6 - | cat -A
MANPATH /usr/man$
MANPATH /usr/share/man$
MANPATH /usr/local/man$
123456123456123456.....
# 仔细看一下上面的数字说明,因为我是以 6 个字符来代表一个 [tab] 的长度,所以,
# MAN... 到 /usr 之间会隔 12 (两个 [tab]) 个字符喔!如果 tab 改成 9 的话,

12.分割命令: split

如果你有档案太大,导致一些携带式装置无法复制的问题找 split 就对了! 他可以帮你将一个大档案,依据档案大小或行数来分割,就可以将大档案分割成为小档案了!

[root@linux ~]# split [-bl] file PREFIX
参数:
-b :后面可接欲分割成的档案大小,可加单位,例如 b, k, m 等;
-l :以行数来进行分割。
范例:
范例一:我的 /etc/termcap 有七百多 K,若想要分成 300K 一个档案时?
[root@linux ~]# cd /tmp; split -b 300k /etc/termcap termcap
[root@linux tmp]# ls -l termcap*
-rw-rw-r-- 1 root root 307200 8 月 17 00:25 termcapaa
-rw-rw-r-- 1 root root 307200 8 月 17 00:25 termcapab
-rw-rw-r-- 1 root root 184848 8 月 17 00:25 termcapac
# 那个档名可以随意取的啦!我们只要写上前导文字,小档案就会以
# xxxaa, xxxab, xxxac 等方式来建立小档案的!
范例二:如何将上面的三个小档案合成一个档案,档名为 termcapback
[root@linux tmp]# cat termcap* >> termcapback
# 很简单吧?就用数据流重导向就好啦!简单!
范例三:使用 ls -al / 输出的信息中,每十行记录成一个档案
[root@linux tmp]# ls -al / | split -l 10 - lsroot
# 重点在那个 - 啦!一般来说,如果需要 stdout/stdin 时,但偏偏又没有档案,
# 有的只是 - 时,那么那个 - 就会被当成 stdin 或 stdout

13.参数代换: xargs

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

[root@linux ~]# xargs [-0epn] command
参数:
-0
:如果输入的 stdin 含有特殊字符,例如 `, \, 空格键等等字符时,这个 -0 参数
可以将他还原成一般字符。这个参数可以用于特殊状态!
-e
:这个是 EOF (end of file) 的意思。后面可以接一个字符串,当 xargs 分析到这个字符串时,就会停止继续工作!
-p :在执行每个指令的 argument 时,都会询问使用者的意思;
-n :后面接次数,每次 command 指令执行时,要使用几个参数的意思。看范例三。
当 xargs 后面没有接任何的指令时,预设是以 echo 来进行输出!
范例:
范例一:将 /etc/passwd 内的第一栏取出,仅取三行,使用 finger 这个指令将每个
账号内容秀出来
[root@linux ~]# cut -d':' -f1 < /etc/passwd |head -n 3| xargs finger
Login: root Name: root
Directory: /root Shell: /bin/bash
Never logged in.
No mail.
No Plan.
......底下省略.....
# 由 finger account 可以取得该账号的相关说明内容,例如上面的输出就是 finger root
# 后的结果。在这个例子当中,我们利用 cut 取出账号名称,用 head 取出三个账号,
# 最后则是由 xargs 将三个账号的名称变成 finger 后面需要的参数!
范例二:同上,但是每次执行 finger 时,都要询问使用者是否动作?
[root@linux ~]# cut -d':' -f1 < /etc/passwd |head -n 3| xargs -p finger
finger root bin daemon ?...y
......底下省略.....
# 呵呵!这个 -p 的参数有趣了吧?!他可以让使用者的使用过程中,被询问到每个
# 指令是否执行!
范例三:将所有的 /etc/passwd 内的账号都以 finger 查阅,但一次仅查阅五个账号
[root@linux ~]# cut -d':' -f1 < /etc/passwd | xargs -p -n 5 finger
finger root bin daemon adm lp ?...y
......底下省略.....
# 在这里鸟哥使用了 -p 这个参数来让您对于 -n 更有概念。一般来说,某些指令后面
# 可以接的 arguments 是有限制的,不能无限制的累加,此时,我们可以利用 -n
# 来帮助我们将参数分成数个部分,每个部分分别再以指令来执行!这样就 OK 啦!^_^
[root@linux ~]#
范例四:同上,但是当分析到 lp 就结束这串指令?
[root@linux ~]# cut -d':' -f1 < /etc/passwd | xargs -p -e'lp' finger
finger root bin daemon adm ?...
# 仔细与上面的案例做比较。也同时注意,那个 -e'lp' 是连在一起的,中间没有空格键。
# 上个例子当中,第五个参数是 lp 啊,那么我们下达 -e'lp' 后,则分析到 lp
# 这个字符串时,后面的其它 stdin 的内容就会被 xargs 舍弃掉了!

14.关于减号 - 的用途

[root@linux ~]# tar -cvf - /home | tar -xvf -

上面这个例子是说:『我将 /home 里面的档案给他打包,但打包的数据不是纪录到档案,而是传送到stdout; 经过管线后,将 tar -cvf - /home 传送给后面的 tar -xvf - 』。后面的这个 - 则是取用前一个指令的 stdout。

linux杂记(十一)Bash Shell的使用环境的更多相关文章

  1. 第十一章、认识与学习 BASH Bash Shell 的操作环境

    bash中的变量动不动就说环境变量,真是奇怪,bash只是一个c语言编写的程序而已,跟环境变量有什么关系?如果知道dos的历史的话就知道有个时代是只有命令行界面而没有图形用户界面,这只小小的程序就包揽 ...

  2. 鸟哥的私房菜:Bash shell(四)-Bash shell的使用环境

    Bash shell(四)-Bash shell的使用环境   是否记得我们登入主机的时候,屏幕上头会有一些说明文字,告知我们的 Linux 版本啊什么的, 还有,登入的时候,我们还可以给予使用者一些 ...

  3. linux文件管理之bash shell

    BASH Shell 对文件进行管理 ========================================================创建.复制.删除.移动.查看.编辑.压缩.查找 内 ...

  4. linux系统配置之bash shell的配置(centos)

    linux系统开机启动过程的最后阶段会由init进程根据启动方案(运行级:0-6)启动许多基本的服务程序,为用户提供各种各样的服务.在启动这些服务的最后会启动一个为用户提供操作环境的服务,用户就是通过 ...

  5. 【Linux】-- 认识bash shell

    一.前言 我们知道管理整个计算机硬件的其实是系统的内核,这个内核是需要被保护的,所以我们一般用户就只能通过shell来跟内核通信,以让内核达到我们所想要达到的工作.那么Linux系统有多少shell可 ...

  6. 在 Alpine Linux 中安装 bash shell

    如何在我的 Alpine Linux LXD(Linux容器)虚拟机(VM)中安装 bash shell? Alpine Linux 自带 BusyBox 工具.它被评为“嵌入式 Linux 的瑞士军 ...

  7. Linux基础之bash shell介绍及基本特性

    今天继续讲Linux基础知识,内容是关于bash shell的.分享以下bash shell的相关知识,例如基本特性等.  1.8)bash shell的介绍 1.8.1)什么是bash shell ...

  8. linux下的bash shell

    运行bash shell命令的方式 vi t1.sh 并输入 pwd ls pwd 然后:x保存关闭 1.首先查看权限 ls -l,如果没有执行权限则用chmod a+x t1.sh ,最后运行./t ...

  9. 常见linux命令释义(第八天)—— Bash Shell 的操作环境

    换了新公司,公司的领导很不错.自己感受比较多的地方是,自己的工作效率明显比以前高了.以前会对频繁变动的需求十分不耐烦,现在接到需求后会仔细的思考,进行整体构建.即使以后需求有变动,也能够比较轻易的在原 ...

随机推荐

  1. CodeForces 111B - Petya and Divisors 统计..想法题

    找每个数的约数(暴力就够了...1~x^0.5)....看这约数的倍数最后是哪个数...若距离大于了y..统计++...然后将这个约数的最后倍数赋值为当前位置...好叼的想法题.... Program ...

  2. C结构体中位域

    C结构体中位域的一点小知识,最近在看资料时遇到结构体中的一种特殊操作——位域,在下面的程序中我将根据自己的理解进行简单介绍.程序只是为了了解位域的一些性质,运行时有些编译器可能会报错. 程序代码如下( ...

  3. .NET程序员生活开始

    不知不觉,开始踏入程序员生活了!加油吧.有关Session的好文章: 最近这两天被一个Web Farm环境下的Session处理问题虐得很痛苦,网上到处找解决方案,在无意中翻看到这篇文章,感觉很不错, ...

  4. android入门——Service

    简单记录一下四大组件之一的Service的简单实用. 先是最简单的用法,服务的开关,onBind方法的使用 package com.example.wkp.service; import androi ...

  5. Tomcat7配置数据源(Oracle)

    修改../conf/content.xml <?xml version='1.0' encoding='utf-8'?> <!-- The contents of this file ...

  6. AssetBundle的使用

    using UnityEngine; using System.Collections; using UnityEditor; using System.IO; public class Editor ...

  7. 剑指offier第10题

    题目描述 输入一个整数,输出该数二进制表示中1的个数.其中负数用补码表. 二进制中1的个数   时间限制:1秒空间限制:32768K  

  8. Linux命令学习之shift命令

          位置参数可以用shift命令左移.比如shift 3表示原来的$4现在变成$1,原来的$5现在变成$2等等,原来的$1.$2.$3丢弃,$0不移动.不带参数的shift命令相当于shift ...

  9. Java提高学习之Object(4)

    哈希码 问: hashCode()方法是用来做什么的? 答: hashCode()方法返回给调用者此对象的哈希码(其值由一个hash函数计算得来).这个方法通常用在基于hash的集合类中,像java. ...

  10. retain、strong、weak、assign区别

    1. 假设你用malloc分配了一块内存,并且把它的地址赋值给了指针a,后来你希望指针b也共享这块内存,于是你又把a赋值给(assign)了b.此时a 和b指向同一块内存,请问当a不再需要这块内存,能 ...