linux

 

计算机        计算器        CPU  计算
            控制器        CPU  控制指令流程执行
            主存储器    内存    进程放在内存中    硬盘        
            输入设备    其它
            输出设备    其它
总线即主板


1.位bit:
数据存储(包括计算机)的最小单位.每个二进制数字0或者1就是1个位;
字节byte:
计算机中最基本的存储单元,计算机存储能力是由字节衡量的
8个位构成一个字节;即:1 byte (字节)= 8 bit(位);
一个位节存储8位无符号数,储存的数值范围为0-255 0-ff  
java byte的取值范围是-128到+127
-80-7f
字节(Byte)=8位(bit) 
1KB( Kilobyte,千字节)=1024B  
1MB( Megabyte,兆字节)=1024KB
1GB( Gigabyte,吉字节,千兆)=1024MB  
1TB( Trillionbyte,万亿字节,太字节)=1024GB 
1PB( Petabyte,千万亿字节,拍字节)=1024TB 
1EB( Exabyte,百亿亿字节,艾字节)=1024PB 
1 ZB(Zettabyte,十万亿亿字节,泽字节)=1024EB 
1YB( Yottabyte,一亿亿亿字节,尧字节)=1024ZB 
BB( Brontobyte,千亿亿亿字节)=1024YB
存储元(Storage Unit)是存储器中最小存储单元,它的作用是用来存放一位二进制代码0或1.任何具有两个稳定状态(双稳态)的物理器件都可以来做存储元
举例 一个双稳态半导体电路或一个CMOS晶体管或磁性材料的存储元,均可以存储一个二进制代码
存储单元:多个存储元的集合
一般应具有存储数据和读写数据的功能,以8位二进制作为一个存储单元,也就是一个字节.每个单元有一个地址,是一个整数编码,可以表示为二进制整数.程序中的变量和主存储器的存储单元相对应.变量的名字对应着存储单元的地址,变量内容对应着单元所存储的数据.存储地址一般用十六进制数表示,而每一个存储器地址中又存放着一组二进制(或十六进制)表示的数,通常称为该地址的内容.存储单元的地址和地址中的内容两者是不一样的.前者是存储单元的编号,表示存储器中的一个位置,而后者表示这个位置里存放的数据.正如一个是房间号码,一个是房间里住的人一样.
存放一个机器字的存储单元,通常称为字存储单元,相应的单元地址叫字地址.而存放一个字节的单元,称为字节存储单元,相应的地址称为字节地址.如果计算机中可以编址的最小单元是字存储单元,则该计算机称为按字寻址的计算机.如果计算机中可编址的最小单位是字节,则该计算机称为按字节寻址的计算机.如果机器字长等于存储器单元的位数,一个机器字可以包含数个字节,所以一个存储单元也可以包含数个能够单独编址的字节地址.例如一个16位二进制的字存储单元可存放两个字节,可以按字地址寻址,也可以按字节地址寻址.当用字节地址寻址时,16位的存储单元占两个字节地址.


随机存储器


当内存使用率足够低满足正常运行需求时加内存是无法提高体验度的
人做菜就是cpu案板就是内存
手机RAM即运存一般是一块闪存植在主板上 电脑RAM是多块闪存植在一块PCB上组成内存条 如果容量都为1G 多块闪存组成的内存条相对于单块闪存来说速度要快很多. PC的内存条有自己的标准,主板也是,如果用手机的RAM,一块芯片植在主板上那样,就没有可扩展的空间了,不像换内存条,拔下换新的就能升级
RAM cpu缓存 内存 手机运存 
动态RAM因为电容会有电流失所以需要不断充电 一个晶体管和一个电容就可以存储一个0或者1 内存
通过电容存储的电荷保存数据

电容充满电代表1 没有就是0


静态RAM不需要不断给电容充电 利用高低电压区分0 1 通电的情况下存储的单元在数据不改变时不会消失 通过6个或者更多的晶体管存储0或者1  CPU的缓存.
ROM read only memory 只读存储器

闪存都是EEPROM

闪存之所以断电数据不会消失是因为在存储电荷的周围有绝缘层电荷可以存储很久
ROM固态硬盘 U盘 手机存储空间(手机闪存)


尺寸即对角线英寸
像素密度即一英寸多少像素点
LCD屏幕 白光 颜色是由遮挡颜色决定 所以黑色其实也是全开耗电的
LED屏幕 自发光源

图灵机 如果人在黑屋内分辨不出交流的对象是人还是机器 恰好该对象是一台机器 这台机器就是图灵机
图灵 人工智能之父
冯诺依曼 计算机之父 博弈论之父


框架 对现有组件的组合封装
linux一切皆文件(抽象成文件)    通过file拿到IO流    对设备读和写
操作系统    软件    调用-->    内核(硬件管理者)
桥接 通过使用物理机网卡 具有单独ip
NAT 把物理机作为路由器进行上网
VMWare提供三种工作模式桥接(bridge) NAT(网络地址转换)和host-only(主机模式) . 


PATH最小到目录 如果特定的文件要放入则可以利用特设目录创建链接的方式
init命令
init 0 停机或关机
init 1 单用户模式 只root用户进行维护
init 2 多用户模式 不能使用NFS
init 3 完全多用户模式(标准的运行级别)
init 4 安全模式
init 5 图形化
init 6 重启
确保selinux已经关闭

disabled
函数 计算的逻辑 计算单元

后台运行

echo "hello" > t.log 
其实也可以写成
echo "hello" 1> t.log
1指向屏幕
crontab [-uuser]file
crontab [-uuser][-e|-l]
-uaaa 设定aaa用户的crontab服务
-e 编辑某个用户的crontab文件内容
-l显示crontab文件内容

