Linux基础
文件管理
ls
ls -a 显示隐藏文件
ls -l 显示文件信息
ls -lh 文件大小方便读
ls- lsrt t按时间排序 r反向显示 s按文件大小排序
pwd
显示当前文件夹路径
cd - 回到上一目录
/ 根目录
~用户的home目录
cp 复制
cp 原文件名 要复制的文件名
cp -r 复制目录
mv移动
mv 原 新目录
rm 删除
rm -r 删除目录
rm -v 显示删除的文件
rm -f 强制删除
ln 硬链接和软链接
作用:为某一个文件或目录在另外一个位置建立一个同步的链接
硬链接(只能对文件使用)
两个目录指向同一个文件,删除任何一个,真正的文件都不会被删除,把硬链接都删除,文件才会删除
ln
修改其中一个,其他的也会修改
软链接
ln -s 源文件 目标文件
记录文件的路径
源文件名字改变或删除,软链接失效
ln -f
df =disk free查看磁盘空间
du=disk usage
默认显示全部的占用情况
du sh * 显示下一级目录
find 按照时间/类型/名称查找文件(可加其他命令)
基本形式
find path -option [ -print ] [ -exec -ok command ] {} \
参数
- pathname: find命令所查找的目录路径。例如用.来表示当前目录,用/来表示系统根目录。
- -print: find命令将匹配的文件输出到标准输出。
- -exec: find命令对匹配的文件执行该参数所给出的shell命令。相应命令的形式为’command’ { } ;,注意{ }和\;之间的空格。
- -ok: 和-exec的作用相同,只不过以一种更为安全的模式来执行该参数所给出的shell命令,在执行每一个命令之前,都会给出提示,让用户来确定是否执行。
option
选项 | 说明 |
---|---|
-name filename | #查找名为filename的文件 |
-perm | #按执行权限来查找 |
-user username | #按文件属主来查找 |
-group groupname | #按组来查找 |
-mtime -n +n | #按文件更改时间来查找文件,-n指n天以内,+n指n天以前 |
-atime -n +n | #按文件访问时间来查 |
-ctime -n +n | #按文件创建时间来查找文件,-n指n天以内,+n指n天以前 |
-nogroup | #查无有效属组的文件,即文件的属组在/etc/groups中不存在 |
-nouser | #查无有效属主的文件,即文件的属主在/etc/passwd中不存在 |
-ctime -n +n | #按文件创建时间来查找文件,-n指n天以内,+n指n天以前 |
-nogroup | #查无有效属组的文件,即文件的属组在/etc/groups中不存在 |
-newer f1 !f2 | #查更改时间比f1新但比f2旧的文件 |
-type b/d/c/p/l/f | #查是块设备、目录、字符设备、管道、符号链接、普通文件 |
-size n[c] | #查长度为n块[或n字节]的文件 |
-depth | #使查找在进入子目录前先行查找完本目录 |
-fstype | #查位于某一类型文件系统中的文件,这些文件系统类型通常可 在/etc/fstab中找到 |
-mount | #查文件时不跨越文件系统mount点 |
-follow | #如果遇到符号链接文件,就跟踪链接所指的文件 |
-cpio | #对匹配的文件使用cpio命令,将他们备份到磁带设备中 |
-prune | #忽略某个目录 |
find . -name "*.xml"
find 目录 -atime修改时间 +3 -type f
(找修改时间在3天以前的文件)
whereis+ 命令
查看可执行文件的路径
which
权限管理
- Group / gid
- User / uid
- root
权限:文件拥有者+group用户+所有用户
三个比特位:r(read)+w(write)+x(execute)
r=4 w=2 x=1 (rwx=7 r-x=5 r–=4)
-rwxrw-r‐-1 root root 1213 Feb 2 09:39 abc
- 第一个字符代表文件(-)、目录(d),链接(l)
- 1表示链接的文件数
目录的权限
r (列出文件夹中的文件)
w (在文件夹中删除、添加或重命名文件(夹))
x (cd到文件夹)
改变权限
chmod
改变文件或目录的权限
| chmod | u/g/o/a | +(add)/-(remove)/=(set) | r/w/x | 文件名或目录名
chmod 755 abc:赋予abc权限rwxr-xr-x
chmod u=rwx,g=rx,o=rx abc:同上u=用户权限,g=组权限,o=不同组其他用户权限
chmod u-x,g+w abc:给abc去除用户执行的权限,增加组写的权限
chmod a+r abc:给所有用户添加读的权限
chown
改变所有者
chown mengmeng abc
chown mengmeng ./abc 改变目录的所有者
chown -R root ./abc 改变目录及其下级所有文件和目录的所有者
chgrp
改变文件的用户组
chgrp root abc
usermod
改变用户所在组
usermod -g 组名 用户名
suid sgid sticky
su = switch user
sudo -u 用户 命令
文本操作
cat
输出文件
head 大文件输出
tail
tail -f 文件在不断写并显示出来
more/less shift +g ctrl+u ctrl+d
grep
查找文件中符合pattern的内容
grep [option] 'pattern' filename
options
-A : num, --after-context=num 打印每次匹配项后的num行
-B : num, --before-context=num 打印每次匹配项前的num行
-c : 计算匹配项出现的次数
-n : 输出行号
-v : 反向选择 显示没有匹配项的行
-H : 显示文件头
-i : 不敏感的匹配,忽略大小写
-o : 只输出匹配的内容(默认输出匹配内容的行)
–color : 高亮关键字
sort
+ 文件名 按字典序排序
-m : 合并多个已排序的文件
-o output : 把输出打印到output文件中
-b :在比较行时忽略空白字符
-n :按数值大小排序
-r : 反向排序
uniq
输出或者忽略文件中的重复行 (默认折叠连续重复的行,非连续的不会)
基本形式
uniq [-cdu][-f<栏位>][-s<字符位置>][-w<字符位置>][--help][--version][输入文件][输出文件]
option
- -c或–count 在每列旁边显示该行重复出现的次数。
- -d或–repeated 仅显示重复出现的行列。
- -f<栏位>或–skip-fields=<栏位> 忽略比较指定的栏位。
- -s<字符位置>或–skip-chars=<字符位置> 忽略比较指定的字符。
- -u或–unique 仅显示出一次的行列。
- -w<字符位置>或–check-chars=<字符位置> 指定要比较的字符。
- –help 显示帮助。
- –version 显示版本信息。
- [输入文件] 指定已排序好的文本文件。如果不指定此项,则从标准读取数据;
- [输出文件] 指定输出的文件。如果不指定此选项,则将内容显示到标准输出设备(显示终端)。
sort xxx | uniq -c
wc
统计
-l 行数
-w 单词数
-c 字节数 不能与-m同时使用
-m 字符数 如果前面有-c就会被取消,如果没有多个字节表示的字符,等同于-c
cut
文件内容查看
语法
cut(选项)(参数)
option
- -b:仅显示行中指定直接范围的内容;
- -c:仅显示行中指定范围的字符;
- -d:指定字段的分隔符,默认的字段分隔符为“TAB”;
- -f:显示指定字段的内容;
- -n:与“-b”选项连用,不分割多字节字符;
- –complement:补足被选择的字节、字符或字段;
- –out-delimiter=<字段分隔符>:指定输出内容是的字段分割符;
gawk 引用网址
基本形式
gawk [ POSIX or GNU style options ] -f program-file [ -- ] file ...
gawk [ POSIX or GNU style options ] [ -- ] program-text file ...
option
选项 | 描述 |
---|---|
-F fs | 指定描绘一行中数据字段的文件分隔符 gawk -F: '{print $1}'/etc/passwd |
-f file | 指定读取程序的文件名 |
-v var=value | 定义gawk程序中使用的变量和默认值 |
-mf N | 指定数据文件中要处理的字段的最大数目 |
-mr N | 指定数据文件中的最大记录大小 |
-W keyword | 指定gawk的兼容模式或警告级别 |
gawk将下面的变量分配给在文本行中检测到的每个数据字段:
- $0表示整行文本
- $1表示文本行中的第一个数据字段
- $2表示文本行中的第二个数据字段
- $n表示文本行中的第n个数据字段
gawk 'BEGIN {print "Hello World!"} {print$0} END {print "byebye"}'
BEGIN关键字是在处理任何数据之前应用的命令,即执行该gawk命令行时首先会去执行BEGIN所指定的命令,这里是print “HelloWorld!”,接下去{print $0}是我们输入的数据,输入之后回车会立刻显示相应的内容,也就是我们输入的内容,直到按ctrl-D,然后该gawk命令接结束了,但是结束之后还要之END后的结尾命令{print “byebye”}。这样整个过程就结束了。
vim
dd删除一行
u撤销
/+文本 查找对应的文本 n下一个匹配 N上一个匹配
打包与压缩
tar
gzip
z gzip压缩
c 做压缩
v输出信息
f 文件已存在会覆盖
t 打开打包文件,不解压
x 解压
zcat / zgrep /zmore /zless
http请求与传输
curl
命令 | 解释 |
---|---|
-X | 指定request的method |
-H | 设置请求的header |
-d | 指定post请求的消息体 |
-b | 指定请求的cookie |
-c | 输出响应的set-cookie内容到文件 |
-i | 输出response的header信息 |
wget
下载文件
网络常用工具命令
ping
ping -c 3 -W 1 -q www.baidu.com
ping三次 超时时间1秒 静默输出
host
ip解析到地址或地址解析到ip
nc
网络发包工具
nc -t -v 127.0.0.1 8888 tcp
nc -u -v 127.0.0.1 8888 udp
nc -l -v 127.0.0.1 8888 监听端口
telnet
netstat
查看网络连接和端口
tcpdump 网络抓包工具
远程命令
ssh 安全远程登录
scp
进程与系统
ps -ef
查看进程信息
标识 | 说明 |
---|---|
UID | 进程启动用户的id |
PID | 进程id |
PPID | 启动该进程的进程id |
C | cpu占用率 |
STIME | start time |
CMD | 启用命令 |
TIME | 占用的CPU时间 |
ps -lf pid
查看指定进程的线程信息
标识 | 说明 |
---|---|
LWP | 线程号 |
NLWP | 线程数 |
STAT | 线程状态 |
free
系统内存使用情况(mac 没有)
free -m/-g/-h 显示单位
top
查看cpu使用率,内存信息,进程情况
kill
发送信号给进程
kill -9 pid 强制杀死进程
kill -l 查看信号的编码
shell脚本编程
数组
array_name=(value0 value1 value2) //定义数组
value1=${array_name[1]} //读取数组,下标不能是字符串
array_name[*]
array_name[@] //获取所有元素
${#array_name[*]} //数组长度
传递参数
$n n为一个数字,0为执行的文件名,1,2,3…之后是参数
特殊字符
$# 传递到脚本的参数个数
$* 所有的参数的字符串组合("$1 … $n")
$@ 使用时加引号,并在引号中返回每一个参数(“
1
"
.
.
.
"
1" ... "
1"..."n”)
运算符
关系运算符只能比较数字
if中括号前后要有空格
逻辑运算符判断要加中括号
文件测试运算符
-r 可读
-w 可写
-x 可执行
-f 是否是普通文件
-d 是否是目录
-s 是否为空 空false
-e 是否存在
统计文件中空行数
思路:
1) 空行通过正则表达式来实现:^$
2) 统计数量
a) grep -c
b) awk
解答:
方法1:
grep -c “^$” /etc/services
方法2:
grep “^$” /etc/services |wc -l
方法3:
awk “/^$/” /etc/services |wc -l
方法4:
awk ‘/^$/{i++}END{print i}’ /etc/services
shell流程控制
if
if [ $a == $b ]
then
echo "a等于b"
elif [ $a -gt $b ]
then
echo "a大于b"
else
echo "a小于b"
fi
for
for loop in 1 2 3 4 5
do
echo $loop
done
while
while [[ $i -gt 5]]
do
echo $i
((i--))
done
until
case(case\esac)
echo "enter:"
read aNum
case $aNum in
1) echo '1'
;;
2) echo '2'
;;
3) echo '3'
;;
*) echo 'default'
;;
esac
break/continue
shell函数
[ function ] funname [()]
{
action;
[return int;]
}
noreturn(){
echo 'noreturn'
}
returnfun(){
echo "enter:"
read a
return $(($a));
}
returnfun
echo "enter $? "
paramFun(){
echo "enter $1 "
echo "enter $2 "
echo "enter $# 个参数"
}
paramFun 1 2 3
一些命令
xargs
多行合成一行
alias
设置命令的别名
alias name=‘command line’
unalias
解除命名
crontab 安装、卸载或列出定时任务的命令
crontab -e 编辑crontab文件
rsync
iostat
vmstat
磁盘报警,如何找到/home下占用磁盘空间大的文件
#查找当前目录占用空间最大的文件夹
du -ah --max-depth=1
#查找文件夹占用空间最大文件
ls -lhsrS
查看日志文件中所有异常和异常栈,统计异常出现次数,查看某异常首次出现的时间
#
grep "Exception" error.log | sort | uniq -c | sort -n -k1
grep -A 10 “java.lang.IllegalArgumentException”
grep -B 1 "java.lang.IllegalArgumentException" error.log | head -n 2
把远程服务器的文件copy到自己的电脑上
python -m SimpleHTTPServer 8888
curl http://servername:8888/error.log
server: nc -l 8888 < filename
local: nc server 8888 > filename
把本机文件copy到远程服务器上
server:nc -l 8888 > filename
local:nc server 8888 < filename
删除了文件,但磁盘占用空间未释放,如何排查
有可能是仍有进程在读写该文件
lsof | grep deleted
echo “” > error.log
切换jdk的版本,创建软连接
mkdir jdk8
ln -s jdk8 jdk
修改文件夹的拥有者和组
chown tomcat:tomcat ./works -R
端口号被占用,查看被什么进程占用
sudo netstat -nptl | grep 8888
ps -aux | grep pid
在多台服务器上寻找某个文件
for i in {1..3};
do
ssh l-qfcm.fresh.dev.cn0 "grep /home/q/appcode/logs/info.log";
done;
atnodes ‘grep /home/q/appcode/logs/info.log’ l-dev[1-3].f.cn1.qunar.com
终端快捷键
- 搜索历史命令
ctrl+r
- 光标移动
Ctrl+a 移动到当前行的开头
Ctrl+e 移动到当前行的结尾
ctrl+左箭头/右箭头:左一个单词,右移一个单词
- 删除or剪切
Ctrl+w:剪切光标所在处之前的一个词(以空格、标点等为分隔符)
Ctrl+u 剪切命令行中光标所在处之前的所有字符(不包括自身)
Ctrl+k 剪切命令行中光标所在处之后的所有字符(包括自身)
Ctrl+& 恢复快捷键删除的内容
- 粘贴
ctrl+y
- 清屏
ctrl+l
Vim编辑器
常用操作
- 跳转
- 文件开头 gg
- 末尾G
- ctrl+u 上翻半页
- ctrl+d 下翻半页
- b e 单词头,单词尾
- w 下一单词
- 修改
- 复制 y+范围
- 赋值当前行 yy
- 剪贴字符 x
- 剪贴当前行 dd
- 粘贴 p P
- 修改某单词 c+iw
- 向下增加一行并插入 o
- 向上增加一行并插入 O
- 查找替换
- 查找 /someword 下一个n 上一个N
- 替换 1,$(表示1到最后一行) s/原内容/替换的内容/g
- 执行外部命令
- : ! ls ~
- : w ! sudo tee %