shell变量,管道符,作业控制,shell变量,以及变量配置文件
管道符|:管道符是将前面的文件的输出的内容传递给后面的命令
# ls |wc -l
21
查看当前目录下有多少文件
# cat 1.txt |wc -l
1
查看1.txt的行数
以上的两个例子就是管道符的简单用法。
管道符常营命令
cut:截取字符串,比如我们要以“:”作为分隔符,取第一列,
# cat /etc/passwd |head -5|cut -d ":" -f1
root
bin
daemon
adm
lp
这里-d是指定分割符,-f后面接数字,是指截取范围,上面的例子是截取第一段,就输入-f1,如果想
截取两段,就用“,”分开,后面再接一个数字。如f1,2。
如果是1-3段,后面就接1-3.
指定第几个字符 -c
# cat /etc/passwd |head -2|cut -c4
t
:
sort:排序,比如我们现在得到一列数字,或者是一列字符串,我们要由小到大做一个排序
# sort /etc/passwd |head -1
adm:x:3:4:adm:/var/adm:/sbin/nologin
我们可以看到,sotr的排序是遵循英文字母的排序。这就是sort的作用。
sort -n会以数字大小去排序
# sort -n 1.txt
<
{
}
root:x:0:0:root:/root:/bin/bash
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
sync:x:5:0:sync:/sbin:/bin/sync
22223333
22222222222aaaaaaa
*我们需要注意的是,如果我们输入-n,那么文件里面的特殊符号和字符会被认为是0。所以特殊符号和字母会排在前面。
sotr-r反向排序,与-n正好相反
# sort -r 1.txt
sync:x:5:0:sync:/sbin:/bin/sync
1111111111133333333333
}
wc -l 统计行数
# cat 1.txt | wc -l
20
wc -m 统计字符数
# cat 1.txt | wc -m
499
wc -w 统计词数,他是根据空格或者空白字符去分割的
# cat 1.txt | wc -w
20
uniq去重复,他一般和sort在一起用,先排序,然后去重(最常用)
# cat 2.txt
123
abc 1111,222
123
abc
1
1
2
然后我们排序,去重
# sort 2.txt |uniq
1
123
2
abc
abc 1111,222
uniq -c统计重复次数
# sort 2.txt |uniq -c
2 1
2 123
1 2
1 abc
1 abc 1111,222
tee:类似于>输出重定向。>输出重定向仅仅是将内容写入到目标文件,对我们看不到任何的内容,成功与否。这时候我们就使用tee取代">"。它不仅可以将内容重定向到目标文件,也可以将内容打印到屏幕上。
# sort 2.txt |uniq -c|tee a.txt
2 1
2 123
1 2
1 abc
1 abc 1111,222
这样我们就可以看到输出的内容了
tee -a追加,和>> 作用类似。但是在追加的同时将内容打印在屏幕上
# sort 2.txt |uniq -c|tee -a a.txt
2 1
2 123
1 2
1 abc
1 abc 1111,222
# cat a.txt
2 1
2 123
1 2
1 abc
1 abc 1111,222
2 1
2 123
1 2
1 abc
tr:替换字符,它支持写多个字符
# echo "aminglinux" |tr '' ''
AmingLinux
# echo "aminglinux" |tr 'a' 'A'
Aminglinux
全部替换成大写
# echo "aminglinux" |tr '' ''
AMINGLINUX
split:切割,将大文件切割成小文件。他有两种用法,一种是 -b大小默认单位是字节 ,一种是 -l行数。(系统默认是以x开头)
# split -b 1000 a.txt
# ls
a.txtxaexajxaoxatxayxbdxbixbnxbsxbxxccxchxcmxcrxcwxdbxdgxdlxdqxdvxeaxefxekxepxeuxezxfexfj
xaa xafxakxapxauxazxbexbjxboxbtxbyxcdxcixcnxcsxcxxdcxdhxdmxdrxdwxebxegxelxeqxevxfaxffxfk
xab xagxalxaqxavxbaxbfxbkxbpxbuxbzxcexcjxcoxctxcyxddxdixdnxdsxdxxecxehxemxerxewxfbxfgxfl
xac xahxamxarxawxbbxbgxblxbqxbvxcaxcfxckxcpxcuxczxdexdjxdoxdtxdyxedxeixenxesxexxfcxfhxfm
xad xaixanxasxaxxbcxbhxbmxbrxbwxcbxcgxclxcqxcvxdaxdfxdkxdpxduxdzxeexejxeoxetxeyxfdxfi
这就将a.txt按1000b切割完成了。
我们也可以切割完后给他命名,不用系统给我们的名字,但是我们只能自定义它的前缀。
s# split -b 100k a.txt abc
# ls
abcaaabcaba.txtxaaxab
split -l按行切割,比如我们都按照1000行切割
# split -l 1000 a.txt
# wc -l *
1000 xaa
1000 xab
1000 xac
这样每个文件都是1000行。
后面接目标文件,就可以直接清空里面的内容。
# > a.txt
# cat a.txt
注释符
#:在#号后面输入的shell都不回生效,它的作用是解释说明。
$:变量前缀,!$组合,这则里面表示行位
;多条命名写到一行,用分号分割
# ls 1.txt; wc -l 2.txt
1.txt
7 2.txt
~:用户的家目录,在正则表达式里表示匹配符
&:命令放到后台去
:输出重定向,会把目标的内容全部替换
>:追加重定向,会将内容追加到目标内容的结尾处
2>:错误输出重定向,和输出重定向作用一样
2>>:最佳错误重定向,和追加重定向作用一样。
&>:直接把正确和错误直接输入到目标文件中
【】:指定字符中的一个,经常用于替换,比如【0-9】,【a-zA-Z】,【abc】。
||:在shell代表或者,它用在两条命令中间。如果第一条命令执行成功,它就不会执行第二条命令,如果执行不成功,它就会执行第二条命令。
# ls 1a.txt|| wc -l 2.txt
ls: 无法访问1a.txt: 没有那个文件或目录
7 2.txt
第一条命令没有成功,它就执行了第二条
# ls 1.txt|| wc -l 2.txt
1.txt
第一条命令成功了,它就不执行第二条。
&&:让两个命令连续执行,只有前面命令执行成功,后面命令才继续执行。
# ls 1.txt&& wc -l 2.txt
1.txt
7 2.txt
只有前一个命令执行成功,后一个才会执行
# ls 1a.txt&& wc -l 2.txt
ls: 无法访问1a.txt: 没有那个文件或目录
如果前一个命令不成功,那么后一条命名就不会执行。
我们可以将||和&&理解成一个判断,||只有前面的命令不成功的时候才执行后面的命令,&&只有前面命令成功的时候才会执行后面的命令。
作业控制
当我们在编辑一个文件,突然间我们要暂停一下去做其他事,这时我么只要按Ctrl+z将现有的工作扔到后台去,然后我们再做我们需要的事情
# vim 1.txt
然后按Ctrl+z
+已停止 vim 1.txt
这样编辑1.txt的工作就放到后台了。
如果我们还要继续编辑1.txt,就输入fg,这样就把放在后台的任务重新放回前面了
如果我们同时扔到后台两个命令,这时我们可以用jobs将后台的任任务打印出来
# jobs
-已停止 vim 1.txt
+已停止 vim 2.txt
然后我们想要调回其中一个任务,只要输入命令fg+任务ID号就可以,比如我们想调回2.txt的编辑任务,就要输入fg 2就可以了。
我们也可以将命令放到后台去运行。输入命令bg 2
# bg 2
+ vim 2.txt &(这相当于后台运行)
再比如
# sleep 100
^Z
+已停止 sleep 100
# bg 2
+ sleep 100 &
# jobs
+已停止 sleep 180
-运行中 sleep 100 &
除此之外,我们还可以将命令一次性的放到后台去,就是在命令后面加上“&”
# sleep 100 &
1223
# jobs
+运行中 sleep 100 &
这样的话后可以将一条命令放到后台去进行,但是在另一个终端我们是看不到我们本终端的任务的,但是能查看进程。
变量
centos系统内变量包括PATH,HOME,PWD,LOGNAME等等,那么这些变量是在哪里规定的呢?我们可以通过命令env来获取这些系统变量。
env是查看系统常用的环境变量的,除了env,还有set,这个命令不仅可以查看系统内的环境变量,也可以查看用户自定义的环境改变量。
# env | head -5
XDG_SESSION_ID=1
HOSTNAME=localhost.localdomain
SELINUX_ROLE_REQUESTED=
TERM=linux
SHELL=/bin/bash
等号的左边是变量的名字,右边是值。系统的变量通常都是大写的英文字母,但是变量的值就不一定是字母了,有时会是字母,有时会是数字。
我们也可以自定义变量,比如
# a=111
# echo $a
111
这是我们自定义的变量,而不是我们系统自带的变量,这个变量就可以用set命令查到
# set | grep 111
a=111
变量名的规则:首先系统的环境变量是系统内置的,我们没有权利干涉他,但我们可以修改配置文件。我们也可以自定义变量,首先我们先给变量定一个名字,变量的名字是由字母、数字、下划线组成,但首位不能是数字。
# a1=2
# echo $a1
2
# a=4
# echo $a
4
# _a1=5
# echo $_a1
5
# 1a=5
-bash: 1a=5: 未找到命令
由此可以看出,变量的首位除了数字,都可以执行。
变量的值有特殊符号时需要用单引号括起来,比如我们要执行变量a=a b c
# a=a b c
-bash: b: 未找到命令
由于后边的值中有空格的存在,所以变量没哟形成,他只会认为a=a,而后边的b,c他会理解为是一个命令,会报错。所以我们要用‘’括起来,这里建议用单引号,这样可以脱意
# a='a b c'
# echo $a
a b c
如果用双引号“”的话会出现特殊符号不识别的情况
# a="a$bc"
# echo $a
a
所以,有特殊符号的时候要用单引号‘’
# a='a$bc'
# echo $a
a$bc
变量的累加
我们的变量是可以累加输出的,比如
# a=1
# b=2
# echo $a$b
12
这样就可以将两个变量同时输出
# a='a$bc'
# echo $a
a$bc
加单引号脱意
# c="a$b"c
# echo $c
a2c
这里面直接把$b看成了一个赋值的变量,因为前面已经是b=2,c=a所以这里的输出就是a2c。如果我们的变量比较复杂,那么我们最好用单引号。
全局变量
我们先做一个实验,先定义aming=linux
# aming=linux
# echo $aming
linux
然后我们打开另一个回话或者进入另一个bash
# bash
# echo $aming
#
这时我们发现刚才定义的aming并没有得出自定义结果的值的,我们把这样的定义变量叫做非全局变量,也可以叫做本地变量,他只在当前终端下生效。
那我们怎样将它变成一个全局变量呢?用命令export
# export aming=linux
# echo $aming
linux
# bash
# echo $aming
linux
这样就变成了全局变量。而且这种全局变量只能是从上向下,而不能从下向上,也不能在另一个终端上生效。
取消变量unset
# unset aming
# echo $aming
这样就取消了自定义变量。
export的语法:export 变量名=变量值,全局变量也只在子shell下生效,输入bash就进入一个bash。
环境变量的配置文件
环境变量文件分为两个维度,一个维度是系统层次(etc下的),另一个维度是用户层次(家目录下的 ~/.)。系统层次有/etc/porfile,/etc/bashrc,这两个文件我们最好不要去编辑它。
用户层次包括~/.bashrc,~/.bash_profile。我们可以编辑用户家目录下的这两个文件。~/.bash_profile会调用~/.bashrc,而~/.bashrc会调用~/.bashrc。
profile和bashrc这两种文件的区别在于,profile是在用户登录的时候它就会自动的加载Profile,而profile会自定的调用bashrc。而bashrc是执行shell脚本的时候,用户不用登陆就可以执行脚本,而执行脚本就要调用bashrc里面的一些配置。
~/.bash_history。
~/.bash_logout用来定义用户退出的时候需要做的一些操作
页:
[1]