VMnet0:用于虚拟桥接网络下的虚拟交换机
VMnet1:用于虚拟Host-Only网络下的虚拟交换机
VMnet8:用于虚拟NAT网络下的虚拟交换机
VMware NetworkAdepter VMnet1:Host用于与Host-Only虚拟网络进行通信的虚拟网卡
VMware NetworkAdepter VMnet8:Host用于与NAT虚拟网络进行通信的虚拟网卡
举一个例子,假设你在教室里,连教室的路由,同学们都要装虚拟机,大家如果都选桥接模式,桥接模式就相当于虚拟出一台电脑,ip地址和你的主电脑是同一个网段的,比如你的笔记本是在教室的网段的ip是,192.168.1.10,那么你的桥接模式的虚拟机电脑可能就是192.168.1.11,共同处于同一个网段192.168.1.0,而且其他同学的电脑可以和你的虚拟机或者你的笔记本通信,因为大家都是同一个局域网下的电脑吗,虚拟机也被看成是独立的电脑了,占了该网段的一个ip,那么假设大家都选桥接模式,就会成倍占用ip地址,最多该网段只能有256-3=253个ip(一个全1的255是广播,全0是网络或者说网段地址,1是路由地址),ip地址就可能不够用,就会产生ip冲突
那么nat是什么呢,他会虚拟出一台ip不在该网段的电脑,ip地址可能是192.168.2.30,网段变成了192.168.2.0了原来是192.168.1.0,网段都不一样,不存在会占用ip,造成同一个网段下ip不够用的情况,NAT是首选也是比较推荐的一种,他是怎么访问外网呢,就是通过主电脑做代理,每次请求发给自己的主电脑,主电脑代转去请求外网
bridged:
在bridged模式下,VMWare虚拟出来的操作系统就像是局域网中的一台独立的主机,它可以访问网内任何一台机器 . 主机网卡和虚拟网卡的IP地址处于同一个网段,子网掩码 网关 DNS等参数都相同 . 
这种方式简单,直接将虚拟网卡桥接到一个物理网卡上面,和linux下一个网卡 绑定两个不同地址类似,实际上是将网卡设置为混杂模式,从而达到侦听多个IP的能力 . 在此种模式下,虚拟机内部的网卡(例如linux下的eth0)直接连到了物理网卡所在的网络上,可以想象为虚拟机和host机处于对等的地位,在网络关系上是平等的,没有谁在谁后面的问题 . 
NAT模式:
使用NAT模式可以实现在虚拟系统里访问互联网 . 就是让虚拟系统借助NAT(网络地址转换)功能,通过宿主机器所在的网络来访问公网 . 
注意:
DHCP协议:
DHCP(Dynamic Host Configuration Protocol,动态主机配置协议)是一个局域网的网络协议,使用UDP协议工作, 
主要有两个用途:给内部网络或网络服务供应商自动分配IP地址,
给用户或者内部网络管理员作为对所有计算机作中央管理的手段 . 
/etc/sysconfig/network-scripts/ifcfg-eth0

1:查看防火状态
systemctl status firewalld
service  iptables status
2:暂时关闭防火墙
systemctl stop firewalld
service  iptables stop
3:永久关闭防火墙
systemctl disable firewalld
chkconfig iptables off
4:重启防火墙
systemctl enable firewalld
service iptables restart  
5:永久关闭后重启
//暂时还没有试过
chkconfig iptables on
chkconfig 所有服务

/etc/lelinux/config
各种安全约束


虚拟机一定要用快照克隆

更改主机名(必须重启虚拟机才能生效,更改主机名需要与运维沟通因为可能牵涉到其他软件)


主机名 ip地址映射关系 外部命令

ELF可执行程序二进制编码格式

in binary 二进制

包和帮助文档
man ifconfig    学习外部命令manual

学习内部命令


外部命令在哪和帮助页在哪


file用来探测给定文件的类型
stat显示文件或文件系统的详细信息
脚本先执行解释器(可执行程序)
先启动解释器进程再解释txt文件
外部命令 (磁盘中的命令)
可执行程序
  脚本
内部命令(shell内部的命令,常驻内存)
type用来区分是不是内部命令

内核是操作系统第一个进入内存的程序
内存  内核内存
其它内存(用户空间)
主板BIOS芯片先进入内存,决定由什么引导(由什么外部设备引导(光盘,硬盘,etc))
引导分区中bootloader首段代码记录分区格式
bootloader把引导分区中的内核加载到内存
对CPU加载reset指令,分割内存为内核和用户空间
挂载根分区,继续查找sbin目录,启动init程序(第一个启动的根目录下的程序)
启动loading程序,用户输入用户名密码
bash(shell的具现)人机交互

shell(逻辑名称,具现为程序)  命令行
  GUI 图形用户界面
UTF-8  动态字符长度 汉字三个字节(减少IO)
用一个数字描述(程序)进程流  0输入流       例如:键盘,etc
  1正确的输出流
2错误的输出流
df -h  虚拟目录树(在内存中)树一样底层分区可以不同,程序也可以正常识别(解耦合)


which命令 :查看可执行文件的位置

df linux服务器文件系统磁盘的占用情况


XFS一种高性能的日志文件系统
tmpfs是一种基于内存的文件系统
devtmpfs
dev 设备
tmp 临时
fs 文件系统
devtmpfs 的功用是在 Linux 核心bai 启动早期建立一个初步的du /dev,令一般zhi启动程序不用等待 udev,缩短 GNU/Linux 的开机时间 . 
overlay
一个 overlay 文件系统包含两个文件系统,一个 upper 文件系统和一个 lower 文件系统,是一种新型的联合文件系统 . overlay是"覆盖…上面"的意思,overlay文件系统则表示一个文件系统覆盖在另一个文件系统上面 .  
sync同步
du 显示每个文件或目录磁盘使用空间 默认为k

