linux基础(二)

1.命令行扩展
一个命令的输出结果作为一个命令的参数
表示:反向单引号和$()
示例:
echo "This system's name is $(hostname) "
This system's name is server1.example.com

echo "i am whoami "
i am root

2.括号扩展:{}
用途:简化打印重复字符串
案例1:批量打印文件
[root@CentOS6 ~ 19:44:11]$echo file1 file2 file3
file1 file2 file3
[root@CentOS6 ~ 19:44:18]$echo file{1,2,3}
file1 file2 file3
[root@CentOS6 ~ 19:44:28]$echo file{1,2,3}.{txt,log}
file1.txt file1.log file2.txt file2.log file3.txt file3.log
案例2:更加简化打印连续范围
[root@CentOS6 ~ 19:44:48]$echo file{1..5}
file1 file2 file3 file4 file5
案例3:打印不连续的范围
[root@CentOS6 ~ 19:46:03]$echo file{1..5..2}
file1 file3 file5
[root@CentOS6 ~ 19:46:18]$echo file{1..9..2}
file1 file3 file5 file7 file9
[root@CentOS6 ~ 19:46:54]$echo file{01..20..2}
file01 file03 file05 file07 file09 file11 file13 file15 file17 file19
[root@CentOS6 ~ 19:48:36]$

