linux杂记(十一)Bash Shell的使用环境
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)给传送到其他不同地方 ,而不是屏幕上头!传送目标处,通常是档案或者装置。而传送的指令则是:
- 标准输入(stdin) :代码为 0 ,使用 < 或 << ;
- 标准输出(stdout):代码为 1 ,使用 > 或 >> ;
- 标准错误输出(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 / 数据就不见了,因为该档案的建立方式是:
- 该档案 (本例中是
~/rootfile) 若不存在,系统会自动的将他建立起来,但是, - 当这个档案存在的时候,那么系统就会先将这个档案内容清空,然后再将数据写入!
- 也就是若以 > 输出到一个既存盘案中,那个档案就会被覆盖掉!
那如果我想要将数据累加,不想要将旧的数据删除,那就利用 >> 就好啦!例如上面的例子中,就变成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的使用环境的更多相关文章
- 第十一章、认识与学习 BASH Bash Shell 的操作环境
bash中的变量动不动就说环境变量,真是奇怪,bash只是一个c语言编写的程序而已,跟环境变量有什么关系?如果知道dos的历史的话就知道有个时代是只有命令行界面而没有图形用户界面,这只小小的程序就包揽 ...
- 鸟哥的私房菜:Bash shell(四)-Bash shell的使用环境
Bash shell(四)-Bash shell的使用环境 是否记得我们登入主机的时候,屏幕上头会有一些说明文字,告知我们的 Linux 版本啊什么的, 还有,登入的时候,我们还可以给予使用者一些 ...
- linux文件管理之bash shell
BASH Shell 对文件进行管理 ========================================================创建.复制.删除.移动.查看.编辑.压缩.查找 内 ...
- linux系统配置之bash shell的配置(centos)
linux系统开机启动过程的最后阶段会由init进程根据启动方案(运行级:0-6)启动许多基本的服务程序,为用户提供各种各样的服务.在启动这些服务的最后会启动一个为用户提供操作环境的服务,用户就是通过 ...
- 【Linux】-- 认识bash shell
一.前言 我们知道管理整个计算机硬件的其实是系统的内核,这个内核是需要被保护的,所以我们一般用户就只能通过shell来跟内核通信,以让内核达到我们所想要达到的工作.那么Linux系统有多少shell可 ...
- 在 Alpine Linux 中安装 bash shell
如何在我的 Alpine Linux LXD(Linux容器)虚拟机(VM)中安装 bash shell? Alpine Linux 自带 BusyBox 工具.它被评为“嵌入式 Linux 的瑞士军 ...
- Linux基础之bash shell介绍及基本特性
今天继续讲Linux基础知识,内容是关于bash shell的.分享以下bash shell的相关知识,例如基本特性等. 1.8)bash shell的介绍 1.8.1)什么是bash shell ...
- linux下的bash shell
运行bash shell命令的方式 vi t1.sh 并输入 pwd ls pwd 然后:x保存关闭 1.首先查看权限 ls -l,如果没有执行权限则用chmod a+x t1.sh ,最后运行./t ...
- 常见linux命令释义(第八天)—— Bash Shell 的操作环境
换了新公司,公司的领导很不错.自己感受比较多的地方是,自己的工作效率明显比以前高了.以前会对频繁变动的需求十分不耐烦,现在接到需求后会仔细的思考,进行整体构建.即使以后需求有变动,也能够比较轻易的在原 ...
随机推荐
- CodeForces 111B - Petya and Divisors 统计..想法题
找每个数的约数(暴力就够了...1~x^0.5)....看这约数的倍数最后是哪个数...若距离大于了y..统计++...然后将这个约数的最后倍数赋值为当前位置...好叼的想法题.... Program ...
- C结构体中位域
C结构体中位域的一点小知识,最近在看资料时遇到结构体中的一种特殊操作——位域,在下面的程序中我将根据自己的理解进行简单介绍.程序只是为了了解位域的一些性质,运行时有些编译器可能会报错. 程序代码如下( ...
- .NET程序员生活开始
不知不觉,开始踏入程序员生活了!加油吧.有关Session的好文章: 最近这两天被一个Web Farm环境下的Session处理问题虐得很痛苦,网上到处找解决方案,在无意中翻看到这篇文章,感觉很不错, ...
- android入门——Service
简单记录一下四大组件之一的Service的简单实用. 先是最简单的用法,服务的开关,onBind方法的使用 package com.example.wkp.service; import androi ...
- Tomcat7配置数据源(Oracle)
修改../conf/content.xml <?xml version='1.0' encoding='utf-8'?> <!-- The contents of this file ...
- AssetBundle的使用
using UnityEngine; using System.Collections; using UnityEditor; using System.IO; public class Editor ...
- 剑指offier第10题
题目描述 输入一个整数,输出该数二进制表示中1的个数.其中负数用补码表. 二进制中1的个数 时间限制:1秒空间限制:32768K
- Linux命令学习之shift命令
位置参数可以用shift命令左移.比如shift 3表示原来的$4现在变成$1,原来的$5现在变成$2等等,原来的$1.$2.$3丢弃,$0不移动.不带参数的shift命令相当于shift ...
- Java提高学习之Object(4)
哈希码 问: hashCode()方法是用来做什么的? 答: hashCode()方法返回给调用者此对象的哈希码(其值由一个hash函数计算得来).这个方法通常用在基于hash的集合类中,像java. ...
- retain、strong、weak、assign区别
1. 假设你用malloc分配了一块内存,并且把它的地址赋值给了指针a,后来你希望指针b也共享这块内存,于是你又把a赋值给(assign)了b.此时a 和b指向同一块内存,请问当a不再需要这块内存,能 ...