du sh显示当前目录磁盘占用空间
umount 卸载目录
mount 挂载分区

程序只访问目录
linux内核唯一
bin(常规命令,which的一些命令,相当于win的环境变量)基本使用命令,etc 
sbin 管理系统相关的命令,超级管理员用  start ,stop,服务的命令,etc

/boot 系统引导程序所需要的文件目录
/etc 控制面板(所有配置,系统配置,启动程序)
/lib 库 共享库文件和内核模块存放目录
/dev 设备抽象成文件
/root   /home 家目录
/var 程序产生数据和日志 存放系统日志的目录
/usr 向导安装时安装的程序 用户或系统软件应用程序目录
/opt 自己安装的大厂程序 额外的应用软件包
/proc 内核的映射 功能模块 变量  操作系统运行时,进程信息和内核信息存放在这里
/mnt 临时挂载储存设备的挂载点
/tmp 临时文件目录,这个目录被当作回收站使用
mkdir

根据文件或目录名称搜索
find[搜索目录][-name或者-iname][搜索字符] -name和-iname的区别在于一个区分大小写一个不区分大小写
1 find / -name aaa 精准搜索,名字必须为aaa才能搜索的到
2 find / -iname aaa 精准搜索,名字必须为aaa或者有字母大写才能搜索的到
3 find / -name a 模糊搜索,中间有a的文件或者目录名
4 find / -name a?? 模糊搜索,?表示单个字符,即搜索到a_ _
""因为搜索的名称中可能有空格
根据文件大小搜索
find / -size +204800(100M也可以这么写)
这里+n表示大于,-n表示小于,n表示等于
n是数据块
1数据块=512字节 0.5KB
100M=102400KB=204800块
根据所有者和所属组搜索
1在home目录下查询所属组为root的文件
find /home -group root
2在home目录下查询所有者为root的文件
find /home -user root
3 -uid
4 -gid
5 -nonuser
6 -nongroup
根据时间属性搜索
find [路径][选项][时间]
选项 
-amin访问时间
-cmin文件属性被更改
-mmin文件内容被修改
时间
+n,-n,n分别表示超过n分钟,n分钟以内,n分钟
在/etc目录下查找5分钟内被修改过的属性的文件和目录
find /etc -cmin -5
根据文件类型或i节点搜索
-type根据文件类型查找
f表示文件,d表示目录,l表示软链接
查找/目录下文件类型是目录的目录
find / -type d
-inum 根据i节点查找
查找/目录下i节点为400342的文件或目录
find / -inum 400342
根据文件权限查找 -perm
-perm mode 精准匹配mode所表示的条件
组合条件搜索
1 -a表示两个条件都满足and
2 -o表示两个条件任一满足即可or
查找/目录下大于100MB同时小于200MB的文件
find/ -size +100M -a -size -200M
在文件资料中查找文件 locate
locate[文件名] -i不区分大小写
find是全盘搜索,而locate是在文件资料库中进行搜索,所以locate命令执行要比find命令执行快很多,文件资料库是不断更新的,如果新建的文件没有更新入库就会查不到 . 
updatedb (tmp目录下的文件无法入库,不在文件资料库的收录范围内)
locate aaa
搜索命令所在的目录及别名信息 which
which [命令]
which ls
搜索命令所在的目录及帮助文档路径 whereis
whereis [命令]
whereis ls
在文件中搜索字符串匹配的行并输出grep
grep -iv [指定字符串] [文件]
-i不区分大小写
-v排除指定字符串
根据用户指定的模式,对目标文件进行匹配检查,打印匹配的行
Linux下Shell重复执行上一条命令的四种方法
1 使用上方向键,并回车执行
2按!!并回车执行
3输入!-1并回车执行
4按ctrl+p并回车执行
分页显示一个文件或任何输出结果 more
more [选项] 文件
分页显示一个文件并且可以回头 less
less可以随意浏览文件,而more仅能向前移动,却不能往后移动,less在查看之前不会加载整个文件
显示前几行文件内容 head
head [参数] [参数] [文件]
-n 10显示前十行 默认十行
-n -10正常输出但不显示最后10行
显示aaa前七行内容
head -n 7 aaa
head -7 aaa
指定显示文件后多少行内容 tail
tail [参数] [参数] [文件]
-n 10显示后面十行
-f 持续刷新显示内容
显示aaa的末尾两行内容
tail -n 2 aaa
tail -2 aaa
指定从第二行开始显示
tail -n +2 aaa
ps 展示系统中正在运行的进程
-e 列出系统中所有的进程
-f 列出所有进程的状态
kill 通过信号通知进程关闭,自己停止自己(无法强制不接收信号或者卡住(没完成任务)的进程关闭)
-9直接在内存中清除进程
用户组 逻辑概念(不实际存在,相当于口头上的编号)
一个用户可以加入多个用户组
主机名


服务注册在操作系统中,用以支持各种功能的程序.

su - aaa
su aaa
带横杠会创建一个全新的环境,使用的是真实用户的设置
不带横杠还保留之前用户的设置,例如当前目录,环境变量etc
exit 或者 ctrl+d登出当前登录的用户
增删改先进行主机备份


用户 组
文件类型(一位) 用户权限 组权限 其它权限
-普通文件
d目录
b c设备文件 
c character字符型设备 键盘 显示屏 etc
b block(读任意大小没有编码集约束) 字节型设备 硬盘 etc
l 链接 链接方式
p s 无法见到
pipeline
socket
字符流:字节流上附加编码集规则
像素点  rgb三原色 0-255色深

cd - 去到上一个刚刚访问的工作目录
cd ~ 等同于 cd
touch 创建文件

