用公共账号采用自己的bashrc
if [[ $SUDO_USER == "daijiliang" ]];then
source /home/daijiliang/.bashrc
fi
查看时间戳对应的时间:
date -d @1482739648
用shell替换文件内容:
perl -pi -e 's|logging\.conf|logging\.conf\.local|g' /home/s/apps/CloudSearch/robotqa/etc/mod_robotqa.conf
使用stringstream的时候使用ss.str()输出而不是ss >> out后者有分隔符的话一次只输出一个
从管道中读取输入的方法,比如想把中间结果输出
cpu占用跟内存占用都不高但是系统卡的话可以看top里面的wa即io情况查看是否瓶颈
线上机器没开core的时候可以用dmesg观察是否有core
netstat
-a (all)显示所有选项,默认不显示LISTEN相关
-t (tcp)仅显示tcp相关选项
-u (udp)仅显示udp相关选项
-n 拒绝显示别名,能显示数字的全部转化成数字。
-l 仅列出有在 Listen (监听) 的服務状态
-p 显示建立相关链接的程序名
-r 显示路由信息,路由表
-e 显示扩展信息,例如uid等
-s 按各个协议进行统计
-c 每隔一个固定时间,执行该netstat命令。
提示:LISTEN和LISTENING的状态只有用-a或者-l才能看到
shell上: 0表示标准输入 1表示标准输出 2表示标准错误输出 > 默认为标准输出重定向,与 1> 相同 2>&1 意思是把 标准错误输出 重定向到 标准输出. &>file 意思是把 标准输出 和 标准错误输出 都重定向到文件file中 |
统计响应时间平均
tail -n 10000 access.qfedd.log | grep tm= | awk '{for (f=1; f <= NF; f+=1) {if ($f ~ /tm=/) {print NR,$f}}}' | awk -F '=' '{s += $2}END{print s/NR}'
统计响应时间中位数所在行
tail -n 10000 access.qfedd.log | grep tm= | awk '{for (f=1; f <= NF; f+=1) {if ($f ~ /tm=/) {print NR,$f}}}' | awk -F '=' '{print $2}' | sort -n | wc -l | awk '{print $1/2}'
tail -n 10000 access.qfedd.log | grep tm= | awk '{for (f=1; f <= NF; f+=1) {if ($f ~ /tm=/) {print NR,$f}}}' | awk -F '=' '{print $2}' | sort -n | awk 'NR == 2500 {print}'
其实在Linux中要正确匹配tab(退格)符有两种方式
1:用 grep $'\t' 你的文件
2:用 grep '按CTRL+V 键,再按TAB键' 你的文件
再回到上面的问题,则可以用以下的命令
cat delete.log |grep $'\t'11$'\t' |wc
或者
cat delete.log |grep ‘CTRL+V,TAB11CTRL+V,TAB’|wc
传输多用rsync,比scp好,一般格式
rsync -avP SRC DEST
不想保留原来的owner group和permission的话用
rsync -rltDvP SRC DEST
查看linux版本信息、系统版本信息等
lsb_release -a
cat /etc/redhat-release
uname -a
好的ps1色彩设置
语法
参数
-V
|
显示版本编号
|
-h
|
会显示版本编号及指令的使用方式说明
|
-l
|
显示出自己(执行 sudo 的使用者)的权限
|
-v
|
因为 sudo 在第一次执行时或是在 N 分钟内没有执行(N 预设为五)会问密码,这个参数是重新做一次确认,如果超过 N 分钟,也会问密码
|
-k
|
将会强迫使用者在下一次执行 sudo 时问密码(不论有没有超过 N 分钟)
|
-b
|
将要执行的指令放在背景执行
|
-p
|
prompt 可以更改问密码的提示语,其中 %u 会代换为使用者的帐号名称, %h 会显示主机名称
|
-u
|
username/#uid 不加此参数,代表要以 root 的身份执行指令,而加了此参数,可以以 username 的身份执行指令(#uid 为该 username 的使用者号码)
|
-s
|
执行环境变数中的 SHELL 所指定的 shell ,或是 /etc/passwd 里所指定的 shell
|
-H
|
将环境变数中的 HOME (家目录)指定为要变更身份的使用者家目录(如不加 -u 参数就是系统管理者 root )
|
command
|
要以系统管理者身份(或以 -u 更改为其他人)执行的指令
|
范例
想使用CP拷贝一个大目录(/home/study/test),但又不想拷贝其中的一个子目录(/home/study/test/test1),应该如何写命令行
方法:
1. cd /home/study/test
2. rsync -av --exclude test1/ --exlclude test2/ ../test/ /home/copydir
以上,便可将/home/study/test目录中,除test1和test2目录外,其他所有的文件和文件夹copy到/home/copydir
Linux du命令也是查看使用空间的,但是与df命令不同的是Linux du命令是对文件和目录磁盘使用的空间的查看,还是和df命令有一些区别的.
1.命令格式:
du [选项][文件]
2.命令功能:
显示每个文件和目录的磁盘使用空间。
3.命令参数:
-a或-all 显示目录中个别文件的大小。
-b或-bytes 显示目录或文件大小时,以byte为单位。
-c或--total 除了显示个别目录或文件的大小外,同时也显示所有目录或文件的总和。
-k或--kilobytes 以KB(1024bytes)为单位输出。
-m或--megabytes 以MB为单位输出。
-s或--summarize 仅显示总计,只列出最后加总的值。
-h或--human-readable 以K,M,G为单位,提高信息的可读性。
-x或--one-file-xystem 以一开始处理时的文件系统为准,若遇上其它不同的文件系统目录则略过。
-L<符号链接>或--dereference<符号链接> 显示选项中所指定符号链接的源文件大小。
-S或--separate-dirs 显示个别目录的大小时,并不含其子目录的大小。
-X<文件>或--exclude-from=<文件> 在<文件>指定目录或文件。
--exclude=<目录或文件> 略过指定的目录或文件。
-D或--dereference-args 显示指定符号链接的源文件大小。
-H或--si 与-h参数相同,但是K,M,G是以1000为换算单位。
-l或--count-links 重复计算硬件链接的文件。
查看ip对应的域名,是环境变量
采用hostname命令即可
1)
在Linux中,我们不免要频繁的修改文件,下载修改后再上传,很难提高效率。使用cat命令就可以在脚本里进行多行修改了。当然cat的使用方法还有很多,这里只是其中的一种使用方法。
cat >> /root/a.txt <<EOF
123456789
bbbbbbbb
FFFFFFFFFFFFFFFFFFFFFFF
EOF
以上的脚本命令是,在a.txt文件后面加上三行代码。
Cat 和EOF
cat命令是linux下的一个文本输出命令,通常是用于观看某个文件的内容的;
EOF是"end of file",表示文本结束符。
结合这两个标识,即可避免使用多行echo命令的方式,并实现多行输出的结果。
注意EOF只是标识,并不是固定不变的也可以用别的符号代替比如EEE等等。Cat << EOF ...EOF 最后一个EOF一定定格写,还有相关命令一定要定格写
2)
别名
前面也出现过alias的介绍,这个就是bash所特有的功能之一了。我们可以通过alias把一个常用的并且很长的指令别名一个简洁易记的指令。如果不想用了,还可以用unalias解除别名功能。直接敲alias会看到目前系统预设的alias :
看到了吧,系统预设的alias指令也就这几个而已,你也可以自定义你想要的指令别名。alias语法很简单,alias [命令别名]=[’具体的命令’]。
3)
作业控制。
当运行一个进程时,你可以使它暂停(按Ctrl+z),然后使用fg命令恢复它,利用bg命令使他到后台运行,你也可以使它终止(按Ctrl+c)。
【变量】
前面章节中笔者曾经介绍过环境变量PATH,这个环境变量就是shell预设的一个变量,通常shell预设的变量都是大写的。变量,说简单点就是使用一个较简单的字符串来替代某些具有特殊意义的设定以及数据。就拿PATH来讲,这个PATH就代替了所有常用命令的绝对路径的设定。因为有了PATH这个变量,所以我们运行某个命令时不再去输入全局路径,直接敲命令名即可。你可以使用echo命令显示变量的值。
除了PATH, HOME, LOGNAME外,系统预设的环境变量还有哪些呢?
使用env命令即可全部列出系统预设的全部系统变量了。不过登录的用户不一样这些环境变量的值也不一样。当前显示的就是root这个账户的环境变量了。下面笔者简单介绍一下常见的环境变量:
PATH决定了shell将到哪些目录中寻找命令或程序
HOME当前用户主目录
HISTSIZE历史记录数
LOGNAME当前用户的登录名
HOSTNAME指主机的名称
SHELL前用户Shell类型
LANG语言相关的环境变量,多语言可以修改此环境变量
MAIL当前用户的邮件存放目录
PWD当前目录
env命令显示的变量只是环境变量,系统预设的变量其实还有很多,你可以使用set命令把系统预设的全部变量都显示出来。
限于篇幅,笔者在上例中并没有把所有显示结果都截图。set不仅可以显示系统预设的变量,也可以连同用户自定义的变量显示出来。用户自定义变量?是的,用户自己同样可以定义变量。
虽然你可以自定义变量,但是该变量只能在当前shell中生效,不信你再登录一个shell试试?
使用bash命令即可再打开一个shell,此时先前设置的myname变量已经不存在了,退出当前shell回到原来的shell,myname变量还在。那要想设置的变量一直生效怎么办?有两种情况:
1) 要想系统内所有用户登录后都能使用该变量
需要在/etc/profile文件最末行加入 “export myname=Aming” 然后运行”source /etc/profile”就可以生效了。此时你再运行bash命令或者直接su - test账户看看。
2)只想让当前用户使用该变量
需要在用户主目录下的.bashrc文件最后一行加入“export myname=Aming” 然后运行”source .bashrc”就可以生效了。这时候再登录test账户,myname变量则不会生效了。上面用的source命令的作用是,讲目前设定的配置刷新,即不用注销再登录也能生效。
笔者在上例中使用”myname=Aming”来设置变量myname,那么在linux下设置自定义变量有哪些规则呢?
a. 设定变量的格式为”a=b”,其中a为变量名,b为变量的内容,等号两边不能有空格;
b. 变量名只能由英、数字以及下划线组成,而且不能以数字开头;
c. 当变量内容带有特殊字符(如空格)时,需要加上单引号;
有一种情况,需要你注意,就是变量内容中本身带有单引号,这就需要用到双引号了。
d. 如果变量内容中需要用到其他命令运行结果则可以使用反引号;
e. 变量内容可以累加其他变量的内容,需要加双引号;
在这里如果你不小心把双引号加错为单引号,将得不到你想要的结果
通过上面几个例子也许你能看得出,单引号和双引号的区别:用双引号时不会取消掉里面出现的特殊字符的本身作用(这里的$),而使用单引号则里面的特殊字符全部失去它本身的作用。
在前面的例子中笔者多次使用了bash命令,如果在当前shell中运行bash指令后,则会进入一个新的shell,这个shell就是原来shell的子shell了,不妨你用pstree指令来查看一下。
pstree这个指令会把linux系统中所有进程通过树形结构打印出来。限于篇幅笔者没有全部列出,你可以直接输入pstree查看即可。在父shell中设定一个变量后,进入子shell后该变量是不会生效的,如果想让这个变量在子shell中生效则要用到export指令,笔者曾经在前面用过。
export其实就是声明一下这个变量的意思,让该shell的子shell也知道变量abc的值是123.如果export后面不加任何变量名,则它会声明所有的变量。
在最后面连同我们自定义的变量都被声明了。
前面光讲如何设置变量,如果想取消某个变量怎么办?只要输入”unset 变量名”即可。
用unset abc后,再echo $abc则不再输出任何内容。
【系统环境变量与个人环境变量的配置文件】
上面讲了很多系统的变量,那么在linux系统中,这些变量被存到了哪里呢,为什么用户一登陆shell就自动有了这些变量呢?
/etc/profile :这个文件预设了几个重要的变量,例如PATH, USER, LOGNAME, MAIL, INPUTRC, HOSTNAME, HISTSIZE, umas等等。
/etc/bashrc :这个文件主要预设umask以及PS1。这个PS1就是我们在敲命令时,前面那串字符了,例如笔者的linux系统PS1就是 [root@localhost ~]# ,你不妨看一下PS1的值。
\u就是用户,\h 主机名, \W 则是当前目录,\$就是那个’#’了,如果是普通用户则显示为’$’
除了两个系统级别的配置文件外,每个用户的主目录下还有几个这样的隐藏文件:
.bash_profile :定义了用户的个人化路径与环境变量的文件名称。每个用户都可使用该文件输入专用于自己使用的shell信息,当用户登录时,该文件仅仅执行一次。
.bashrc :该文件包含专用于你的shell的bash信息,当登录时以及每次打开新的shell时,该该文件被读取。例如你可以将用户自定义的alias或者自定义变量写到这个文件中。
.bash_history :记录命令历史用的。
.bash_logout :当退出shell时,会执行该文件。可以把一些清理的工作放到这个文件中。
【linux shell中的特殊符号】
你在学习linux的过程中,也许你已经接触过某个特殊符号,例如”*”,它是一个通配符号,代表零个或多个字符或数字。下面笔者就说一说常用到的特殊字符。
1. * :代表零个或多个字符或数字。
test后面可以没有任何字符,也可以有多个字符,总之有或没有都能匹配出来。
2. ? :只代表一个任意的字符
不管是数字还是字母,只要是一个都能匹配出来。
3. # :这个符号在linux中表示注释说明的意思,即”#”后面的内容linux忽略掉。
在命令的开头或者中间插入”#” ,linux都会忽略掉的。这个符号在shell脚本中用的很多。
4. \ :脱意字符,将后面的特殊符号(例如”*” )还原为普通字符。
5. | :管道符,前面多次说过,它的作用在于将符号前面命令的结果丢给符号后面的命令。这里提到的后面的命令,并不是所有的命令都可以的,一般针对文档操作的命令比较常用,例如cat, less, head, tail, grep, cut, sort, wc, uniq, tee, tr, split, sed, awk等等,其中grep, sed, awk为正则表达式必须掌握的工具,在后续内容中详细介绍。
6. $ :除了用于变量前面的标识符外,还有一个妙用,就是和’!’结合起来使用。
‘!$’表示上条命中中最后一个变量(也许称为变量不合适,总之就是上条命令中最后出现的那个东西)例如上边命令最后是test.txt那么在当前命令下输入!$则代表test.txt。
1)grep :过滤一个或多个字符,将会在后续内容中详细介绍其用法。
2) cut :截取某一个字段
语法:cut -d “分隔字符” [-cf] n 这里的n是数字
-d :后面跟分隔字符,分隔字符要用双引号括起来
-c :后面接的是第几个字符
-f :后面接的是第几个区块
-d 后面跟分隔字符,这里使用冒号作为分割字符,-f 1 就是截取第一段,-f和1之间的空格可有可无。
-c 后面可以是1个数字n,也可以是一个区间n1-n2,还可以是多个数字n1,n2,n3
3) sort :用做排序
语法:sort [-t 分隔符] [-kn1,n2] [-nru] 这里的n1 < n2
-t 分隔符 :作用跟cut的-d一个意思
-n :使用纯数字排序
-r :反向排序
-u :去重复
-kn1,n2 :由n1区间排序到n2区间,可以只写-kn1,即对n1字段排序
4) wc :统计文档的行数、字符数、词数,常用的选项为:
-l :统计行数
-m :统计字符数
-w :统计词数
5) uniq :去重复的行,笔者常用的选项只有一个:
-c :统计重复的行数,并把行数写在前面
有一点需要注意,在进行uniq之前,需要先用sort排序然后才能uniq,否则你将得不到你想要的,笔者上面的试验当中已经是排序过所以省略掉那步了。
6)tee :后跟文件名,类似与重定向”>”,但是比重定向多了一个功能,在把文件写入后面所跟的文件中的同时,还显示在屏幕上。
7)tr :替换字符,常用来处理文档中出现的特殊符号,如DOS文档中出现的^M符号。常用的选项有两个:
-d :删除某个字符,-d 后面跟要删除的字符
-s :把重复的字符去掉
最常用的就是把小写变大写: tr ‘[a-z]’ ‘[A-Z]’
当然替换一个字符也是完全可以的。
不过替换、删除以及去重复都是针对一个字符来讲的,有一定局限性。如果是针对一个字符串就不再管用了,所以笔者建议只是简单了解这个tr即可,以后你还会学到更多可以实现针对字符串操作的工具。
8)split :切割文档,常用选项:
-b :依据大小来分割文档,单位为byte
格式如上例,后面的passwd为分割后文件名的前缀,分割后的文件名为passwdaa, passwdab, passwdac …
-l :依据行数来分割文档
6. ; :分号。平时我们都是在一行中敲一个命令,然后回车就运行了,那么想在一行中运行两个或两个以上的命令如何呢?则需要在命令之间加一个”;”了。
7. ~ :用户的家目录,如果是root则是 /root ,普通用户则是 /home/username
8. & :如果想把一条命令放到后台执行的话,则需要加上这个符号。通常用于命令运行时间非常长的情况。
使用jobs可以查看当前shell中后台执行的任务。用fg可以调到前台执行。这里的sleep命令就是休眠的意思,后面跟数字,单位为秒,常用语循环的shell脚本中。
此时你按一下CTRL +z 使之暂停,然后再输入bg可以再次进入后台执行。
如果是多任务情况下,想要把任务调到前台执行的话,fg后面跟任务号,任务号可以使用jobs命令得到。
9. >, >>, 2>, 2>> :前面讲过重定向符号> 以及>> 分别表示取代和追加的意思,然后还有两个符号就是这里的2> 和 2>> 分别表示错误重定向和错误追加重定向,当我们运行一个命令报错时,报错信息会输出到当前的屏幕,如果想重定向到一个文本里,则要用2>或者2>>。
10. [ ] :中括号,中间为字符组合,代表中间字符中的任意一个
11. && 与 ||
在上面刚刚提到了分号,用于多条命令间的分隔符。另外还有两个可以用于多条命令中间的特殊符号,那就是 “&&”和”||”。下面笔者把这几种情况全列出:
1) command1 ; command2
2) command1 && command2
3) command1 || command2
使用”;”时,不管command1是否执行成功都会执行command2; 使用”&&”时,只有command1执行成功后,command2才会执行,否则command2不执行;使用”||”时,command1执行成功后command2 不执行,否则去执行command2,总之command1和command2总有一条命令会执行。
多条命令结果一起输出
(date;ls) > 1.txt
awk去掉所有重复的行,保留位置,最后再输出最后一行
awk '!a[$0]++{print}END{print}'
输出倒数第二行
tac file|sed -n 2p
输出字符串时进行换行
echo -e "$str"
分割字符串
cut -d 'b' -f 2
if的方括号中的空格一定要加!
shell的空格问题要多检查,别跟平时的习惯来
字符串转化为数字,合法数字字符串则不用转换
echo "08"|bc
统计一个字符串中某个字符的个数
echo "1001001" | awk -F'1' '{print NF-1}'