文件传输
ftp,sftp, vsftp, lrzsz, rcp/scp
ftp: file transfer protocal , 文件传输协议,有很多种软件实现。不具体指某种软件
sftp:secure file transfer protocal 加密文件传输协议
vsftp:very secure file transfer protocal
lrzsz : 采用Zmodem 传输协议的终端文件传输工具
yum install lrzsz -y # 安装
rz # 打开本地系统文件窗口选择并上传
sz fileName #下载文件到本地
stfp userName@hostName:/remote/path
# 在远程系统上执行各种操作
cd / ls / pwd / mv ....
# 在当前机器上执行操作直接在对应的命令前面加一个 l 就可以
lcd / lls / lpwd / lmv ....
put filePath # 上传文件本地文件到远程机器
get filePath # 下载远程服务器文件到本地
# sftp 只能执常规的文件处理命令,不能运行程序,或者系统服务等一些需要执行权限的命令
scp 快速远程复制文件
scp [options] srcFilePath targetFilePath
scp常用参数
-r : 递归复制目录
-p : 保留文件原始修改时间,访问时间等信息
-q : 安静模式,不显示进度条,警告信息
-v : 啰嗦模式 , 显示详细的信息
-C : 启用文件压缩
-l n: 显示传输带宽为n kb/s
远程登录
ssh user@host:/working/dir
ssh 免密码登录
ssh 采用非对称加密来对传输进行加密,可以在本机生成 pk-sk,将pk上传到远程服务器上就可以实现免密码登录
# 生成密钥对
ssh-keygen
# 将公钥复制到远程服务器上
ssh-copy-id [-p port] user@host
# 登录远程主机
ssh user@host
文件链接
文件连接相当于文件的快捷方式,linux 中文件连接分为 软连接和硬链接。
软连接:删除源文件导致软连接不可用,删除软连接不会删除源文件
硬链接:删除源文件硬链接任然可用,删除硬连接不会删除源文件
ln path/to/arc/file path/to/link/file # 为源文件创建一个硬链接文件
ln -s path/to/arc/file path/to/link/file # 为源文件创建一个软链接文件
ls -lh /etc/rc.local
文件链接的原理
linux文件系统中,一个文件大概可以分为三个部分 文件名,元数据[inode] 和 数据块[data],
文件名: 文件的名称,路径,对应文件Inode等等…
inode : inode
包含很多的文件元信息,但不包含文件名,例如:字节数、属主UserID
、属组GroupID
、读写执行权限、时间戳等。
而文件名存放在目录当中,但Linux
系统内部不使用文件名,而是使用inode号码
识别文件。对于系统来说文件名只是inode号码
便于识别的别称。
data: 存放文件内容
inode
也会消耗硬盘空间,所以格式化的时候,操作系统自动将硬盘分成两个区域。一个是数据区,存放文件数据;另一个是inode
区,存放inode
所包含的信息。由于这种设计,导致linux 文件存在下面几个特点:
- 由于每个分区都有自己的inode, 而 硬链接的文件名只是记录了inode编号,因此硬链接只能指向当前分区的文件,软连接指向的是 源文件的 文件名(路径), 因此软连接可以跨分区。
- 由于分区格式化的时候inode数量就已经确定了,因此,如果系统中存在大量的小文件空文件导致inode耗尽,或出现即使磁盘空间有很多的情况下任然无法创建文件的现象
- 由于系统内部是通过inode来识别文件的,而常规的mv , rm 操作只是文件名操作,所以当我们用这两个命令删除移动文件的时候,不影响已经在使用这个文件的程序。而不同的是windows中常常出现的文件被占用无法删除的现象。
# 查看系统分区的inode数
df -i
# 查看系统分区可用空间
df -h
# 查看文件的inode信息
stat fileName
# 查看目录下文件的信息,包含inode
ls -lih
# 根据文件inode搜索文件
find / -inum 234556
外置存储设备的使用
mount 与 umount
重定向与管道
-
输出重定向>,>>
cmd > targetfile # 将cmd命令的标准输出重定向到targetFile中 cmd >> targetfile # > 每次会清空源文件的内容然后写入 # >> 将内容追加到文件末尾 echo "systemctl start mysql" >> /etc/rc.local
-
输入重定向 <
cmd < targetFile # 将targetFile的内容作为cmd的输入 mysql -uroot -p123456 wesafe_west < wesafe_west.sql;
-
管道
能让你将一个命令的输出发送给另一个命令。管道能重定向一个进程的标准输出、输入和错误到另一个进程的标准输入,以便于进一步处理。
cmd1 | cmd2 # 将cmd1 的标准输出作为cmd2的标准输入 # 例如: ls -la | grep ibd
-
输出复制 tee
命令行交互输入
read [options] [hint] [var]
-a:将分裂后的字段依次存储到指定的数组中,存储的起始位置从数组的index=0开始。
-d:指定读取行的结束符号。默认结束符号为换行符。
-n:限制读取N个字符就自动结束读取,如果没有读满N个字符就按下回车或遇到换行符,则也会结束读取。
-N:严格要求读满N个字符才自动结束读取,即使中途按下了回车或遇到了换行符也不结束。其中换行符或回车算一个字符。
-p:给出提示符。
-r:禁止反斜线的转义功能。这意味着"\"会变成文本的一部分。
-s:静默模式。输入的内容不会回显在屏幕上。
-t:给出超时时间,在达到超时时间时,read退出并返回错误。也就是说不会读取任何内容,即使已经输入了一部分。
* 如果没有指定接收变量,可以使用默认的变量 $REPLY 来获取输入内容
自定义输入终止符 <<EOF
linux 输出
- 标准输出: 1
- 错误输出: 2
java -jar some.jar > some.log
java -jar some.jar 1> some.log 2>&1;
后台进程
-
&: 放在命令后面可以将命令放到后台执行
java -jar some.jar &
-
ctrl + z 挂起一个前台进程
java -jar sync.jar ctrl + z
-
jobs 查看所有后台的进程
-
fg jobid 将一个后台进程拉回到前台运行
-
bg jobid 将一个前台进程放到后台运行
注意事项
上述方法启动的后台进程在当前终端会话结束或退出之后结束运行,要解决这种问题由两种方法:
-
nohup : 表示提醒程序忽略终端的hangup信号不做任何操作。
nohup java -jar sync.jar > sync.log 2>&1 &
当用户没有自定义重定向程序输入到任何文件时,nohup 会默认把程序的输出重定向到当前目录的nohup.out文件中
-
子终端()
(java -jar sync.jar > sync.log 2>&1 &)
子终端的父进程号为1,即 init 进程,因此,运行状态只受linux系统本身的影响
文件分卷与合并
split 文件分割命用于将一个文件按照一定规则分割成多个小文件。
split [-<行数>][-b <字节>][-C <字节>][-l <行数>][要切割的文件][输出文件名]
-<行数> : 指定每多少行切成一个小文件
-a : 文件后缀的长度,默认为2
-d : 使用数字后缀
-b<字节> : 指定每多少字节切成一个小文件
-C<字节> : 与参数"-b"相似,但是在切 割时将尽量维持每行的完整性
[输出文件名] : 设置切割后文件的前置文件名, split会自动在前置文件名后再加上编号
split -b -d 10240 mysql.tar.gz mysql-volumn-
diff 文件比对命令
diff以逐行的方式,比较文本文件的异同处。如果指定要比较目录,则diff会比较目录中相同文件名的文件,但不会比较其中子目录。
diff [-abBcdefHilnNpPqrstTuvwy][-<行数>][-C <行数>][-D <巨集名称>][-I <字符或字符串>][-S <文件>][-W <宽度>][-x <文件或目录>][-X <文件>][--help][--left-column][--suppress-common-line][文件或目录1][文件或目录2]
常用参数
-B或–ignore-blank-lines 不检查空白行。
-c 显示全部内文,并标出不同之处。
-H或–speed-large-files 比较大文件时,可加快速度。
-l<字符或字符串>或–ignore-matching-lines<字符或字符串> 若两个文件在某几行有所不同,而这几行同时都包含了选项中指定的字符或字符串,则不显示这两个文件的差异。
-i或–ignore-case 不检查大小写的不同。
-q或–brief 仅显示有无差异,不显示详细的信息。
-r或–recursive 比较子目录中的文件。
-s或–report-identical-files 若没有发现任何差异,仍然显示信息。
-S<文件>或–starting-file<文件> 在比较目录时,从指定的文件开始比较。
-t或–expand-tabs 在输出时,将tab字符展开。
-T或–initial-tab 在每行前面加上tab字符以便对齐。
-u,-U<列数>或–unified=<列数> 以合并的方式来显示文件内容的不同。
-w或–ignore-all-space 忽略全部的空格字符。
-x<文件名或目录>或–exclude<文件名或目录> 不比较选项中所指定的文件或目录。
-X<文件>或–exclude-from<文件> 您可以将文件或目录类型存成文本文件,然后在=<文件>中指定此文本文件。
-y或–side-by-side 以并列的方式显示文件的异同之处。
–suppress-common-lines 在使用-y参数时,仅显示不同之处。
–left-column 在使用-y参数时,若两个文件某一行内容相同,则仅在左侧的栏位显示该行内容。
diff -y /etc/wutos/conf/public.properties public.properties
“|” 表示前后2个文件内容有不同
“<” 表示后面文件比前面文件少了1行内容
">表示后面文件比前面文件多了1行内容
linux 三剑客 sed , grep , awk
sed
sed 擅长文件内容编辑。
sed [-nihV] [-e<expression>] [-f<script文件>][文本文件]
options:
- -n :只打印模式匹配的行
- -e :直接在命令行模式上进行sed动作编辑,此为默认选项
- -f :将sed的动作写在一个文件内,用–f filename 执行filename内的sed动作
- -i :直接修改文件内容
- -h : 显示帮助
- -V: 显示版本
expression 的格式为
sed -e 'expr[function]'
expression参数
x: x为行号
x,y: 表示行号从x到y
/pattern: 查询包含模式的行
pattern/,x: 在给定行号上查询包含模式的行
x,/pattern/: 通过行号和模式查询匹配的行
x,y!: 查询不包含指定行号x和y的行
function可以有下面几种:
- a :匹配的行后新增, a 的后面可以接字串,而这些字串会在新的一行出现(目前的下一行)~
- c :取代匹配的行, c 的后面可以接字串,这些字串可以取代 n1,n2 之间的行!
- d :删除,因为是删除啊,所以 d 后面通常不接任何咚咚;
- i :匹配的行前插入, i 的后面可以接字串,而这些字串会在新的一行出现(目前的上一行);
- p :答应匹配的行,亦即将某个选择的数据印出。通常 p 会与参数 sed -n 一起运行~
- s :替换匹配的字符串,通常这个 s 的动作可以搭配正规表示法!
sed -i -e '1,4d' file # 删除第1到第4行
sed -i -e ''/haha/d' # 删除包含haha的行
sed -i -e '/package/a\//sed添加的注释' # 在包含package的行后面添加 一行 //sed添加的注释
sed -i -e '/import/i\//sed添加的注释' # 在包含import的行后面添加 一行 //sed添加的注释
sed -i -e 's/10.11.2.81/10.11.2.97/g' `grep 10.11.2.81 -rl /etc/wutos/conf`
grep
grep 擅长文件内容查找
grep [-abcEFGhHilLnqrsvVwxy][-A<显示列数>][-B<显示列数>][-C<显示列数>][-d<进行动作>][-e<范本样式>][-f<范本文件>][--help][范本样式][文件或目录...]
–color=auto,高亮显示匹配到内容;
-a 或 --text : 不要忽略二进制的数据。
-A N after,匹配到的行的后N行;
-B N before,匹配到的行的前N行;
-c 计算符合样式的列数。
-C N both,匹配到的行的前后N行;
-e <范本样式>,指定字符串做为查找文件内容的样式;
-E 支持扩展正则表达式,相当于使用"egrep";
-f<规则文件> 或 --file=<规则文件> : 指定规则文件,其内容含有一个或多个规则样式,让grep查找符合规则条件的文件内容,格式为每行一个规则样式。
-h 或 --no-filename : 在显示符合样式的那一行之前,不标示该行所属的文件名称。
-l 或 --file-with-matches : 列出文件内容符合指定的样式的文件名称。
-L 或 --files-without-match : 列出文件内容不符合指定的样式的文件名称。
-i ignorecase,忽略大小写;
-n 在显示符合样式的那一行之前,标示出该行的列数编号。
-o match-only,只输出匹配到内容;
-P 支持PERL正则表达式;
-q 静默模式,不输出结果
-r 此参数的效果和指定"-d recurse"参数相同。
-s 不显示错误信息;
-v invert,反向匹配;
-x 只显示全列符合的列。
-w 英文字符(数字+字符+下划线),匹配整个单词,如果字符串包含这个单词,则不匹配。
grep -an -A[BC] 10 "pubic final class String" String.java # 显示包含 "pubic final class String" 的行的后十行的内同和行号
grep -a -c "public" String.java # 统计包含public的行的总数
grep -a "public static class" -r[lho] java/lang/ #搜索所有包含静态类的文件
awk
awk 擅长与行内容操作
awk [options] 'BEGIN{ commands } pattern{ commands } END{ commands }'
awk 执行流程
BEGIN: 开始处理文件之前执行一次 BEGIN,常用于变量定义,复制,覆盖变量等
pattern {command} : 可以有多个, awk 每处理一行数据都会执行 能匹配上的pattern后面的command ,pattern 可以省略,没有默认对所有行执行
END: 文件处理完后执行,常用于统计
常用参数
-F fs 指定输入文件折分隔符,fs是一个字符串或者是一个正则表达式,如-F:。
-f scripfile 从脚本文件中读取awk命令。
awk常用内置变量
变量 | 描述 |
---|---|
$n | 当前记录的第n个字段,字段间由FS分隔 |
$0 | 完整的输入记录 |
FILENAME | 当前文件名 |
FNR | 各文件分别计数的行号 |
FS | 字段分隔符(默认是任何空格) |
NF | 一条记录的字段的数目 |
NR | 已经读出的记录数,就是行号,从1开始 |
OFS | 输出记录分隔符(输出换行符),输出时用指定的符号代替换行符 |
ORS | 输出记录分隔符(默认值是一个换行符) |
RS | 记录分隔符(默认是一个换行符) |
awk运算符
运算符 | 描述 |
---|---|
= += -= *= /= %= ^= **= | 赋值 |
?: | C条件表达式 |
|| | 逻辑或 |
&& | 逻辑与 |
~ 和 !~ | 匹配正则表达式和不匹配正则表达式 |
< <= > >= != == | 关系运算符 |
空格 | 连接 |
+ - | 加,减 |
* / % | 乘,除与求余 |
+ - ! | 一元加,减和逻辑非 |
^ *** | 求幂 |
++ – | 增加或减少,作为前缀或后缀 |
$ | 字段引用 |
in | 数组成员 |
awk内置函数
awk中的条件与循环
# if
if(NR == 1) print $0
if(NR == 1) { print "匹配结果:"$0 }
if(NR == 1) { ... } else { ... }
# for
for (initialisation; condition; increment/decrement) { action }
# while
while (condition) { ... }
# 循环中使用break和continue
# Exit 函数接收一个int值,表示退出状态码
# Exit 执行后会退出 终止循环并退出awk命令的执行
# 获取脚本运行的返回码
echo $?
awk使用举例
cat assist.sql | sed 's/INSERT INTO `wesafe_west`.`data_sync_assist_status`//g;' | sed 's/(//g;' | sed 's/)//g' |awk -FVALUES '{if(NR==1) { print $1;}}{print $2}' | sed 's/,/\t\t\t\t\t/g' > result.txt
xargs
xargs 可以将管道内容或者标砖输出的内容作为指定命令的参数 执行
ps -ef | grep weed | grep -v grep | awk '{print $2}' | xargs kill
/dev/null, /dev/zero, /dev/random 与 /dev/urandom
- /dev/null : 数据黑洞,任何输入到他的数据将被丢弃
- /dev/zero : 无限数据桶,能产生无限量的空数据
- /dev/random /dev/urandom : 随机数据桶,可以不断产生随机数
# 创建一个10M 的空文件
dd if=/dev/zero of=/home/placeHolder.data bs=10240 count=10
# 生成随机数
cat /dev/urandom | od -x | head -n 1