参  数:
 -a或--time=atime或--time=access或--time=use  只更改存取时间 .  
 -c或--no-create  不建立任何文件 .  
 -d<时间日期>  使用指定的日期时间,而非现在的时间 .  
 -f  此参数将忽略不予处理,仅负责解决BSD版本touch指令的兼容性问题 .  
 -m或--time=mtime或--time=modify  只更改变动时间 .  
 -r<参考文件或目录>  把指定文件或目录的日期时间,统统设成和参考文件或目录的日期时间相同 .  
 -t<日期时间>  使用指定的日期时间,而非现在的时间 .  
 --help  在线帮助 .  
 --version  显示版本信息 . 
touch -t 0712250000 file1 修改一个文件或目录的时间戳 - (YYMMDDhhmm)
tab键位自动补全
cat /root/initial-setup-ks.cfg
cat 1.txt >> test.txt 
cat(concatenate使连接(连续,衔接)起来;连锁;串级)显示整个文件内容
-n显示行号
-b显示行号,不包括空格
-A显示出不可见的符号,空格,tab
more :分页显示文件内容,还支持直接跳转行等功能
more filePath
Enter:向下n行, 需要定义, 默认为1行
空格键:向下滚动一屏 或 Ctrl + F
B键 :返回上一屏 或 Ctrl+B
q:退出
less:分页显示文件内容,操作更详细,主要应用在大文件,相比于 vi 等文本编辑器,加载时间会更快
less[参数] 文件
-m :显示类似more 命令的百分比
-N :显示每行的行号
空格键:前进一页 或 page down
b :后退一页 或 page up
d :前进半页
u :后退半页
回车键 :前进一行 或使用使用方向键向下
y :后退一行 或 使用方向键向上
/字符串 :向下搜索
?字符串 :向上搜索
v :进行vim编辑器
左右方向键 :相当于水平滚动条
q :退出
tail :用于显示指定文件末尾内容,不指定文件时,作为输入信息进行处理.常用查看日志文件
tail [参数][文件]
-n<行数> :显示的行数
-f :循环读取
& 表示后台运行, 否则占用终端
ctrl+c :退出
注意:此命令很重要, 使用此命令可以动态的查看日志文件
reboot :重新启动
shutdown -h now :马上关机(断电关机)
halt :立刻关机(centos) (不断电关机)
cut:文件内容查看命令,cut命令可以从一个文本文件或者文本流中提取文本列.
参数    解释
-b    按字节选取 忽略多字节字符边界
-c     仅显示行中指定范围的字符
-d     自定义分隔符,默认为制表符
-f    与-d一起使用,指定显示哪个区域.
-n    与"-b"选项连用,不分割多字节字符;
--complement    补足被选择的字节 字符或字段;
--out-delimiter=<字段分隔符>    指定输出内容是的字段分割符;
--help    显示指令的帮助信息;
--version    显示指令的版本信息.
#显示name和age列
[root@node1 shell]# cut -d " " -f 2,3 stu.txt
-d " " :用来指定文件字段之间的分隔符,如果文件的分隔符是制表符则不需要指定该参数
-f  数字 :用来指定哪一列
--complement 选项提取指定字段之外的列(打印除了第二列之外的列)
[root@node1 shell]# cut -d " " -f 2 --complement stu.txt
N-:从第N个字节 字符 字段到结尾;
N-M:从第N个字节 字符 字段到第M个(包括M在内)字节 字符 字段;
-M:从第1个字节 字符 字段到第M个(包括M在内)字节 字符 字段.

[root@localhost ~]# a=$((29))
[root@localhost ~]# echo $a    
512
nl /export/data/shell/test.txt|head -3 获取文件前三行
查看文件内容多少字符多少行多少字节 wc

换行数 单词数 字节数
-l行数
-w单词数
-c字节数 空格 /r/n也算字节
-w    统计单词数        查看根目录下有多少个文件     [root@node1 shell]# ls / | wc -w
mv后边的目录已存在是移动 不存在是改名

cp 复制文件 其它和mv用法一样
cp -r递归复制文件夹
1. sftp
Secure Ftp(secure 安全的) 是一个基于SSH安全协议的文件传输管理工具 . 由于它是基于SSH的,会在传输过程中对用户的密码 数据等敏感信息进行加密,因此可以有效的防止用户信息在传输的过程中被窃取,比FTP有更高的安全性 . 在功能方面与FTP很类似,不仅可以传输文件数据,而且可以进行远程的文件管理(如建立,删除,查看文件列表等操作) . Sftp与ftp虽然只有一字之差,但基于的传输协议却是不同的 . 因此不能用sftp client去连接ftp server 也不能用 ftp client 去连接 sftp server .  
简单的命令如下
建立连接:sftp user@host
从本地上传文件:put localpath
下载文件:get remotepath
切换远程目录:cd
显示远程工作目录:pwd
建立远程目录:mkdir
与远程相对应的本地操作,只需要在命令前加上"l" 即可,方便好记 . 
如:lcd l pwd l mkdir
2. scp
SCP :secure copy (remote file copy program) 也是一个基于SSH安全协议的文件传输命令 . 与sftp不同的是,它只提供主机间的文件传输功能,没有文件管理的功能 . 
简单的命令如下
复制local_file 到远程目录remote_folder下
scp local_file remote_user@host:remote_folder
复制local_folder 到远程remote_folder(需要加参数 -r 递归)
scp –r local_folder remote_user@host:remote_folder
以上命令反过来写就是远程复制到本地
3. scp sftp区别
SCP比较简单,是轻量级的,SFTP的功能则比较多+
SFTP在文件传输过程中中断的话,连接后还可以继续传输,但SCP不行
4. sz/rz
sz/rz 是基于ZModem传输协议的命令 . 对传输的数据会进行核查,并且有很好的传输性能 . 使用起来更是非常方便,但前提是window端需要有能够支持ZModem的telnet或者SSH客户端,例如secureCRT . 
首先需要在secureCRT中可以配置相关的本地下载和上传目录,然后用rz sz命令即可方便的传输文件数据 . 
下载数据到本地下载目录:sz filename1 filename2 …
上传数据到远程:执行rz –be 命令,客户端会弹出上传窗口,用户自行选择(可多选)要上传的文件即可 . 
sz    命令,保存文件到windows
rz  命令,会弹出窗口,选择要上传的文件
tar
tar 后缀 参数1 [参数2]