案例4:还可以打印字母
[root@CentOS6 ~ 19:48:36]$echo {a..z}
a b c d e f g h i j k l m n o p q r s t u v w x y z
[root@CentOS6 ~ 19:52:57]$echo {A..Z}
A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
[root@CentOS6 ~ 19:53:02]$echo {a..Z}
a _ ^ ] [ Z [root@CentOS6 ~ 19:53:07]$echo {A..z} ##按照ASCII码顺序打印 A B C D E F G H I J K L M N O P Q R S T U V W X Y Z [ ] ^ _ a b c d e f g h i j k l m n o p q r s t u v w x y z
[root@CentOS6 ~ 19:54:08]$

注意:在后期编写shell脚本时可能用到。

tab补全:
如果唯一,则直接补全,否则,再次tab给出列表。
功能:补全命令、补全文件名、补全选项(Centos7支持)
软件包:
[root@centos7 ~ 19:43:27]$rpm -qa bash
bash-4.2.46-30.el7.x86_64
bash-completion-2.1-6.el7.noarch——————在Centos6上不显示
[root@CentOS6 ~ 19:54:08]$rpm -qa bash

bash-4.1.2-48.el6.x86_64

双击tab键:
command 2Tab 所有子命令或文件补全
string2Tab 以string开头命令
~2Tab 所有用户列表
$2Tab 所有变量
@2Tab /etc/hosts记录 (centos7不支持)
=2Tab 相当于ls –A (centos7不支持)

命令行历史:
显示格式:数字编号 命令
调用命令:!编号
注意:连续、重复执行一条命令,仅仅显示一条记录
总结:存放位置————内存(最新) 配置文件
执行命令后,会记录在内存中,当用户注销、重启后,会把内存中的命令记录在.bash_history文件中,当用户登录后,加载到内存中。
测试:Xshell注销、关闭会话,正常记录到配置文件
虚拟机异常断电,不会记录到配置文件中————生产环境尽量避免——-UPS,维持到正常关机。

清空历史记录:histor -c(注销后重新登录,历史依然存在,即没有彻底删除)
彻底删除建议步骤:先删除配置文件,再清空内存中的历史。

重复前一个命令:
 重复前一个命令使用上方向键,并回车执行
 按 !! 并回车执行
 输入 !-1 并回车执行
 按 Ctrl+p 并回车执行

!:0 执行前一条命令(去除参数)
!n 执行history命令输出对应序号n的命令
!-n 执行history历史中倒数第n个命令

!string 重复前一个以“string”开头的命令
!?string 重复前一个包含string的命令
!$:p 打印输出 !$ (上一条命令的最后一个参数)的内容
[root@CentOS6 ~ 20:30:43]$id -u xin
500
[root@CentOS6 ~ 20:33:36]$!$:p
xin
!:p 打印输出 !(上一条命令的所有参数)的内容
[root@CentOS6 ~ 20:33:43]$ls /etc/inittab /etc/otd
ls: cannot access /etc/otd: No such file or directory
/etc/inittab
[root@!*:p
/etc/inittab /etc/otd
^string 删除上一条命令中的第一个string
^string1^string2 将上一条命令中的第一个string1替换为string2
uploading-image-660513.png

!:gs/string1/string2 将上一条命令中所有的string1都替换为 string2
示例:将文件名的小写替换成大写

ctrl -r来在命令历史中搜索命令
(reverse-i-search)`’:
Ctrl+g:从历史搜索模式退出

要重新调用前一个命令中最后一个参数
 !$ 表示
 Esc, .(点击Esc键后松开,然后点击 . 键)
 Alt+ .(按住Alt键的同时点击 . 键)

调用历史参数:
command !^ 利用上一个命令的第一个参数做cmd的参数
command !$ 利用上一个命令的最后一个参数做cmd的参数
command !* 利用上一个命令的全部参数做cmd的参数
command !:n 利用上一个命令的第n个参数做cmd的参数
command !n:^ 调用第n条命令的第一个参数
command !n:$ 调用第n条命令的最后一个参数
command !n:m 调用第n条命令的第m个参数
command !n:* 调用第n条命令的所有参数

command !string:^ 从命令历史中搜索以 string 开头的命令,并获取它的第一
个参数
command !string:$ 从命令历史中搜索以 string 开头的命令,并获取它的最后一
个参数
command !string:n 从命令历史中搜索以 string 开头的命令,并获取它的第n
个参数
command !string:* 从命令历史中搜索以 string 开头的命令,并获取它的所有
参数

help history
-c: 清空命令历史
-d offset: 删除历史中指定的第offset个命令
n: 显示最近的n条历史,默认列出所有历史
-a: 追加本次会话新执行的命令历史列表至历史文件,注意:不会产生重复追加的情况
-r: 读历史文件附加到内存历史列表,注意:会产生重复追加的情况。
示例:清空历史列表,然后从文件中追加到内存空间。
-w: 保存历史列表到指定的历史文件,默认保存在.bash_history中。
-n: 读历史文件中未读过的行到历史列表
示例:其他用户保存命令历史到配置文件中,读取配置文件的新执行的行。
-p: 展开历史参数成多行,但不存在历史列表中————执行参数中的命令,但是不保存到历史列表中。
示例:[root@CentOS6 ~ 08:24:15]$history -p hostname pwd
CentOS6.10
/root
-s: 展开历史参数成一行,附加在历史列表后————保存命令到历史列表,但不实际执行,用于伪造历史。
示例:[root@history -s "rm -rf /*"

相关变量:
 HISTSIZE:命令行记录的历史条数
 HISTFILE:指定历史文件,默认为~/.bash_history
 HISTFILESIZE:历史的配置文件记录历史的条数
 HISTTIMEFORMAT=“%F %T “ 显示时间
 HISTIGNORE=“str1:str2:… “ 忽略str1命令,str2开头的历史,表示所有,包括选项,参数
示例:只要是ls命令都不记录历史
[root@CentOS6 ~ 09:10:21]$HISTIGNORE="ls"
效果:不记录ls单条命令,但是只要是ls开头的命令都会记录,可以使用ls*不记录所有。
示例:mysql登录密码取消记录

 控制命令历史的记录方式:
环境变量:HISTCONTROL
ignoredups 默认,忽略连续、重复执行的命令,连续且相同为“重复”
ignorespace 忽略所有以空白开头的命令
ignoreboth 相当于ignoredups, ignorespace的组合
erasedups 删除重复命令

查看帮助:man bash——/HISTSIZE

掌握一种学习方法,知道如何查看帮助

环境变量设置保存:
 export 变量名="值“
 存放在 /etc/profile (全局,不建议在这加,可以在/etc/profile.d/下创建文件,文件后缀必须为.sh)或 ~/.bash_profile

bash的快捷键:
Ctrl + l 清屏,相当于clear命令
Ctrl + s 阻止屏幕输出,锁定
Ctrl + q 允许屏幕输出
Ctrl + c 终止命令
Ctrl + z 挂起命令
Ctrl + a 光标移到命令行首,相当于Home
Ctrl + e 光标移到命令行尾,相当于End
Ctrl + f 光标向右移动一个字符
Ctrl + b 光标向左移动一个字符
Alt + f 光标向右移动一个单词尾
Alt + b 光标向左移动一个单词首
Ctrl + xx 光标在命令行首和光标之间移动
Ctrl + u 从光标处删除至命令行首
Ctrl + k 从光标处删除至命令行尾
Alt + r 删除当前整行
Ctrl + w 从光标处向左删除至单词首
Alt + d 从光标处向右删除至单词尾
Ctrl + d 删除光标处的一个字符
Ctrl + h 删除光标前的一个字符
Ctrl + y 将删除的字符粘贴至光标后
Alt + c 从光标处开始向右更改为首字母大写的单词
Alt + u 从光标处开始,将右边一个单词更改为大写
Alt + l 从光标处开始,将右边一个单词更改为小写
Ctrl + t 交换光标处和之前的字符位置
Alt + t 交换光标处和之前的单词位置
Alt + N 提示输入指定字符后,重复显示该字符N次(N表示具体的数字)
注意:Alt组合快捷键经常和其它软件冲突,在Xshell(Securt类似)中需要更改:

图形终端:
Ctrl-Shift-n 创建新窗口
Ctrl-Shift-q 关闭当前窗口
Ctrl-Shift-t 创建一个标签页
Ctrl-Shift-w 关闭一个标签页
Ctrl-PaUp/PgUn 切换到下一个/前一个标签页
Ctrl-Shift-c 复制选中的文本
Ctrl-Shift-v 把文本粘帖到当前光标处

文件管理
linux目录结构:单根倒置树状结构

目录结构及其功能:
/boot:引导文件存放目录,内核文件(vmlinuz)、引导加载器(bootloader,
grub)都存放于此目录
/bin:供所有用户使用的基本命令;不能关联至独立分区,OS启动即会用到的
程序
/sbin:管理类的基本命令;不能关联至独立分区,OS启动即会用到的程序
/lib:启动时程序依赖的基本共享库文件以及内核模块文件(/lib/modules)
/lib64:专用于x86_64系统上的辅助共享库文件存放位置
/etc:配置文件目录
/home/USERNAME:普通用户家目录
/root:管理员的家目录
/media:便携式移动设备挂载点
/mnt:临时文件系统挂载点
/dev:设备文件及特殊文件存储位置
b: block device,随机访问
c: character device,线性访问
/opt:第三方应用程序的安装位置
/srv:系统上运行的服务用到的数据
/tmp:临时文件存储位置
/usr: universal shared, read-only data
bin: 保证系统拥有完整功能而提供的应用程序
sbin:
lib:32位使用
lib64:只存在64位系统
include: C程序的头文件(header files)
share:结构化独立的数据,例如doc, man等
local:第三方应用程序的安装位置
bin, sbin, lib, lib64, etc, share
/var: variable data files
cache: 应用程序缓存数据目录
lib: 应用程序状态信息数据
local:专用于为/usr/local下的应用程序存储可变数据;
lock: 锁文件
log: 日志目录及文件
opt: 专用于为/opt下的应用程序存储可变数据;
run: 运行中的进程相关数据,通常用于存储进程pid文件
spool: 应用程序数据池
tmp: 保存系统两次重启之间产生的临时数据
/proc: 用于输出内核与进程信息相关的虚拟文件系统
/sys:用于输出当前系统上硬件设备相关信息虚拟文件系统
/selinux: security enhanced Linux,selinux相关的安全策略等信息的存储位置

/misc/cd————神奇目录,自动在终端中挂载光盘,并且对于普通用户可以直接使用,避免权限不足无法挂载的情况。访问则挂载,过一会则取消。注意:如果Centos7上没有,是因为autofs服务未启动,systemctl status autofs查看当前状态。
/net:和网络相关

文件系统:
 文件名称区分大小写————linux是否区分大小写,跟文件系统有关,例如vfat不区分大小写
 以.开头的文件为隐藏文件
 路径分隔的 /
 文件有两类数据:
元数据:metadata————文件的属性
数据:data——————文件的内容

文件名规则:
文件名最长255个字节
包括路径在内文件名称最长4095个字节
文件颜色显示:跟后缀相关,由/etc/DIR_COLORS定义规则
蓝色-->目录
绿色-->可执行文件
红色-->压缩文件
浅蓝色-->链接文件
灰色-->其他文件
粉色——>socket文件

除了斜杠和NUL,所有字符都有效.但使用特殊字符的目录名和文件不推荐使用,
有些字符需要用引号来引用它们。一般用字母+数字
错误示例:touch “a b”
标准Linux文件系统(如ext4),文件名称大小写敏感。例如:
MAIL, Mail, mail, mAiL

Linux下的文件类型
-:普通文件
d: 目录文件
b: 块设备————随机访问
c: 字符设备,逻辑设备————线性访问,按顺序访问
l: 符号链接文件
p: 管道文件pipe
s: 套接字文件socket——-和网络通讯相关

CentOS 7目录变化————软链接,windows中的快捷方式
/bin 和 /usr/bin
/sbin 和 /usr/sbin
/lib 和/usr/lib
/lib64 和 /usr/lib64

显示当前工作目录——-变量PWD
每个shell和系统进程都有一个当前的工作目录
CWD:current work directory
显示当前shell CWD的绝对路径
pwd: printing working directory
-P 显示真实物理路径
-L 显示链接路径(默认)

绝对和相对路径
绝对路径
以正斜杠开始
完整的文件的位置路径

相对路径名
不以斜线开始
相对于当前工作目录
可以作为一个简短的形式指定一个文件名
常用符号:
. 当前目录
.. 父目录
将文件的完整路径切割成两部分:文件+文件的父文件夹
基名:basename————文件名本身,用于取文件名
目录名:dirname————文件所在的目录,用于取目录名

案例:如何创建-host文件?会建才会删除

更改目录
cd 改变目录
使用绝对或相对路径:
cd /home/wang/
cd home/wang
切换至父目录: cd ..
切换至当前用户主目录: cd或者cd ~(注意:~可以切换到其他用户的家目录,例如:cd ~xin)
切换至以前的工作目录: cd - (由变量OLDPWD保存原来的目录)
选项:-P
相关的环境变量:
PWD:当前目录路径
OLDPWD:上一次目录路径

列出目录内容
列出当前目录的内容或指定目录
用法:ls [options] [files_or_dirs]
顺序:ls默认是按照字母顺序显示的,其中,文件名中数字优先级高于字母。
时间:ll 默认显示的是内容修改时间
ls -a 包含隐藏文件
ls -l 长格式显示详细信息
ls -R 目录递归通过
ls -r:逆序、反转显示
ls -ld 目录和符号链接信息
ls -1 文件分行显示,按默认字母顺序显示
ls –S 按大小从大到小排序,倒序加 -r即可。
ls –t 按mtime排序
ls –u 配合-t选项,显示并按atime从新到旧排序
ls –U 按目录存放顺序显示
ls –X 按文件后缀排序
显示访问时间:ll --time=atime (在读的时候,记录访问时间即会产生写的操作,消耗磁盘IO,可禁用,提升性能)
显示状态更改时间:ll --time=ctime

注意:ls默认显示的是非隐藏文件,ls -a显示的是所有文件,包括隐藏文件;那如何仅仅显示隐藏文件?
方法一:以点开头,但是第二个不能是点,并且不进入目录
ls -d .[^.]*

方法二:ls -d .*————比第一种多.和..

方法三:l.
alias l.='ls -d .* --color=auto'
方法四:ls -I “[^.]*” -a

即:-I是忽略的意思,后面是不是以点开头的文件,即非隐藏文件,-a显示所有,组合为:在所有的文件中,忽略非隐藏文件,即显示隐藏文件

查看文件状态
stat
文件:metadata, data
三个时间戳:
access time:访问时间,atime,读取文件内容
modify time: 文件内容修改时间, mtime,改变文件内容(数据)
change time: 文件属性改变时间, ctime,元数据,即属性发生改变

文件通配符
* 匹配零个或多个字符
? 匹配任何单个字符
~ 当前用户家目录——-或cd
~mage 用户mage家目录
~+ 当前工作目录
~- 前一个工作目录,cd -可以回到上一个目录,但是无法调用,可以使用这个进行调用。
[0-9] 匹配数字范围
[a-z]:不仅是小写字母,a,A ,b,B,c,C...z
[A-Z]:不仅是大写字母,A,b,B,c,C..z,Z
[wang] 匹配列表中的任何的一个字符
[^wang] 排除列表中的所有字符

仅显示小写字母:[:lower:]:任意小写字母
仅显示大写字母:[:upper:]: 任意大写字母
预定义的字符类:man 7 glob
[:digit:]:任意数字,相当于0-9
[:lower:]:任意小写字母
[:upper:]: 任意大写字母
[:alpha:]: 任意大小写字母
[:alnum:]:任意数字或字母
[:blank:]:水平空白字符
[:space:]:水平或垂直空白字符
[:punct:]:标点符号
[:print:]:可打印字符
[:cntrl:]:控制(非打印)字符
[:graph:]:图形字符
[:xdigit:]:十六进制字符

注意:通配符主要匹配文件名,正则主要匹配文件中的内容字符串。

练习
1、显示/var目录下所有以l开头,以一个小写字母结尾,且中间出现至少一位数
字的文件或目录
ls -d /var/l[0-9][[:lower:]]
ls -d /data/l[[:digit:]][[:lower:]]
2、显示/etc目录下以任意一位数字开头,且以非数字结尾的文件或目录
ls /etc/[0-9]*[^[:digit:]]

3、显示/etc/目录下以非字母开头,后面跟了一个字母及其它任意长度任意字符
的文件或目录
ls /etc/[^[:alpha:]][[:alpha:]]
ls /etc/[^a-Z][a-Z]

4、显示/etc/目录下所有以rc开头,并后面是0-6之间的数字,其它为任意字符
的文件或目录
ls -d /etc/rc[0-6]
5、显示/etc目录下,所有以.d结尾的文件或目录
ls -d /etc/
.d
6、显示/etc目录下,所有.conf结尾,且以m,n,r,p开头的文件或目录
ls -d /etc/[mnrp].conf
7、只显示/root下的隐藏文件和目录
ls -d /root/.

8、只显示/etc下的非隐藏目录
ls -d /etc/[^.]*

touch命令:
用途 :创建空文件或者刷新时间。如果文件不存在,则创建文件。否则刷新时间(三个时间都改变)
touch [OPTION]... FILE...
-a 仅改变 atime和ctime
-m 仅改变 mtime和ctime
-t [[CC]YY]MMDDhhmm[.ss]
指定atime和mtime的时间戳
-c 如果文件不存在,则不予创建,即要求文件必须存在,为刷新时间。

补充:touch date -d "-1 day" +%F.log

cp————复制文件或目录
语法:
cp [OPTION]... [-T] SOURCE DEST
cp [OPTION]... SOURCE... DIRECTORY
cp [OPTION]... -t DIRECTORY SOURCE...
第一种语法:cp SRC DEST
SRC是文件:
如果目标不存在:新建DEST,并将SRC中内容填充至DEST中————重命名
如果目标存在:
如果DEST是文件:将SRC中的内容覆盖至DEST中————覆盖原文件
基于安全,建议为cp命令使用-i选项
如果DEST是目录:在DEST下新建与原文件同名的文件,并将SRC中内容填
充至新文件中

第二种语法:
cp SRC... DEST
SRC...:多个文件
DEST必须存在,且为目录,其它情形均会出错;

第三种语法:
cp SRC DEST
SRC是目录:此时使用选项:-r
如果DEST不存在:则创建指定目录,复制SRC目录中所有文件至DEST中;———目录重命名
如果DEST存在:
如果DEST是文件:——————————————————————报错
如果DEST是目录:——————————————————————复制到目录下,保留原目录名

默认情况下,root用户的cp命令是别名,而普通用户没有定义cp别名;所以使用普通用户cp时会直接覆盖原文件而不提示
-i:覆盖前提示 –n:不覆盖,注意两者顺序
-r, -R: 递归复制目录及内部的所有内容
-a: 归档,相当于-dR --preserv=all
-d:--no-dereference --preserv=links 不复制原文件,只复制链接名
--preserv[=ATTR_LIST]
mode: 权限
ownership: 属主属组
timestamp:
links
xattr
context
all
-p: 等同--preserv=mode,ownership,timestamp
-v: --verbose
-f: --force
-u:--update 只复制源比目标更新文件或目标不存在的文件————用于更新目标文件夹的数据;
--backup=numbered 目标存在,覆盖前先备份加数字后缀——-即覆盖之前先给目标文件夹做个备份。

练习
1、定义别名命令baketc,每天将/etc/目录下所有文件,备份到
/app独立的子目录下,并要求子目录格式为 backupYYYY-mm-dd,
备份过程可见
alias baketc="cp -av /etc/* /data/backupdate +%F"
注意:/etc/表示所有文件,复制时目标文件夹必须存在;
直接复制/etc/ 时,将原目录改名;
2、创建/app/rootdir目录,并复制/root下所有文件到该目录内,
要求保留原有权限
cp -a /root/ /app/rootdir
3.复制/root下的所有文件,包括隐藏文件,到/data下。
错误用法1:cp -a /root/
/data/,
*的缺点:只能复制非隐藏文件(在Centos7上)

猜你喜欢

转载自www.cnblogs.com/yuanhonli-xin/p/9361097.html