20200514
利用iconv可以进行文件编码的转换
dos2unix, unix2dos可以变更文件的每一行的换行符,如windows与linux文件的换行符不一样
bash
控制计算机硬件的是操作系统的内核,我们用过shell输入命令与内核沟通,让内核来操作硬件准确工作,bash属于壳程序(shell),其它应用程序也称为壳程序
type 命令可以查看命令是外部命令还是bash内置的命令,后接执行命令,不能是文件
[root@localhost ~]# type cd
cd is a shell builtin
# cp /test/1.txt /12/2.txt /3/3.txt \
>/5/5/txt /root #复制4个文件到/root目录下, \转义回车键,\后面要紧接着ENTER,不能多空格,因为\仅转义下一个字符
提示符命令行下
ctrl + u 或 ctrl + k 从光标处向前删除命令或向后删除命令
ctrl + a 或 ctrl +e 从光标处移动到整个命令的最前面或最后面
一般登录后,linux会根据/etc/passwd设置一个shell,默认bash
环境变量通常以大写字符表示
变量,类型默认字符串
变量的设置,变量与变量内容以一个=号来连接
name=VBird
等号两边不能接空格,变量内容有空格需用双引号或单引号结合起来
name = VBird name=Vbird good #错误
变量只能是英文与数字且不能数字开头
2myname=VBird #错误
双引号内的特殊字符可以保持原本的属性
var="lang is $LANG" -> echo $var -> lang is zh_CN.UTF8
单引号内的特殊字符为一般字符
var=‘lang is $LANG' -> echo $var -> lang is $LANG
可用\转义符将特殊字符([ENter], \ , ', 空格等)变成一般字符
name=Vbird\'s\ good -> echo $name -> Vbird's good
在一串命令中需要借由其它命令提供信息时,可以使用反单引号`或$()
version=$(uname -r)
变量扩增内容可以用${}字符
PATH=${PATH}:/home/hello
若变量需要在子进程中执行,
export 变量 #使其在为环境变量
取消变量
unset 变量
设置变量代替工作目录
work="/home/good" #不用""也行
env 显示所有的环境变量
RANDOM 生成随机数的变量, 0~32767
set 观察显示所有的环境变量与用户自定义变量
PS1='[\u@\h \W]\$ ' 命令提示符就是 [root@www~]#
$ shell的PID
echo $$ 2787
? 上个执行命令的返回值
ls -h -> echo $? -> 0 #命令能成功执行就返回0,否则就返回非0
export 自定变量转成环境变量
export myname #使myname变成环境变量,这样myname就可以在子进程中使用,export后没接变量时,会列出所有的环境变量
父进程与子进程
Linux登录之后得到一个BASH(父进程),在这Bash下面所执行的任何命令(子进程)都是由这个BASH所衍生出来的.如在父进程的bash下面执行bash进入到另一个界面(子进程),原本的Bash就会暂时sleep,当子进程bash exit退出后才回到原本的BASH。
子进程仅继承父进程的环境变量,不会继承自定义变量
declare 将环境变量转成自定义变量
为什么环境变量的数据可以被字进程引用?
因为内存配置关系,启动一个shell时,操作系统会给这个SHELL在内存中分配一个区域,些内存中的变量就可以让子进程使用。若父进程用export功能,就可以让自定义的变量的内容写到上述内存区域中(环境变量),当加载另一个子进程时(离开父进程),子shell可以调用父进程的环境变量所在内存区域到自己的环境变量内存区域中
语系 locale
查看语系
locale
查看支持的所有语系
locale -a #没有的话可以安装语言包
修时修改语系
LANG=en_US.utf8
永处修改要写到配置文件去
cat /etc/locale.conf
LANG=en_US.utf8
read 读取来自键盘输入的变量内容
-p 后面接提示字符
-t 接等待的秒数
read -p "please enter your name: " -t 30 name -> hello -> echo $name -> hello
declare 声明变量的类型
-a 将后面的变量定义为数组(array)类型
-i 将后面的变量定义为整数类型
-x 用法与export一样,将后面的变量变成环境变量
-r 交后面的变量设置成为readonly,不可更改内容与不能unset
-P 单独列出变量的类型
declare -i sum=100+200+300 -> echo $sum -> 600 #变量类型默认为字符串所以要声明为整数类型,BASH的数值运算中,默认最多仅能到达整数形态,所以1/3结果是0
数组
设置数组 var[index]=content
var[1]="small min"
var[2]="big min"
var[3]="nice min"
echo ${var[1]} -> "small min"
echo "${var[1]}, ${var[2]}, ${var[3]}"
ulimit
可以限制用户某些资源,如可以开启的文件数量,可以使用的cpu时间,使用的内存总量等
-a 列出所有的限制额度
-f 此shell可以建立的最大文件容量,单位为kbytes
变量的删除与替换
[root@localhost ~]# echo ${path}
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
删除/usr/local/sbin 第一个目录
[root@localhost ~]# echo ${path#/*local/sbin:}
/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
删除前面所有的目录只保留 /root/bin
[root@localhost ~]# echo ${path##/*bin:}
/root/bin
# 删除符合文字的最短那一个
## 删除符合文字的最长那一个
删除最后一个目录
[root@localhost ~]# echo ${path%:*bin}
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin
只保留第一个目录
[root@localhost ~]# echo ${path%%:*bin}
/usr/local/sbin
% %% 与# ##类似,但是从后面匹配
${变量/旧字符/新字符} 替换符合的第一个旧字符
¥{变量//旧字符/新字符} 全部替换
20200519
prtg添加https域名监控,add sensor要选择HTTP Advanced类型,然后域名填http://abc.com就行,Require Keyword要选择Set sensor to error if keyword is missing,对应的字符串可以填要监控的字符串(检测有没有劫持),也可以随便填比如(abc.com)
变量的测试与内容转换
root@localhost ~]# echo $username
username变量没有设置时
[root@localhost ~]# username=${username-root}
[root@localhost ~]# echo $username
root
变量为空时
[root@localhost ~]# username=""
[root@localhost ~]# username=${username-root}
[root@localhost ~]# echo $username
[root@localhost ~]# username=${username:-root}
[root@localhost ~]# echo $username
root
其它先跳过
命令别名
alias, 可以将常用或长的命令创建成一个新的命令
alias lm='ls -al|mort' #
也可以替换命令
alias rm='rm -i' #这样rm就变成了新的有-i参数的命令
alias 直接列出所有别名
unalias 取消别名
历史命令
history
-n 列出最近n条命令
-c 将目前的shell中的所有history内容全部清除
-w 将目前的history记录到histfiles中
当以bash登录后,系统会主动同~/.bash_history读取以前执行
过的命令。~/.bash_history能记录的数量与HISTFILESIZE变量有关.假设这次登录后执行了100条命令,那当注销时,系统会将101~1100更新到~/.bash_history中,也就是说注销时会把最近的HISTFILESIZE记录到记录文件中,也可以用history -w强制写入
多用户登录命令写入为最后注销那个
bash shell的操作环境
路径与命令查找顺序
1, 相对/绝对路径执行命令, 如/bin/ls
2, 由alias找到该命令执行
3, 由bahs内置的(builtin)命令来执行
4, 通过$PATH变的的顺序找到的第一个变量来执行
可以通过type -a ls 查看顺序
bash登录与欢迎信息
/etc/issue #登录就看到的欢迎信息如操作系统与硬件等级,可以修改
/etc/motd #可以设置让用户登录就看到的信息,如某时间点系统维护
bash的环境配置文件
一进入Bash就会取得一些有用的变量是因为系统有一些环境配置文件,让bash启动时就直接读取这些文件,这些环境配置文件又分为全局系统配置文件与文人偏好配置文件,alias与自定义的变量在bash注销时会失效,要想保留就得写得配置文件中
login shell 与non-login shell
区别在于有没有登录
login shell
取得bash时需要完整的登录流程,如tty1~tty6登录需要账密,些时取得的bash称为login shell
non-login shell
如在X的图形界面中启动终端或在原本的bash环境下再次输入bash命令,都是不需要账密的
login shell与non-loginshell读取的配置文件不一样
一般来说,login shell只会读取两个配置文件
/etc/profile, 系统的整体设置,最好不要修改
~/.bash_profile 或~/.bash_login 或 ~/.profile 属于用户个人设置,用户要添加的自己的数据就写入这里
/etc/profile(login shell才会读)
可以利用用户的标识符(uid)在、来决定很多重要的变量数据,也是每个用户登录取得bash时一定会读取的配置文件,想要帮所有用户设置整体环境就是改这里,主要变量有
PATH
MAIL
USER
HOSTNAME
HISTSIZE
umask
/etc/profile还会云调用外部的配置文件,下面的文件会依序被调用
/etc/profile.d/*.sh
/etc/locale.conf #语系相关
/usr/share/bash-comletion/completion/* #命令与文件补齐等
默认情况下读取的整体环境配置文件其实只有/etc/profile,但/etc/profile会调用其它的配置文件
读完整体环境设置后就会读取用户的个人配置文件,一般是这三个
/.bash_profile
或~/.bash_login
或 ~/.profile
只实只会读取其中的一个,读取顺序从上到下,前面的不存在才会云读取下面的
[leison@localhost ~]$ cat ~/.bash_profile
# .bash_profile
# Get the aliases and functions
if [ -f ~/.bashrc ]; then
. ~/.bashrc
fi
# User specific environment and startup programs
PATH=$PATH:$HOME/.local/bin:$HOME/bin
export PATH
如PATH变量有设置,以累加的方式并export,-f ~/.bashrc则是存在bashrc就读入bashrc的配置,. ~/.bashrc 等于sorce ~/.bashrc,也就是说~/.bash_profile其实还会再调用~/.bashrc的内容,所以最终读取的文件是~/.bashrc,可以将自己的偏好设置写入该文件
source 配置文件
配置文件/etc/profile等都是在取得login shell后才会读取的配置文件,所以如果将自己的偏好设置写入上述文件,那就要注销再登录后设置才会生效.source可以直接读取配置文件而不再注销登录
source /etc/profile
. /etc/profile #两条命令等效
non-login shell
该bash只会读取~/.bashrc而已
~/.bashrc
[root@localhost ~]# cat ~/.bashrc
# .bashrc
# User specific aliases and functions
alias rm='rm -i'
alias cp='cp -i'
alias mv='mv -i'
# Source global definitions
if [ -f /etc/bashrc ]; then
. /etc/bashrc
fi
root的bashrc已规范好命令别名的安全选项,centos 7.x还会主动调用/etc/bashrc文件,因为/etc/bashrc帮我们的BASH定义下面内容
根据不同的uid设置umask的值
根据不同的uid设置提示字符(PS1变量)
调用/etc/profile.d/*.sh设置
其它相关
/etc/man_db.conf
规范使用man page的该去哪查看数据的路径,tarball安装的软件的命令帮助man可能需要修改
~/.bash_history
登录bash后读取此文件到内存,在BASH内就可以看到历史命令了
~/.bash_logout
注销bash后,系统再帮我做什么操作后才离开,如清屏
终端的环境设置 stty set
一般不修改,本身设置已经很好
stty erase ^h #用ctrl + h 删除字符(原来是Backspace)
set
-u,默认不启用,若启用,当使用未设置变量时,会显示错误信息
echo $- # $-变量内容就是set的所有设置
set -u
echo $virbird # 期待virdbird变量不存在,则会报错,没启用-u时会显示空
BASH默认的组合键
ctrl + c 终止目前的命令
ctrl + d 输入结束EOF,例如由件结束的时候
ctrl + m 回车
ctrl + s 停止屏幕输出
ctrl + q 恢复屏幕输出
ctrl + u 在提示符下将整行命令删除
ctrl + z 暂停目前的命令
通配符与特殊符号
通配符
* 代表0到无穷个任意字符
? 代表一定有一个任意字符
[] 代表一定有一个在括号内的字符(非任意字符),如[[abcd],代表一定有a或b或c或d的中的任意一个字符
[ - ] 代表在编码顺序内的所有字符,如[0-9]代表0和9之间的所有数字
[^ ] ^反向选择, [^abc]代表一定有一个字符,但不是a,b,c
例找出/etc下面以cron为开头的文件
ll -d /etc/cron*
找出/etc下面刚好是5个字母的文件名
ll -d /etc/?????
找出/etc下面含有数字的文件
ll -d /etc/*[0-9]*
找出/etc下面文件名开头为非小写字母开头的文件
ll -d /etc/[^a-z]*
特殊符号
# 注释符号,写脚本常用
\ 转义符,将特殊字符与通配符还原成一般符号
| 管道
; 连续命令执行分隔符
~ 用户家目录
$ 使用变量前导符
! 逻辑运算上的非(not)
/ 路径分隔符,目录符号
>, >> 重定向输出
<, << 重定向输入
'' 单引号,不具备变量替换功能,单引号内的$变量为纯文本
"" 双引号,具备变量替换功能
`` 反单引号,`中间的命令可先执行,等于$()
( ) 在中间为子shell的起始与结束
{ } 在中间为命令区块的组合
数据流重定向
standard output 与 standar error output
标准输出指的是命令执行所返回的正确信息,标准错误输出指的是命令执行失败返回的错误信息
标准输入(sdin): 代码为0, 使用< 或 <<
标准输出(stdout): 代码为1, 使用> 或>> # 1> 1不写也行
标准错误输出(stderr): 代码为2, 合用 2> 或2>>
ll / > test # 把ll / 输出的信息写入文件或设备, 若test不存在系统则自动建立
1> 以覆盖的方法将正确的数据输出到指定的文件或设备上
1>> 以累加的方法将正确的数据输出到指定的文件或设备上
2> 以覆盖的方法将错误的数据输出到指定的文件或设备上
2>> 以累加的方法将错误的数据输出到指定的文件或设备上
注意 1>> 或 2>> 中间是没有空格的
[ABC@localhost ~]$ find /home -name .bashrc
/home/leison/.bashrc
find: ‘/home/arod’: Permission denied
find /home -name .bashrc > list_right 2> list_error
/dev/null 垃圾黑洞,可以吃掉导向这个设备的任何信息
[leison@localhost ~]$ find /home -name .bashrc 2> /dev/null
/home/leison/.bashrc #正确的输出屏幕,错误写出黑洞
将正确与错误的信息都写list
find /home -name .bashrc >list 2>&1 #stderro输出到stout,2的转到1
find /home -name .bashrc &> list 两条都可以
standard input <与<<
$ cat > test
hello
#ctrl + d 退出
cat test
hello
$ cat > test < ~/.bashrc #用文件替代键盘的输入
cat test
# .bashrc
# Source global definitions
if [ -f /etc/bashrc ]; then
. /etc/bashrc
.....
.....
$ cat > test << "eof"
> hello
> good
> eof
[leison@localhost ~]$ cat test
hello
good
利用<<可以不用ctrl + d,对写脚本有帮助
命令的执行的判断根据 ; && ||
cmd;cmd (不考虑命令相关性的连续命令执行)
如 $ sync;sync;shutdown -h now #关机前先执行两次sync同步写入磁盘操作
$? (命令返回值)与 && 或 ||
若前一个命令执行的结果为正确,在Linux下面会返回一个$?=0的值
cmd1 && cmd2, 若cmd1执行完毕且正确执行($?=0),则开始执行cmd2
若cmd1执行完毕且为错误($?不等于0),则cmd2不执行
cmd1 || cmd2, 若cmd1执行完毕且正确执行($?=0),则cmd2不执行
若cmd1执行完毕且为错误($?不等于0),则开始执行cmd2
例若存在/tmp/abc,则建立/tmp/abc/hehe文件
假设存在
ls /tmp/abc && /tmp/abc/hehe
例测试/tmp/abc是否存在,若在则不创建 ,不存在则创建
ls /tmp/abc || mkdir /tmp/abc
例不清楚/tmp/abc是否存在,但就是要建立/tmp/abc/hehe
ls /tmp/abc || mkdir /tmp/abc && touch /tmp/abc/hehe
若存在/tmp/abc则不执行mkdir,$?=0向后转, &&遇到0,执行touch
若不存在/tmp/abc,则执行mkdir,后$?=0向后转,touch照样会执行
例判断/tmp/virding是否存在,存在显示"exist",不存在显示"not exist"
ls /tmp/virding && echo "exist" || echo "not exsit" #顺序重要
20200523
管道命令(pipe)
管道命令仅会处理标准输出,对于标准错误会予以忽略
管道命令必须能够接受来自前一个命令的数据成为标准输入继续输入处理才行
管道命令
less more head tail等
选取命令 cut grep
[root@localhost ~]# echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
[root@localhost ~]# echo $PATH | cut -d ':' -f 5
/root/bin
[root@localhost ~]# echo $PATH | cut -d ':' -f 3,5
/usr/sbin:/root/bin
[root@localhost ~]# export
declare -x HISTCONTROL="ignoredups"
declare -x HISTSIZE="1000"
declare -x HOME="/root"
declare -x HOSTNAME="localhost.localdomain"
declare -x LANG="en_US.UTF-8"
.......
[root@localhost ~]# export | cut -c 12-
HISTCONTROL="ignoredups"
HISTSIZE="1000"
HOME="/root"
HOSTNAME="localhost.localdomain"
grep
[root@localhost ~]# last
root pts/0 192.168.1.8 Fri May 22 22:15 still logged in
root pts/1 192.168.1.3 Fri May 22 18:59 - 23:43 (04:43)
root tty1 Fri May 22 18:59 still logged in
root pts/0 192.168.1.5 Fri May 22 11:04 - 20:51 (09:47)
reboot system boot 3.10.0-957.el7.x Fri May 22 10:59 - 03:28 (16:28)
有出现root的一行就找出来
root@localhost ~]# last | grep 'root'
root pts/0 192.168.1.8 Fri May 22 22:15 still logged in
root pts/1 192.168.1.3 Fri May 22 18:59 - 23:43 (04:43)
root tty1 Fri May 22 18:59 still logged in
root pts/0 192.168.1.5 Fri May 22 11:04 - 20:51 (09:47)
取反
[root@localhost ~]# last | grep -v 'root'
reboot system boot 3.10.0-957.el7.x Fri May 22 10:59 - 03:29 (16:30)
reboot system boot 3.10.0-957.el7.x Tue Apr 28 12:37 - 03:29 (24+14:52)
reboot system boot 3.10.0-957.el7.x Sat Apr 18 14:33 - 03:29 (34+12:56)
[root@localhost ~]# last | grep 'root' | cut -d ' ' -f 1
root
root
root
排序命令
sort
-n 以纯数字来排序
-r 反向排序
-t 分隔符,默认[Tab]
-k 指定那个区间来进行排序
普通排序,sort默认以第一条信息来排,且以文字形式排序
[root@localhost ~]# cat /etc/passwd | sort
adm:x:3:4:adm:/var/adm:/sbin/nologin
alex:x:1001:1001::/home/alex:/bin/bash
apache:x:48:48:Apache:/usr/share/httpd:/sbin/nologin
arod:x:1002:1002::/home/arod:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
chrony:x:998:996::/var/lib/chrony:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
以第3段且以纯数字来排序
[root@localhost ~]# cat /etc/passwd | sort -t ':' -k 3 -n
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
uniq (去重)
-c 进行计数
使用last取出账号栏,仅取出账号,进行排序后取出一位
[root@localhost ~]# last | cut -d ' ' -f 1| sort|uniq
reboot
root
wtmp
加多账号登录次数
root@localhost ~]# last | cut -d ' ' -f 1 | sort | uniq -c #先sort
1
16 reboot
89 root
1 wtmp #空白与wtmp是默认字符可以忽略
wc (统计行或字符)
-l 统计行数
-m 统计字符
[root@localhost ~]# cat /etc/man_db.conf |wc
131 723 5171
# 行 字数 字符数
统计登录次数
[root@localhost ~]# last | grep [a-zA-Z]|grep -v 'wtmp'|grep -v reboot | wc -l
89