f 结果文件路径
z 执行gzip模式
参数1 结果压缩包的路径
参数2 在c模式下是压缩的文件 多个文件用空格分开
x模式下指定目录用-C
windows习惯用
rar 压缩率低 速度块
zip压缩率可以 速度可以
7z(7zip) 压缩率高 速度慢
mac习惯用
zip
xz
tar
dmg
pkg
linux习惯用
tar
gzip
man 命令行命令使用说明书
添加用户

只有root有访问其它用户的权限


深度创建

同时创建多个目录

-f force强制
-r 清楚是什么

查看使用过的命令
/boot内核
链接(修改一个全部变化,删除仅仅删除引用名,底层物理文件不会发生变化)
 硬链接


     软链接


1 软链接又叫符号链接,这个文件包含了另一个文件的路径名 . 可以是任意的文件或目录,可以链接不同系统的文件 . 
硬链接是一个文件的一个或多个文件名 . 把文件名和计算机系统使用的节点链接起来 . 因此我们可以用多个文件名与一个文件进行链接 . 
2硬链接只能对已存在的文件进行创建,不能交叉文件系统进行硬链接的创建
 软链接可对不存在的文件或目录创建软链接,可交叉文件系统
3软链接 --------------------------A 以相对路径创建软链接,移动软链接就会失效
 硬链接 三A
引用数量
-i物理磁盘索引号
元数据(属性)
stat 统计 元数据

Inode物理地址
IO Block 一次IO读

访问权限

访问时间

变化时间
Change 元数据发生变化(权限,etc)
Modify 内容修改
修改文件都会变化因为修改文件也修改了元文件(文件大小,访问时间,修改时间,etc)

脚本touch循环元数据时间变化触发安全机制

分屏显示
more 空格下一屏 b回页
clear 清屏
ctrl+l

|管道 将前面命令的输出交给后边命令的输入(尽量放有输入的命令)

args一般指命令行输入的参数
xargs
给命令传递参数的过滤器,也是组合多个命令的一个工具
xargs可以将管道(处理管道传递的stdin,将stdin传递到正确的位置上)或标准输入(stdin 一般指键盘输入到缓冲区里的东西)数据转换成命令行参数,也能从文件的输出中读取数据
xargs也可以将单行或者多行文本输入转换为其它形式,例如多行变单行,单行变多行
xargs默认命令是echo,这意味着通过管道传递给xargs的输入将会包含换行或空白,不过通过xargs的处理,换行或空白将被空格取代
xargs处理优先级与顺序 先分割,再分批,然后传递到参数位
echo '--help' | xargs cat 等价于 cat --help ,就是xargs将其接受的字符串 --help 做成cat的一个命令参数来运行cat命令,同样  echo 'test.c test.cpp' | xargs cat 等价于 cat test.c test.cpp 此时会将test.c和test.cpp的内容都显示出来 . 
find / -cmin -5 | xargs ls -li
xargs stdin [参数]

管道是Linux中很重要的一种通信方式,是把一个程序的输出直接连接到另一个程序的输入,常说的管道多是指无名管道,无名管道只能用于具有亲缘关系的进程之间,这是它与有名管道的最大区别 . 
有名管道叫named pipe或者FIFO(先进先出),可以用函数mkfifo()创建 . 
在Linux中,管道是一种使用非常频繁的通信机制 . 从本质上说,管道也是一种文件,但它又和一般的文件有所不同,管道可以克服使用文件进行通信的两个问题,具体表现为:
限制管道的大小 . 实际上,管道是一个固定大小的缓冲区 . 在Linux中,该缓冲区的大小为1页,即4K字节,使得它的大小不象文件那样不加检验地增长 . 使用单个固定缓冲区也会带来问题,比如在写管道时可能变满,当这种情况发生时,随后对管道的write()调用将默认地被阻塞,等待某些数据被读取,以便腾出足够的空间供write()调用写 . 
读取进程也可能工作得比写进程快 . 当所有当前进程数据已被读取时,管道变空 . 当这种情况发生时,一个随后的read()调用将默认地被阻塞,等待某些数据被写入,这解决了read()调用返回文件结束的问题 . 
注意:从管道读数据是一次性操作,数据一旦被读,它就从管道中被抛弃,释放空间以便写更多的数据 . 
在 Linux 中,管道的实现并没有使用专门的数据结构,而是借助了文件系统的file结构和VFS的索引节点inode . 通过将两个 file 结构指向同一个临时的 VFS 索引节点,而这个 VFS 索引节点又指向一个物理页面而实现的
管道实现的源代码在fs/pipe.c中,在pipe.c中有很多函数,其中有两个函数比较重要,即管道读函数pipe_read()和管道写函数pipe_wrtie() . 管道写函数通过将字节复制到 VFS 索引节点指向的物理内存而写入数据,而管道读函数则通过复制物理内存中的字节而读出数据 . 当然,内核必须利用一定的机制同步对管道的访问,为此,内核使用了锁 等待队列和信号 . 
当写进程向管道中写入时,它利用标准的库函数write(),系统根据库函数传递的文件描述符,可找到该文件的 file 结构 . file 结构中指定了用来进行写操作的函数(即写入函数)地址,于是,内核调用该函数完成写操作 . 写入函数在向内存中写入数据之前,必须首先检查 VFS 索引节点中的信息,同时满足如下条件时,才能进行实际的内存复制工作:
1.内存中有足够的空间可容纳所有要写入的数据;
2.内存没有被读程序锁定 . 
如果同时满足上述条件,写入函数首先锁定内存,然后从写进程的地址空间中复制数据到内存 . 否则,写入进程就休眠在 VFS 索引节点的等待队列中,接下来,内核将调用调度程序,而调度程序会选择其他进程运行 . 写入进程实际处于可中断的等待状态,当内存中有足够的空间可以容纳写入数据,或内存被解锁时,读取进程会唤醒写入进程,这时,写入进程将接收到信号 . 当数据写入内存之后,内存被解锁,而所有休眠在索引节点的读取进程会被唤醒 . 
管道的读取过程和写入过程类似 . 但是,进程可以在没有数据或内存被锁定时立即返回错误信息,而不是阻塞该进程,这依赖于文件或管道的打开模式 . 反之,进程可以休眠在索引节点的等待队列中等待写入进程写入数据 . 当所有的进程完成了管道操作之后,管道的索引节点被丢弃,而共享数据页也被释放 . 
Linux 管道对阻塞之前一次写操作的大小有限制 .  专门为每个管道所使用的内核级缓冲区确切为 4096 字节 .  除非阅读器清空管道,否则一次超过 4K 的写操作将被阻塞 .  实际上这算不上什么限制,因为读和写操作是在不同的线程中实现的 . 

