文章目录
- 常见的Linux命令
- 常见操作
- rpm软件安装命令
- VIM 中的操作命令
- 常见的输出文本内容
- 可配置环境变量的地方
- 与文件系统及程序的限制关系: ulimit
- 变量内容的删除、取代与替换 ( Optional)
- 对磁盘的操作
- 更改swap内存的方法
- 挂载指定的iso文件和生成指定的iso文件
- env 显示环境变量
- 影响显示结果的语系变量 ( locale)
- 变量键盘读取、阵列与宣告: read, array, declare
- truncate
- 时区的显示与设置
- bash script 脚本的编写
- systemctl 管理单一服务(service unit)
- 配置本地源
- 查看磁盘与目录的容量:df, du
- 启动后台程序
- yum 的在线升级机制
- Linux 账号和用户组
- Linux系统的状态检测
- 实际的案例
- 参考文档
这里主要整理记载和整理了一些在2年的Code过程中,零零散散使用到的Linux命令和常用的操作。主要的练习环境是Centos7,但是大多数也都是通用其它类Unix系统。希望对看到这篇文章的你有帮助, 也欢迎给予一些FeedBack。
常见的Linux命令
wget 命令
- -b 后台下载模式
- -P 下载到指定目录
- -t 最大尝试次数
- -c 断点续传
- -p 下载页面内所有资源,包括图片、视频等
- -r 递归下载
# 下载某个文件到指定目录(桌面)下
wget -p ~/Desktop http://www.linuxprobe.com/docs/LinuxProbe.pdf
date 命令
date 命令用于显示及设置系统的时间或日期,格式为“date [选项] [+指定的格式]”。
按照默认格式查看当前系统时间的 date 命令如下所示:
# 按照指定格式显示时间 年月日时分秒
$ date "+%Y-%m-%d %H:%M:%S"
# 设置当前系统时间
date-s "20170901 8:30:00"
top 命令
- top -H 可以查看具体线程的负载情况
tar 命令 - 压缩和解压
-
压缩 :
tar -czf 压缩后文件名 压缩文件路径
-
解压缩:
tar -xzf 解压缩文件名 -C 解压文件路径
-
不解压,只查看压缩文件内容:
tar -tvf 压缩文件
grep 命令 - 基础正则表达式
正则表达式和通配符不是一个概念
cat -A 输出文档中的所有字符,包括特殊字符;
^M :表示断行字符;
^I :表示 <tab> 造成的按键符号;
$ :表示每一行的行尾之意!
egrep表示扩展的正则表达式
^word / word$:表示待搜寻的字符在表首部/尾部
?/ *表示任意一个/多个字符;
\{n\}:表示连续n个及以上的前一个RE(参考字符)
\{n,m\}:表示连续n到m个前一个RE
sed 命令 - 进行替换、删除、新增、选取,应用场景主要是文件
用法:sed [-nefr] [动作]
-
-n
:表示只有经过处理的哪行才会显示出来(安静模式) -
-e
:直接在命令行上进行动作的编辑 -
-f
:是将sed的动作编写在一个文件中,-f filename执行文件内的sed动作 -
-r
:让sed支持egrep -
-i
:直接读取文件的内容,不在屏幕中输出(一般不推荐,危险系数比较高) -
动作说明:
[n1,n2] function
。其中 n1,n2 通常代表选择进行动作的行数(可选)。
a:+str 直接加字符串,新增(add),目前的下一行
c:+str 所加的字符串替换n1和n2之间的行
d: 删除(delete),后面一半不加
i: +str 插入(insert),在目前的上一行中插入
p: 打印(print),通常和sed -n一起使用
s: 替换,通常搭配正则表达式,例如 1,20s/old/new/g其中s///g是标准格式,缺一不可
sed的一些实际用例
-
在第二行的后面增加两行字
nl /etc/passwd | sed '2a Drink tea or \drink beer?'
-
将第2~5行的内容替换成“NO-2-5 number”
nl /etc/passwd | sed '2,5c NO-2-5 number'
-
仅仅列出文件内的第5-7行
nl /etc/passwd | sed -n '5,7p'
-
取得ip的范例
-
利用关键字配合grep选取出关键的一 行
/sbin/ifconfig eth0 | grep 'inet addr'
-
将ip前面的字符部分删除
-
~ | sed "s/^.*addr://g"
-
将ip后面的部分删除
~ | sed "s/Bcas.*$//g"
值得注意的就是
.*
配合一起才能表示任意的连续的多个字符,单个的*
只是表示前面的re的重复
"/^$/d"
表示删除空白行
-
awk工具——将一行的数据变成字段来处理(默认分隔符tab和空格)
用法:awk '条件类型1 {动作1} 条件类型2 {动作2} …… filename
例如: last -n 5 | awk 'print $1 "\t" $3' # awk
会将行分段,每一段都会用变量名1,2,3……来表示
其中 NF($0)
:表示每一行拥有的字段总数
NR
:目前awk所处理的哪行FS
:目前使用的分割符,默认空格
diff、patch命令 - 文档比较工具
diff
比较两文件的区别,可用来制作补丁文件 diff -Naur oldfile newfile > file.patch
patch
利用补丁文件升级patch文件
- 更新:
patch -pN < file.patch
- 还原:
patch -R -pN < file.patch
history 命令
!!
执行上一个命令!n
执行第n个指令!vi
执行最近以vi开头的指令
split 命令 切分文件
常见操作
rpm软件安装命令
rpm -ivh 软件名称 [--test] [--prefix 新路径]
eg:rpm -ivh ‘/home/x3919/Desktop/jdk-8u131-linux-x64.rpm’ --test --prefix /opt/modules/
卸载rpm软件
rpm -qa | grep jdk
命令表示查询与jdk字符有关的软件名称
rpm -e jdk1.8.0_131-1.8.0_131-fcs.x86_64
表示卸载jdk软件,加上–nodeps表示强制删除
RPM 验证与数字证书
rpm -Va
列出系统中所有可能被改过的文件rpm -V softname
列出该软件所含的文件被改过,才会列出来rpm -Vf filename
某个文件是否被更改过- 重建数据库:
rpm --rebuilddb
VIM 中的操作命令
-
x
向后删除(字符);X
向前删除(字符) -
dd
删除整行 ndd
为向下删除n行,d1G
、dG
删除到第一行(最后一行)的数据 -
d$
、d0
删除到光标到该行的最前面(最后面) -
yy
复制 -
p
、P
在光标的下一行(上一行)粘贴
常见的输出文本内容
- cat、和 tac:正向查看文本和方向查看文本(最后一行先展示)
- nl 功能,可以查看行号,比cat -n 功能更强
- more 翻页
- 空白键space 代表向下翻一页
- Enter 向下翻一行
- /字串 向下搜索字段这个关键字
- :f 立刻显现文件名及当前的行数
- b或者ctrl+b 往前翻页,只对文件有效,管道无效
- less 比more更强
- [pageDown]、[pageUp] 向下和向上翻页
- /字串、?字串 向下或向上搜索字段
- n、N 重复前一个搜索,返回前一个搜索
- g、G 前进到这个数据的第一行/最后一行数据中去
- head、tail 截取文本的前面/后面的内容
可配置环境变量的地方
/etc/profile
设置系统级别的环境变量,对所有的用户有效,该文件被执行.并从/etc/profile.d目录的配置文件中搜集shell的设置;/etc/bashrc
为每个运行bash shell的用户执行此文件。~/.bash_profile
每个用户都可使用该文件输入专用于自己使用的shell信息,当用户登录时,该文件仅仅执行一次!默认情况下,他设置一些环境变量,执行用户的.bashrc文件.~/.bashrc
: 该文件包含专用于你的bash shell的bash信息,当登录时以及每次打开新的shell时,该该文件被读取.~/.bash_logout
: 当每次退出系统(退出bash shell)时,执行该文件.
/etc/profile中设定的变量(全局)的可以作用于任何用户,而~/.bashrc等中设定的变量(局部)只能继承/etc/profile中的变量,他们是"父子"关系.
设置环境变量export属性后,利用 source 命令使整个脚本生效
与文件系统及程序的限制关系: ulimit
变量内容的删除、取代与替换 ( Optional)
语法:${variable#/bin:}
其中variable
是要操作的变量,#
是关键词,而 /bin:
表示要匹配的内容
其中 #
表示删除符合条件的最短字符(从左往右删除)
##
表示删除符合条件最长的字符%
表示从后往前删除符合条件最短的字符%%
表示删除最长符合条件的字符
echo ${PATH}
echo ${PATH#/bin*:} # 删除最短的以bin开头的目录
对磁盘的操作
- 分区
fdisk -l
会显示所有的磁盘信息 mkfs -t ext3 /dev/sdb1
会对所分区的内容格式化mount -t ext3 /dev/sdb1 /mnt/dir
对磁盘进行挂载vim /etc/fstab
开机自动挂载的设置,编辑如上的编写/dev/sdb1 /mnt/dir ext3 defaults 0 0
更改swap内存的方法
-
可以查看PC中的内存情况
free
-
通过dd命令创建一个临时的swap file,大小为1Gb
dd if=/dev/zero of=/home/oracle/swap.file bs=1024k count=1024
-
通过mkswap命令格式化步骤1中创建的临时交换文件
mkswap /home/oracle/swap.file
-
通过swapon命令使swap文件生效,如下:
swapon /home/oracle/swap.file
-
如果需要永久有效,那么需要将新加的swap设备文件写到fstab文件中,使其每次服务器重启都会自动生效
echo “/home/oracle/swap.file swap swap defaults 0 0”>>/etc/fstab
-
在临时设备上面关闭SWAP
swapoff /home/oracle/swap.file
挂载指定的iso文件和生成指定的iso文件
# 挂载指定的iso文件
mount -o loop /dev/xxx.iso /mnt
# 生成iso等镜像文件
mkisofs -r -v -o 输出文件名 输出的目录
env 显示环境变量
set 是显示环境变量和自定变量
几个重要的环境变量
PS1:命令提示字符,修改可以设置显示的内容
OSTYPE, HOSTTYPE, MACHTYPE:( 主机硬件与核心的等级)
declare 与 typeset的功能相同,顾名思义就是设置变量类型
影响显示结果的语系变量 ( locale)
变量键盘读取、阵列与宣告: read, array, declare
read [-pt] variable
-p 后面接提示字符
-t 后面接等待的秒数 read -p "please enter a str" -t 30 named
declare [-aixr] variable
-a 将后面的变量声明为数组类型
-i 声明为整型
-x 将变量声明为环境变量和export一样
-r 将变量声明为只读类型
<.> bash 环境中的数值运算,默认最多仅能到达整数形态,所以 1/3 结果是 0;
阵列的设置方式是
var[index]=content
truncate
文件的缩短,主要是文件的切割,只能缩小,从开头剪切到你指定的大小.参数不存在会创建文件
主要参数
-c, --no-create do not create any files
-o, --io-blocks 使用 IO Black 来表示文件大小
-r, --reference=FILE 用别的文件的大小
-s, --size=SIZE 使用指定大小
SIZE 需要时如下整数选项: KB 1000, K 1024, MB 1000*1000, M 1024*1024, and so on for G, T, P, E, Z, Y.
SIZE 也可以拥有下面的这些修饰符前缀:
`+' extend by, `-' reduce by, `<' at most, `>' at least,
`/' round down to multiple of, `%' round up to multiple of.
Note that the -r and -s 交互执行.
时区的显示与设置
CentOS 7以前,可以直接修改 /etc/sysconfig/clock就修改了时区,时区的选项在 /usr/share/zoneinfo中
时间的修改可以利用 date -s '2016-01-01 00:00:00' 来实现,详细的查看date 用法
bash script 脚本的编写
test 命令的用法
#!/bin/bash
# 让用户输入,并且判断是否真的输入了用户名
echo -e "请输入文件名:我将会检查文件的类型和权限.\n"
read -p "输入文件" filename
# 用于文件名是否存在 test -z string 判断文件名是否为空
test -z &filename && echo "你必须输入一个文件名" && exit 0
# 用于判断文件是否存在,其中 -e 表示是否存在 !表示反向选择
test ! -e $filename $$ echo "这个'$filename'文件不存在" && exit 0
# 开始判断文件的类型与属性
test -f $filename && filetype="regulare file"
test -d $filename && filetype="directory"
test -r $filename && perm="readable"
test -w $filename && perm="$perm writable"
test -x $filename && perm="$perm executable"
# 开始输出信息!
echo "这个文件:$filename 是一个 $filetype"
echo "并且权限是:$perm"
时间:2017/8/16
systemctl 管理单一服务(service unit)
[root@study ~]# systemctl [command] [unit]
command 主要有:
start :立刻启动后面接的 unit
stop :立刻关闭后面接的 unit
restart :立刻关闭后启动后面接的 unit,亦即执行 stop 再 start 的意思
reload :不关闭后面接的 unit 的情况下,重新载入配置文件,让设置生效
enable :设置下次开机时,后面接的 unit 会被启动
disable :设置下次开机时,后面接的 unit 不会被启动
status :目前后面接的这个 unit 的状态,会列出有没有正在执行、开机默认执行否、登录等信息等!
is-active :目前有没有正在运行中
is-enable :开机时有没有默认要启用这个 unit
配置本地源
步骤 1:光驱挂载镜像
查看磁盘与目录的容量:df, du
df
: 列出文件系统的整体磁盘使用量du
:评估文件系统的磁盘使用量(常用于评估目录所占容量)
df [OPTION]... [FILE]...
-a :列出所有的文件系统,包括系统特有的 /proc 等文件系统;
-h,(-H,-k,-m ) --human-readable 人们较易阅读的 GBytes, MBytes, KBytes 等格式自行显示;-H,-k,-m 是具体指定格式来显示
-i, --inodes 不用磁盘容量,而以 inode 的数量来显示
-T 列出该分区的分区容量
Usage: du [OPTION]... [FILE]...
-a :列出所有的文件与目录容量,因为默认仅统计目录下面的文件量而已。
-h :以人们较易读的容量格式 ( G/M) 显示;
-s :列出总量而已,而不列出每个各别的目录占用容量;
-S :不包括子目录下的总计,与 -s 有点差别。
-k :以 KBytes 列出容量显示;
-m :以 MBytes 列出容量显示;
启动后台程序
- 方法1:标准的 service 方式:RPM 、DEB 安装,运行 service logstash start 命令即可
- 方法2:最基础的 nohup 方式:同时在命令前面加 nohup ,后面加 &,例如:nohup bin/kibana &
- 方法3:更优雅的 SCREEN 方式:
① 创建独立的 screen 命令如下:screen -dmS elkscreen_1
② 接管连入创建的 elkscreen_1 命令如下:screen -r elkscreen_1
按 Ctrl+A+D 键,断开环境。想重新接管,依然 screen -r elkscreen_1,如果创建了多个 screen,查看列表命令screen -list - 方法4:最推荐的 daemontools 方式:对于需要长期后台运行的大量程序(注意大量,如果就一个进程,还是学习一下怎么写 init 脚本吧),推荐大家使用一款 daemontools 工具。包括但不限于 python 实现的 supervisord,perl 实现的 ubic,ruby 实现的 god 等。
yum 的在线升级机制
查询功能
yum [list|info|search|provides|whatprovides]
利用yum来查询原版distribution所提供的软件或已知软件的名称
常见的用法如下 yum [option] [查询的工作项目] [相关参数]
主要的 [option]
选项如下:
-y
表示等待用户输入时,自动提供yes的响应--installroot=/opt/softpath
表示更改该软件的默认安装路径为/opt/softpath[查询的工作项目]
的可用选项如下search
: 搜索某个软件的名称或者是描述description的重要关键字list
: 列出目前yum所管理的所有软件名称与版本,类似于rpm -qa
info
: 同上,不过类似于rpm -qai
provides
: 从文件去搜索软件,类似于rpm -qf
具体的用法如下:
- 列出yum服务器上可供本机升级的所有软件
yum list updates
- 列出提供passwd这个文件的软件有哪些
yum provides passwd
安装/升级软件
主要用法如下 yum [option] [查询的工作项目] [相关参数]
主要参数(option)如下:
install
:后面接要安装的软件update
:后面接要升级的软件remove
:后面接要卸载的软件
如果软件安装 rpm -ivh xx.rpm
失败,提示缺少指定软件依赖是 libXss.so.1
,可以通过如下方式查找。
repoquery --nvr --whatprovides libXss.so.1
可以查找出依赖的包名,然后根据包名来补包就可以啦。非常的方便。
yum的设置文件
可以参考设置的地方有两个:
-
关于
/etc/yum.conf
文件:主要承担全局配置[main],此外也可以在此处配置软件仓库(repository) -
关于
/etc/yum.repos.d/filename.repo:
主要承担具体软件仓库的配置(若上面yum.conf中配置了软件仓库,此处也可以选择不配置),filename可自行定义。vim /etc/yum.repos.d/CentOS-Base.repo [base]:代表容器的名字。中括号一定要存在,里面的名字可以随便取,但是并不能有两个相同的容器名称 name:只是说明容器的意义,不重要 mirrorlist=:列出容器可以使用的镜像站点,如果不想使用,可以批注注释掉这一行 baseurl=:这个非常的重要,因为后面接的就是容器的实际网址。 enable=1:就表示让这个容器启动 gpkcheck=1:指定是否需要查阅RPM的数字证书 gpgkey=:就是数字证书公钥文件所在位置
如何清除本机上面的旧数据,使用命令yum clean [packages|headers|all]
- packages:将已下载的软件文件删除;
- headers:将下载的软件文件头删除;
- all: 将所有容器的数据都删除。
如何使用 yum 的软件组功能,使用的命令 yum [组功能] [软件组]
,主要参数:
- grouplist:列出可以使用的组列表
- groupinfo:后面接group name,则可了解该group 内含的所有组名称
- groupinstall:这个好用,可以安装一组的软件,相当方便
- groupremove:删除某个组
如果实现全系统自动升级,例如我们希望在每天凌晨 3:00 升级。
vim /etc/crontab
0 3 * * * root /usr/bin/yum -y update
Linux 账号和用户组
每个用户都会有两个ID: UID(用户) + GID(用户组)
对于a.UID
,取值范围:
0
表示系统管理员,具有root权限,只要改为0就具有root权限(一般不推荐多个账号UID为0);1~499
:保留给系统自己使用,但是除了0以外,其他的UID特性并没有不同。通常不可登录,需要使用/sbin/nologin
;500
以上:普通用户自己使用.
/etc/passwd
文件存放不同账号的权限 /etc/shadow
存放加密后的密码
如果root用户密码忘记:
-
进入单用户模式(直接赋予root权限);
-
利用Live CD 开机挂载根目录、修改
/etc/shadow
,将root密码字段清空。
/etc/group
文件存放用户组信息 /etc/gshadow
存放用户组密码
- 初始用户组:就是(加入多个组中)默认的用户组,被设置在/etc/passwd的第四个字段中
- 有效用户组:正在使用的用户组权限的用户组(操作命令:groups),有效用户组切换,newgrp 用户组名
下面介绍一些实例:
- 新建一个账号。主要用法
useradd \[-u UID\]\[-g 初始用户组\]\[-G 次要用户组]\[-mM\]\[-c 说明栏\]\[-d 设置主文件夹绝对路径\]\[-s shell\] 用户名
-u
:指定用户的UID-g/G
:指定用户的初始用户组/次要用户组-s
:指定该用户使用的shell,默认是/bin/bash
-r
: 创建一个系统账号,UID 有限制(参考/etc/login.defs
),默认不创建主文件夹
打开useradd的参考文件 “useradd -D”
e.g.1:useradd + 设置用户名 # 默认主目录权限是700
修改密码是:passwd 用户名
chage命令用来显示详细的密码参数
usermod
命令对用户信息进行微调——和useradd很像,主要用法usermod [-cgGlsu] username
-c
:后面接上用户的说明-g/G
:修改初始用户组/次要用户组-l
:修改账号名称-s
:修改用户的shell
userdel
用来删除用户,主要用法userder [-r] username
用户确定要删除不需要的用户名
-r
:表示连同主文件夹一起删除.
-
用户的功能:
-
finger [-s] username
# 显示用户里面内容,通常都是/etc/passwd
里面的内容 -
chsh
: 改变shellid:列出你的UID/GID 的信息 -
id
:列出你的UID/GID 的信息 -
新增和删除用户组
-
groupadd
-
groupmod
-
groupdel
-
用户身份的切换命令 su、sudo
-
su 命令的主要语法
su [-lm] [-c 命令] [username]
- `-`:代表使用login-shell的变量文件读取方式来登录系统,用户名称没有添加进去代表切换到root用户
- `-l`:同上
- `-m/p`:表示不读取login-shell用户中的文件,来切换用户
- `-c`:仅仅执行一次命令
- 直接使用su命令,很多原本的命令不会改变
- sudo命令的主要语法,
sudo [-b][-u 新用户账号]
,能让你以其他用户的身份登录 -b
:后面的命令让系统自行执行,而不与目前的shell参数影响-u
: 代表想要切换的对象,没有为root
说明一点,仅有/etc/sudoers
内的用户才能执行sudo命令。在root身份下,使用visudo
来修改/etc/sudoers
,能够让该账户使用全部或者部分root命令功能。
e.g.1:单一用户可进行root所有命令与sudoers文件语法. 执行 visudo /etc/sudoers
添加指定的用户,例如hadoop。
用户账号 登陆证的来源主机名=(可切换的身份) 可执行的命令
root ALL=(ALL) ALL # 默认值
hadoop ALL=(ALL) NOPASSWD:ALL #新增的用户
e.g.2:利用用户组来修改,修改同样的文件中
%wheel ALL=(ALL) ALL # %代表用户组的意思
usermod -a -G wheel hadoop # 将prol加入wheel的支持
Linux系统的状态检测
ifconfig
命令用于获取网卡配置与网络状态等信息uname
命令用于查看系统内核与系统版本等信息,格式为“uname [-a]
”。uptime
用于查看系统的负载信息,格式为uptime
。free
用于显示当前系统中内存的使用量信息,格式为“free [-h]
”who
用于查看当前登入主机的用户终端信息,格式为“who [参数]
”。last
命令用于查看所有系统的登录记录,格式为“last [参数]
”。history
命令用于显示历史执行过的命令,格式为“history [-c]
”。sosreport
命令用于收集系统配置及架构信息并输出诊断文档,格式为sosreport
lscpu
查看一些cpu等信息lshw
是一个通用的工具,可以列出多种硬件单元的详细或者概要的信息,比如 CPU、内存、usb 控制器、硬盘等。lshw能够从各个“/proc
”文件中提取出相关的信息
实际的案例
从实际的例子出发来熟悉一些Linux语法
从某个文件或者输出中读取选项作为用户输入
这里面需要介绍一个Linux中的数组概念(一维数组),数组生成方式为arrays=(value1 value2 ...)
。用空格分开。
- 数组中的单个元素表示
${my_array[0]}
- 使用@ 或 * 可以获取数组中的所有元素。
${my_array[*]}
或者${my_array[@]}
- 获取数组长度的方法与获取字符串长度的方法相同。
${#my_array[*]}
或者${#my_array[@]}
一个实际样例,我们从命令行单独启动安卓模拟器,我们首先获得选中输入的模拟器名称列表。并且展示出来。
emulatorList=($(emulator -list-avds | awk '{print $1}'))
emulatorListLenght=${#emulatorList[*]}
for ((i = 1; i <= $emulatorListLenght; i++)); do
Stream="${emulatorList[$i - 1]}"
echo "$i. ${Stream}"
done
read -p 'Enter input (default 1):' selectNum
echo "--- start ${emulatorList[$selectNum - 1]} ---"