文件描述符


posix可移植操作系统接口

PCB

UNIX中一切都是文件,磁盘等设备在操作系统看来都是文件 . 对文件进行操作时,需要打开这个文件获得文件描述符(file descriptor, fd) . 而每个进程生来就有三个文件描述符绑定在它们身上 . 分别指向标准输入 标准输出和标准错误 . 
对于应用层来说,stdin / stdout / stderr 实际上就是在程序开始运行时被默认打开的文件而已,跟你自己用 fopen()/open() 去打开一个文件没有区别,而有区别的地方在于——无论是 tty0 ~ tty6 也好,还是 /pts/0 等等也好,它们不是普通的文件,而是设备文件—— Linux 宣称一切皆文件,因为在底层上 Linux 把文件和设备统一起来用 inode 来管理 . 

为什么ls接收不了管道
管道沟通的是标准IO流,ls命令接受的路径是命令行参数
注意区分命令行参数(术语不一定标准)和标准输入 . 
ls期待的是命令行参数,即main()的`argv`;
而管道传给ls的是标准输入,和`argv`没有关系 . 
vim编辑文件的命令是vim file,但是如果从stdin读入编辑内容的话就需要使用echo aaaaaa | vim -
在vim后面加上一个参数告诉vim改从stdin读入内容
管道命令能够将一个命令的执行结果经过筛选,只保留我们需要的信息 . 
cut,grep,sort,uniq,wc,tee,join,split

                        


直接到最后一行
shift +g


数字加上下箭头快速上下跳转数字行

:/xxxx 
:1,22 y
:4,$-1

g global

-v反显
grep -v xxx yyy 不包含xxx的行
证明

代表空到任意多字符

?一个任意字符
regular expression正则表达式

[223232]单字符匹配
[^12] ^取反不能有1 ,2
\<,\>\找单词边界
\ \找到abc这个单词
(,)框成一个元素(操作符,字符串)
\n n是数字 引用(,)元素

重复操作符是让前面匹配操作符重复
{1}必须一次
grep只关心黑色的基本正则表达式 ,前面加\红色扩展正则表达式
grep -E 默认扩展正则表达式


显示只匹配ooxx这个单词的行

cut显示切割的行数据

-s隐藏脏数据(没有分隔符的行)
-f显示第几列
-d’ ’指定分隔符

排序 字典序 ASCII
 数值序 正常排序
sort(默认字典序)排序文件的行 从左向右逐个字符比较,已确定排序,便不继续读

sort -u /export/data/shell/ 去重排序
sort -n -r sort_demo2.txt    
-t    field-separator    指定字段分隔符
-k    key    根据那一列排序
sort -t ' ' -k 2 -n -r /export/data/shell/
sort -t ' ' -k 2 -n -r /export/data/shell/|uniq -c

设置多ip
wc


最长行多长
单词


awk grep sed是linux文本三剑客,三者的功能都是处理文本,但侧重点各不相同,其中awk功能最强大,但也最复杂.grep更适合单纯的查找或匹配文本,sed更适合编辑匹配到的文本,awk更适合格式化文本,对文本进行较复杂格式处理
sed:行编辑器(像vi末行模式)

默认显示全部内容
-f读文件中的命令并执行


address默认全部行
1,8
/ooxx/
/正则/


并没有删除


init进程读取该文件根据该文件最后配置决定由什么形式启动操作系统
0关机
1单用户模式,安全模式
3命令行界面
5图形界面
6重启


文本分析工具,默认按空格和tab分段 
将文件逐行读入,以空格为默认分隔符按行切片,再分析
awk [-F field-separator] 'commands' input-file(s) 

awk -F|-f|-v 'BEGIN{ } / / {comand1;comand2} END{ }' file
-F 定义列分隔符
-f 指定调用脚本
-v 定义变量
' '引用代码块,awk执行语句必须包含在内
BEGIN{ } 初始化代码块,在对每一行进行处理之前,初始化代码,主要是引用全局变量,设置FS分隔符
{ } 命令代码块,包含一条或多条命令
// 用来定义需要匹配的模式(字符串或者正则表达式),对满足匹配模式的行进行上条代码块的操作
END{ }  结尾代码块,在对每一行进行处理之后再执行的代码块,主要是进行最终计算或输出结尾摘要信息
awk -F ' ' '/1/{OFS="#"}{print $1,$2,$3}' /export/data/shell/
awk -F ' ' '$2 ~ /1/' /export/data/shell/
在test_awk2.txt中如果匹配到aaa就打印第1,3段,如果匹配到ccc,就打印第1,3,4
awk -F ':' '/aaa/ {print $1,$3} /ccc/ {print $1,$3,$4}'  test_awk2.txt
awk -F ':' '$1=="ccc" && $2==666 {print $0}' test_awk2.txt
awk -F ':' '$3<$4 {print $0}' test_awk2.txt 
ll | awk 'BEGIN{total=0}{total=total+$5} END{print(total)}'
NR处理行行数
NF切割了多少列
awk -F ' ' 'BEGIN{total=0}{total+=$2}END{print total}' /export/data/shell/test.txt
740
awk 'BEGIN{ for(i=1;i<=9;i++){ for(j=1;j<=i;j++){ printf("%dx%d=%d%s", i, j, ij, "\t" ) } printf("\n") } }' 
awk 'BEGIN{ for(i=1;i<=9;i++){ for(j=1;j<=i;j++){ printf("%6.2fx%d=%d%s", i, j, ij, "\t" ) } print("\n") } }'
99乘法表
printf根据格式打印输出

用户信息
bash交互接口

仅约束后面一个函数

useradd 只能root使用
passwd 普通用户只能修改自己的密码
       root用户可以修改别人的密码
userdel

用户id,组id,一个用户可以好几个组


exit

-a append
chown change owner修改用户,组

chmod change model修改权限
u user
g group
o other
+-r读
+-w写
+-x执行
mv 需要源文件有读权限,源文件父目录有可执行权限,目标目录写权限

常用权限
linux系统内有档案有三种身份 u:拥有者  g:群组   o:其他人
这些身份对于文档常用的有下面权限:
r:读权限,用户可以读取文档的内容,如用cat,more查看
w:写权限,用户可以编辑文档
x:该目录具有可以被系统执行的权限
其他权限
除了读写执行权限外系统还支持强制位(s权限)和粘滞位(t权限)
s权限
s权限:设置使文件在执行阶段具有文件所有者的权限,相当于临时拥有文件所有者的身份. 典型的文件是passwd. 如果一般用户执行该文件, 则在执行过程中, 该文件可以获得root权限, 从而可以更改用户的密码.
ls -al /usr/bin/passwd
-rwsr-xr-x 1 pythontab pythontab 32988 2018-03-16 14:25 /usr/bin/passwd
我们可以通过字符模式设置s权限:chmod a+s filename,也可以使用绝对模式进行设置:
设置suid:将相应的权限位之前的那一位设置为4;
设置guid:将相应的权限位之前的那一位设置为2;
两者都置位:将相应的权限位之前的那一位设置为4+2=6 . 
注意:在设置s权限时文件属主 属组必须先设置相应的x权限,否则s权限并不能正真生效(c h m o d命令不进行必要的完整性检查,即使不设置x权限就设置s权限,chmod也不会报错,当我们ls -l时看到rwS,大写S说明s权限未生效)
t权限
t权限:要删除一个文档,您不一定要有这个文档的写权限,但您一定要有这个文档的上级目录的写权限 . 也就是说,您即使没有一个文档的写权限,但您有这个文档的上级目录的写权限,您也能够把这个文档给删除,而假如没有一个目录的写权限,也就不能在这个目录下创建文档 . 
怎样才能使一个目录既能够让任何用户写入文档,又不让用户删除这个目录下他人的文档,t权限就是能起到这个作用 . t权限一般只用在目录上,用在文档上起不到什么作用 . 
在一个目录上设了t权限位后,(如/home,权限为1777)任何的用户都能够在这个目录下创建文档,但只能删除自己创建的文档(root除外),这就对任何用户能写的目录下的用户文档 启到了保护的作用 . 
可以通过chmod +t filename 来设置t权限
在这再总结一下
s或S(SUID,Set UID):
可执行的文件搭配这个权限,便能得到特权,任意存取该文件的所有者能使用的全部系统资源 . 请注意具备SUID权限的文件,黑客经常利用这种权限,以SUID配上root帐号拥有者,无声无息地在系统中开扇后门,供日后进出使用 . 
T或T(Sticky):
/tmp和 /var/tmp目录供所有用户暂时存取文件,亦即每位用户皆拥有完整的权限进入该目录,去浏览 删除和移动文件 . 

rwx 4 2 1


-R递归持有者持有组刷新

将用户添加进组
 


maven也是仓库

tar

安装:编译完能用的东西拷贝到指定安装目录
nginx默认端口号80
tomcat 8080
-devel development
README.txt   /install
rpm redhat package manage 
内核每个系统只有一个,不同的内核接口不同,导致进程调用不同系统不兼容

rpm-i 安装
rpm -e 卸载

包名称

alt+e  e 粘贴选择的内容

包向系统释放哪些文件

jps java process status 查看所有java进程状态


跳出vi
alt+e c 回车 a p

bash重新加载文件
source /etc/profile
./java 强制在当前目录搜索执行,当前路径没有就没有
系统内内置的链接都是相对路径

rpm管理

-qf 逆向查询
系统中有数据库记录包和文件的映射关系
apache下
tomcat容器动态网站处理,服务器 
httpd  静态网站
yum底层为rpm(计算发生在客户端)
仓库  rpm包元数据文件
      所有rpm包
客户端先把仓库元数据文件下载到本地,再根据它推算出需要的rpm包和依赖
      目录
      ftp
      静态webserver ,etc

仓库位置
一台机器可以指向多个仓库(仓库名字唯一)


mirrors.163.com
mirrors.aliyun.com
yum makecache yum更新元数据到本机

显示所有库


倾向于光盘优盘

dvd1 dvd2 两个是一个完整安装源
倾向于安装

 iso镜像加载到光盘中才行

仓库

D光标所在位置删到行尾 d$
dgg删除上面行
dG删除下面行

//属于前面 /属于后面

清除上一个源包的缓存

从数据源拷贝元数据到yum工作目录


显示仓库,仓库有多少包

ooxx本地文件仓库
DVD容量4G上限所以用两张光盘
repo repository 存储库(包,元数据)
yum update
将本地包全部升级
yum list
显示安装的包和仓库中的可拥包
yum search
搜索要安装的包是否存在
yum info
查询目标包的信息

erase 擦除卸载的更干净

yum组安装
" "识别空格要加""
openjdk  
HotSpot  oracle jdk

base库倾向于企业6000多个包(软件)
epel 10000多个
kernel 内核

是什么 为什么 怎么用


$USER 当前用户

变量    解释
$#    命令行参数的个数
$n        $1表示第一个参数,$2表示第二个参数,以此类推
$0        当前程序的名称
$?        前一个命令或函数的返回码
$        以"参数1 参数2 ..."形式保存所有参数
$@        以"参数1""参数2"...形式保存所有参数
$$        本程序的(进程ID号)PID
$!        上一个命令的PID
$ 与 $@ 区别:
相同点:都是引用所有参数.
不同点:只有在双引号中体现出来.假设在脚本运行时写了三个参数 1 2 3,,则 "  " 等价于 "1 2 3"(传递了一个参数),而 "@" 等价于 "1" "2""3"(传递了三个参数).
echo ${aaa:2:100}
echo ${#aaa}
计算字串长度    expr length "this is a test"
抓取子串     expr substr "this is a test" 3 5
抓取子串在字符串中出现最早的位置    expr index "hsfdjkasdhfjka" jdh
命令前加sudo 拥有root权限
Evaluate expressions 表达式求值

该命令只能精度在整数 向下取整
先解释后执行(启动)
交互输入 在交互界面交互输入
echo打印


expr 计算
$取变量的值
$$当前人机交互的bash程序进程id号
process 进程

ps 定义

-ef

-aux


top定义

PR小则被优先执行

source 文件 解释并执行bash交互的文本文件


. 和 source是一个东西
内部命令
pstree

exit 退出当前bash
ctrl + d
bash是一个进程(程序)
shell bash etc
进程  current进程
      子进程(子shell执行)

启动子进程时读取文本文件执行命令,执行完退出回到父进程
相当于命令行执行解释器
java 函数 = 方法
脚本 一切皆命令

命令    shell builtin
        人为定义的函数
        磁盘某目录的可执行文件

进程文件

变量,定义,功能模块

fd field descripter文件描述符

多用户,每个用户shell独立
tcp连接后将标签页模拟成虚拟终端设备
重定向 修改程序的输入输出流方向(不是命令)


java exec() 用于正则表达式匹配

g全局

生成6号文件描述符占位输出流1缓存

将输出流输出到1终端

重新用1号文件描述符占用原6占用的输出流缓存

1 ls-l的1号文件标准描述符
> 重定向操作符
1>之间必须一起写(bash对空格敏感)
>> 追加重定向操作符

错误输出

>前面可以省略不写默认是1

程序先报错后正确输出
2文件描述符优先级>1
如果重定向操作符右边是一个数字且这个数字也是一个重定向描述符则前边必须加&(前边" "可有可无)

从左向右依次执行,没执行到的不算数,按执行位置绑定 
因为2先指向1而此时1指向文件还没有生效

特殊写法,将21流合起来写在文件中


一行字符串


多行文本
read遇到回车(换行符)结束自己
read换行符敏感所以只读一行,流里是多行文本
读取用户输入给变量赋值
任何程序都有012


等同

等同


<将文件内容放在输入流里
文件描述符是命令的附加品,不是命令

输入输出      socket tcp连接
请求头                                  响应头 响应体
GET POST UPDATE DELETE PUT

IO重定向
/是相对URI
变量

名字=值

${1} 第一个参数


子bash | 子bash
先左后右,两个bash IO相通

$$ 优先级高于 | 管道
父进程和子进程是两个独立的进程
echo $?
0 成功
非0 失败

set

休眠20s

&后台运行
环境变量导出而非共享任一方修改对方不会发生变化
写时复制
子进程仅仅得到父进程环境变量的地址
在父进程更改环境变量的时候重新开辟地址空间,修改变量的进程变量指向新地址空间
物理地址映射到进程虚拟地址
物理地址空间映射到虚拟地址空间
xmx=1024m
 jvm堆空间大小1G
java虚拟地址是c底层虚拟地址映射的虚拟地址
引用 ""或’’ 作为一个元素
‘’里面东西不做任何操作
""里面变量扩展

"\"" 转译
{}扩展不能放在引号中

` `  $() 引用命令 命令扩展 支持嵌套
扩展 把变量或命令替换为扩展结果

表达式   算数表达式 help let
         
         条件表达式 help test
         返回boolean
         判断字符串
         
         判断数字
         
         
         [ 是命令必须写空白符
         判断文件
         
转义字符

虚空内存
. 脚本 命令行执行脚本 #!/bin/bash 不识别
./脚本 默认子bash执行


a | (b && exit)只退出|产生的右子bash

help if

help for

help while


软件工程学 不闭门造车
打印出最大文件

多个分隔符中间不加空格分开

(())计算

如果不写export 子shell中的num是自己创建的
因为管道是子shell所以父shell num不变
可以写读文件解决这一问题
 

你可能感兴趣的:(linux,linux)