肝了几个周末,万字长文吐血总结Linux命令以及面试实例分享!如果觉得文章还不错的,欢迎点赞关注哦!
罗列出当前文件或目录的详细信息,含有时间、读写权限、大小、时间等信息
ll
是ls -l
的别名,可以理解为 ll 和 ls -l 的功能是相同的。
-c
或-h
,否则将不存在的FILE
参数创建为空。#创建三个文件 $ touch test1 test2 test3 #不创建文档 $ touch -c test5 $ ls test1 test2 test3 #可以看到只创建了test1、test2、test3 , -c不建立任何文件
FILE
或标准输入连接到标准输出。$ cat test #展示文件内容 -A, --show-all 等价于 -vET -b, --number-nonblank 对非空输出行编号 $ cat -n test #展示文件内容并且展示行号 1 -A, --show-all 等价于 -vET 2 -b, --number-nonblank 对非空输出行编号 # 把 log2012.log 的文件内容加上行号后输入 log2013.log 这个文件里 $ cat -n log2012.log log2013.log #把 log2012.log 和 log2013.log 的文件内容加上行号(空白行不加)之后将内容附加到 log.log 里 $ cat -b log2012.log log2013.log log.log
$ tac test -b, --number-nonblank #对非空输出行编号 -A, --show-all # 等价于 -vET
chmod
可以控制文件如何被他人所调用。chmod abc file #其中a,b,c各为一个数字,分别表示User、Group、及Other的权限。 r=4,w=2,x=1 #r 表示可读取,w 表示可写入,x 表示可执行 若要rwx属性则4+2+1=7; 若要rw-属性则4+2=6; 若要r-x属性则4+1=5。 比如: chmod 777 file chmod 700 file
#当前工作目录下创建名为 t 的文件夹 $ mkdir t #在 tmp 目录下创建路径为 test/t1/t 的目录,若不存在,则创建 $ mkdir -p /tmp/test/t1/t
#切换到目录/ $cd /
-i, —interactive
进行交互式删除-r, -R, —recursive
指示rm
将参数中列出的全部目录和子目录均递归地删除。-d, --dir
删除空目录$ rm -rf linux #删除目录成功, $ rmdir == rm -d 删除空目录
$ mv test.log test1.txt #将文件 test.log 重命名为 test1.txt $ mv log1.txt,log2.txt,log3.txt /test3 #将文件 log1.txt,log2.txt,log3.txt 移动到根的 test3 目录中
-i
提示-r
复制目录及目录内所有项目-a
复制的文件与原文件时间一样$ cp -ai a.txt test #复制 a.txt 到 test 目录下,保持原文件时间,如果原文件存在提示是否覆盖。
$ echo "change world" #打印change world change world $ echo $PWD #s输出PWD环境变量的值,$PWD 是取当前路径,然后echo到标准输出,,一般echo \$name 用来查看某个环境变量的值 /Users/localhost/test
-n
展示前n行-c
展示前n个字符$ head -n15 test.txt #展示15行 $ head -c23 test.txt #展示前23个字符,中文一个汉字并非一个字符的(utf-8编码中文字符长度是可变的)
-f
循环读取(常用于查看递增的日志文件)-n
<行数> 显示行数(从后向前)日志文件没办法用vim或者cat这样去看,一般常用tail、grep或者more
cat, more
会以一页一页的显示方便使用者逐页阅读,cat命令是全部读取输出到标准输出,如果文件太大会把屏幕刷满的,根本没办法看。
$ more +3 text.txt #显示文件中从第3行起的内容 $ ls -l | more -5 #在所列出文件目录详细信息,借助管道使每次显示 5 行
less
与 more
类似,但使用less
可以随意浏览文件,而 more
仅能向前移动,却不能向后移动,而且 less
在查看之前不会加载整个文件$ ps -a | less -N #-N 显示每行的行号 # ps 查看进程信息并通过 less 分页显示
wc(word count)
功能为统计指定的文件中字节数、字数、行数,并将统计结果输出-c
统计字节数-l
统计行数-m
统计字符数-w
统计词数,一个字被定义为由空白、跳格或换行字符分隔的字符串$ wc -l test.txt #统计文件行数 26 test.txt
$ date2019年12月22日 星期日 21时28分29秒 CST$ date '+%c'日 12/22 21:28:33 2019
$ which ls # 查看指令"ls"的绝对路径 /bin/ls ##ls可执行程序的绝对路径
$ whereis locate #查找 locate 程序相关文件 $ whereis -s locate #查找 locate 的源码文件
$ nl test.txt
$ find /user -name '*.log' -print # 在user目录查找 以 .log 结尾的文件,并打印输出 . 代表当前目录
$grep '20:[0-5][0-9]:' *.log #匹配当前目录下搜索log日志中,20点的日志 $grep '20:[0-5][0-9]' 1.log 2.log 3.log #指定在这三个文件中查找#grep规则是支持正则表达式的 $ps -ef|grep java #查找所有java进程,-c可以统计查找的个数 $grep '20:[1-5][0-9]:' *.log | grep -v '20:[3-4][0-9]:' # -v反向选择,相当于过滤 $grep 'ab|bc' *.log #支持|语法,匹配含有ab或者bc的文本行
-b
:仅显示行中指定直接范围的内容;-c
:仅显示行中指定范围的字符;-d —delimiter
指定分割符(默认是以tab键作为分割符)-f —fields
指定分割的区域(常和-d参数配合使用)#通过linux命令吧这个文本里面的hello world搞成十行,并且取出每一列的第七个字符。 $ cat tmp.cc| >>tmp.cc|>>tmp.cc|>>tmp.cc|head -n10|>tmp.cc|cut -c7-7 $cut -c-10 tmp.txt #cut tmp.txt文件的前10列 $cut -c3-5 tmp.txt #cut tmp.txt文件的第3到5列 $cut -c3- tmp.txt #cut tmp.txt文件的第3到结尾列 cut -d "|" -f 1 #指定|作为分割符,取第一个域
$ diff testA.txt testB.txt
打包是指将一大堆文件或目录变成一个总的文件;压缩则是将一个大的文件通过一些压缩算法变成一个小文件
$tar -cvf test.tar test.txt #打包 tar -cvf 包名 文件名 $tar -xvf test.tar #解包 tar -xvf 包名 $tar -zcvf test.tgz test.txt #压缩 tar -czvf 包名 文件名 $tar -zxvf test.tgz #解压 tar -xzvf 包名
*.gz
的压缩文件:gzip test.txt
*.gz
文件:gzip -d test.txt.gz
*.zip
文件:unzip test.zip
。*.zip
文件的内容:unzip -l jasper.zip
awk '{pattern + action}' {filenames}
last -n 5的输出如下:
显示最近登录的5个帐号:
awk工作流程:
\n
换行符分割的一条记录,然后将记录按指定的域分隔符划分域,$0
则表示所有域$1
表示第一个域,$n
表示第n个域。$1
表示登录用户,$3
表示登录用户ip,以此类推。-i
选项或者将结果重定向到新的文件中。sed
后面接的动作,请务必以‘’
两个单引号括住!$ nl /etc/passwd | sed '2,5d' #删除2-5行 $ nl /etc/passwd | sed '2d' #只删除第2行 $ nl /etc/passwd | sed '3,$d' #删除3到最后一行
:w
保存文件:w vpser.net
保存至vpser.net文件:q
退出编辑器,如果文件已修改请使用下面的命令:q!
退出编辑器,且不保存:wq
退出编辑器,且保存文件/dong
向光标下搜索dong字符串,dong可以是正则表达式
?dong
向光标上搜索dong字符串
n
向下搜索前一个搜索动作
N
向上搜索前一个搜索动作
* (#)
当光标停留在某个单词上时, 输入这条命令表示查找与该单词匹配的下(上)一个单词. 同样, 再输入 n
查找下一个匹配处, 输入N
反方向查找.
g*(g#)
此命令与上条命令相似, 只不过它不完全匹配光标所在处的单词, 而是匹配包含该单词的所有字符串.
n+
向下跳n行
n-
向上跳n行
nG
跳到行号为n的行
G
跳至文件的底部
$ps -a #查看所有进程 $ps -ef #查看进程的环境变量和程序间的关系 ps -aux | grep kafka #与grep联用查找某进程
发送指定的信号到相应进程。不指定型号将发送SIGTERM(15)终止指定进程。
如果任无法终止该程序可用"-KILL" 参数,其发送的信号为SIGKILL(9) ,将强制结束进程,使用ps命令或者jobs 命令可以查看进程号。
$ ps -ef | grep kafka #先使用ps查找进程kafka, $ kill -9 pid #然后用kill杀掉 kill -9 强制终止
#展示当前系统磁盘使用情况,以可读的方式展示 $ df -h
$du -h filename #查看指定文件大小 $du -h / #展示该目录下所有文件大小,大小以可读方式展示 $du -sh #展示当前目录大小 $du -sh ./ #展示当前目录下每个目录大小 $du -ah / #显示所有文件的大小,以可读方式展示
在linux环境下,任何事物都以文件的形式存在,即一切皆文件!
$ lsof #显示当前系统打开的文件 $ lsof /bin/bashCOMMAND #查看某个文件的相关进程 lsof 文件名 $ lsof -u username#查看某个用户打开的文件信息 $ lsof -c java #列出某个程序进程所打开的文件信息
ping命令主要用来测试主机之间网络的连通性
执行ping指令会使用ICMP传输协议,发出要求回应的信息,若远端主机的网络功能没有问题,就会回应该信息,因而得知该主机运作正常。
ICMP(Internet Control Message Protocol)Internet控制消息协议。 它是TCP/IP协议簇的一个子协议,用于在IP主机、路由器之间传递控制消息。控制消息是指网络通不通、主机是否可达、路由是否可用等网络本身的消息。
网络延时指**一个数据包从用户的计算机发送到网站服务器,然后再立即从网站服务器返回用户计算机的来回时间**。 通俗的讲,就是数据从电脑这边传到那边所用的时间。
$ ping -c 10 host #ping指定次数 $ ping -c 10 -i 0.5 host #ping指定时间间隔和次数限制 $ ping -c 4 -i 3 www.linuxcool.com # 连续ping4次,每次间隔3秒,检查与linuxcool的连通性
telnet
命令用于远端登入。
执行telnet
指令开启终端机阶段作业,并登入远端主机
$ telnet 192.168.120.209 Trying 192.168.120.209... telnet: connect to address 192.168.120.209: No route to host telnet: Unable to connect to remote host: No route to host
在Linux使用过程中,需要了解当前系统开放了哪些端口,并且要查看开放这些端口的具体进程和用户,可以通过netstat命令进行简单查询
$ netstat -a #列出所有端口使用情况 $ netstat -nu #显示当前UDP连接状况 $ netstat -apu #显示UDP端口号的使用情况 $ netstat -i #显示网卡列表
ifconfig 用于查看和配置 Linux 系统的网络接口。
$ ifconfig #显示网络设备信息 $ ifconfig eth0 up $ifconfig eth0 down #启动关闭指定网卡 $ ifconfig eth0 ip #配置IP地址
$ hostname -i #查看主机ip
wget命令用来从指定的URL下载文件
wget -c http://xxx.zip ##断点续传
curl -d ##HTTP POST方式传送数据
管道 (pipeline) ,连结上个指令的标准输出,做为下个指令的标准输入。
常出现在流程控制中,扮演括住判断式的作用
这组符号与先前的 [] 符号,基本上作用相同,但她允许在其中直接使用||
与&&
逻辑等符号
反斜杠的作用是将特殊符号字符的特殊含义屏蔽掉,使其还是原字符
sh里没有多行注释,只能每一行加一个#
号
把cmd命令的输出重定向到文件file中。如果file已经存在,则清空原有文件,使用bash的noclobber选项可以防止复盖原有文件。
**>> **
把cmd命令的输出重定向到文件file中,如果file已经存在,则把信息加在原有文件後面。
单一个& 符号,且放在完整指令列的最后端,即表示将该指令列放入后台中工作。
代表 or 逻辑的符号。
代表 and 逻辑的符号
匹配一个任意的字符
禁止插入换行符。
对转义字符进行替换
$
直接引用变量
**$?
上一次命令的返回值。**0表示执行成功,非零值表示出错
$()
执行并获取命令输出赋值给变量
${}
作为单词边界
${#}
获取变量字符串长度
双引号"
括起来的字符串支持变量插值,被双引号用括住的内容,将被视为单一字串
单引号'
括起来的字符串不会进行插值
$[]
对表达式进行求值,与expr
命令不同的是,$[]
用于插值,而expr
则将值输出
$$
获取当前进程ID
for i in `seq 1 10`;
-f
:仅删除函数;-v
:仅删除变量。echo "aab12" | sed `s/\(.*\)/\1/` -----> aab12
s
命令会用斜线间指定的第二个文本字符串来替换第一个文本字符串
\1
就代表被匹配到的第一个模式
-e
以选项中指定的script来处理输入的文本文件。
set指令能设置所使用shell的执行方式,可依照不同的需求来做设置
-x
执行指令后,会先显示该指令及所下的参数。用于脚本调试,在liunx脚本中可用set -x就可有详细的日志输出.免的老是要echo了
-e
若指令传回值不等于0,则立即退出shell
文件开头加上set -e
,这句语句告诉bash如果任何语句的执行结果不是true则应该退出,如果要增加可读性,可以使用set -o errexit
,它的作用与set -e
相同。
if [[ x"$var" == x"3"]];then echo "$var" fi
x
防止出现语法错误。如果不写x
,只用if [ “${var}" == “0” ]
来判断${var}
的值,当${var}
为空或未设置时,语句被解释为if [ == "0" ]
,出现语法错误。加上x
后,当${var}
为空或未设置时,解释为if [ “x" == "x" ]
,依然正确。
-e
参数来打印转义字符echo `date` #显示当前日期 echo -e "\n" #打印换行符
source FileName #在当前bash环境下读取并执行FileName中的命令。
mkdir -p data/env #-p 确保目录名称存在,不存在的就建一个
function demo(){ if [[ x"$var" == x"2" ]];then echo "$var" fi }
echo hello world 123 | tr -d '0-9' ##删除字符串中的数字 hello world echo hello world 123 | tr -d -c '0-9' #-c选项表示取反 123 echo hello world | tr -s ' ' #s选项加上空格参数表示将多个空格压缩为单个 hello world echo hello world | tr [a-zA-Z] [n-za-mN-ZA-M] ##rot13加密算法,这个算法简单地将英文字母后移13位 uryyb jbeyq
-f: 强制创建物理卷,不需要用户确认 -u: 设置设备的UUID -y: 所有的问题都回答yes
-l
# 逻辑卷大小-n
# 逻辑卷名字mkfs.ext3 /dev/sda6 # 把该设备格式化成ext3文件系统
exit [状态值] ##使shell以指定的状态值退出,状态值0代表执行成功,其他值代表执行失败
-i
显示套件的相关信息。-h
套件安装时列出标记-v
显示指令执行过程^once #匹配以once开头的字符串
在一组方括号里使用 ^ 时,它表示"非"或"排除"的意思,常常用来剔除某个字符
^[^0-9][0-9]$ #第一个字符非数字,第二个字符为数字。如&1、%2 [^a-z] ##除了小写字母以外的所有字符 [^\\\/\^] ##除了(\)(/)(^)之外的所有字符 [^\"\'] ##除了双引号(")和单引号(')之外的所有字符
bucket$ #匹配以bucket结尾的字符串
^abcd$ #精确匹配,只匹配abcd字符串
所有的转义序列都用反斜杠 \
打头
^\t #匹配以制表符开头的字符串 \n \\ \.
匹配前面的子表达式零次或一次。例如,“do(es)?” 可以匹配 “do” 或 “does” 。? 等价于 {0,1}。
**匹配前面的子表达式零次或多次。例如,zo 能匹配 “z” 以及 “zoo”。 等价于{0,}。
与 {1,} 是相等的,匹配前面的子表达式一次或多次。
匹配除换行符(\n、\r)之外的任何单个字符。要匹配包括 ‘\n’ 在内的任何字符,请使用像"(.|\n)"的模式。
匹配一个单词边界,也就是指单词和空格间的位置。例如, ‘er\b’ 可以匹配"never" 中的 ‘er’,但不能匹配 “verb” 中的 ‘er’
前面的字符或字符簇只出现n次
前面的内容出现n或更多的次数
前面的内容至少出现n次,但不超过m次
[a-z] # 匹配所有的小写字母 [A-Z] # 匹配所有的大写字母 [a-zA-Z] # 匹配所有的字母 [0-9] # 匹配所有的数字 [0-9\.\-] # 匹配所有的数字,句号和减号 [ \f\r\t\n] # 匹配所有的白字符 /[A-Za-z0-9]/ #匹配所有的字母和数字
^[a-zA-Z_]$ #所有的字母和下划线 ^a$ #字母a ^a{4}$ #aaaa ^a{2,4}$ #aa,aaa或aaaa ^a{2,}$ #包含多于两个a的字符串 ^a{2,} #如:aardvark和aaab,但apple不行 a{2,} #如:baad和aaa,但Nantucket不行 \t{2} #两个制表符 .{2} #所有的两个字符
^[a-zA-Z0-9_]+$ #所有包含一个以上的字母、数字或下划线的字符串 ^[1-9][0-9]*$ # 所有的正整数 ^\-?[0-9]+$ # 所有的整数 ^[-]?[0-9]+(\.[0-9]+)?$ # 所有的浮点数
ssh -l 用户名 -端口号 服务器ip 输入密码
使用ssh连接远程服务器时,有时一个脚本要执行很长时间,如果没有放在后台独立运行,由于网络波动或者中断都有可能导致命令中断,所以在这里分享一个后台独立运行命令的Tip,亲测好用,棒棒哒!
nohup ./main &
此后,如果你断开了ssh,程序依旧运行。此种方式的缺点是,应用程序没有交互界面了,程序的输出将会输出的一个xxx.out文件中,而且以后无法在界面控制程序的结束。必须通过kill的方式。所以这种方式显得很简单粗鲁,很少使用。
screen
回车后进入Screen子界面,此时putty标题栏会指示处于子界面状态,然后运行你的程序
./main
然后按下Ctrl+A后抬起,然后按下d键,此时切换回主界面,Putty的窗口标题栏也会指示。
进行其他的操作,或者exit
此时就是断开ssh,程序仍在运行。以后重新ssh连接后,输入
screen -ls
查看子界面的代号,然后输入
screen -r 子界面代号
就可以查看当初你程序运行所在的子界面了
Linux下有三个命令:ls
、grep
、wc
。通过这三个命令的组合可以统计目录下文件及文件夹的个数。
$ ls -l | grep "^-" | wc -l
$ ls -lR| grep "^-" | wc -l
$ ls -lR | grep "^d" | wc -l
ls -l
长列表输出该目录下文件信息(注意这里的文件是指目录、链接、设备文件等),每一行对应一个文件或目录,ls -lR
是列出所有文件,包括子目录。
grep "^-"
ls
的输出信息,只保留一般文件,只保留目录是grep "^d"
。wc -l
vim 会一次性把文件load到内存,不可取
cat会一次性输出文件的所有内容,用cat来读取16G的文件,你只能看到在屏幕上不断打印的内容,无法阅读。
如果只看文件的前一部分,用 head -n 就是最佳选择。
less/more并不需要加载全部文件,因此在打开大文件的时候,less/more具有优势。但使用 less 可以随意浏览文件,而 more 仅能向前移动,却不能向后移动
使用top命令查看负载,在top下按“1”查看CPU核心数量,shift+"c"按cpu使用率大小排序,shif+"p"按内存使用率高低排序;
使用iostat -x
命令来监控io的输入输出是否过大
查找单词名称:test
操作命令:
(1)more xxx.log | grep -o test | wc -l ### word count -list (2)cat xxx.log | grep -o test | wc -l (3)grep -o test xxx.log | wc -l
方法1: lsof命令,即ls open files
$ lsof -i:端口号
方法2: netstat命令
$ netstat -tunpl | grep 端口号
1.touch hello.sh 2.vim hello.sh 键入i 插入#!/bin/sh echo hello world; 键入: esc : wq 3.chmod 700 hello.sh//给予用户权限 4. 执行./hello.sh 或者执行 sh hello.sh
在 if-then
中使用测试命令( -gt
等)来比较两个数字。
#!/bin/bash //这一行 一定要有 ,表示命令通过 /bin/bash 来执行 x=10 y=20 if [ $x -gt $y ] then echo “x is greater than y” else echo “y is greater than x” fi
#其他比较命令 -eq //等于 -ne //不等于 -gt //大于 (greater ) -lt //小于 (less) -ge //大于等于 -le //小于等于 在linux 中 命令执行状态:0 为真,其他为假
/dev
目录下?read 命令可以读取来自终端(使用键盘)的数据。-p
后面跟提示信息,即在输入前打印提示信息。
#!/bin/bash read -p "Input file name: " FILENAME if [ -c "$FILENAME" ];then cp $FILENAME /dev fi
/tmp/input.txt
文件的内容?要求:
[root@~]## cat -n /tmp/input.txt 1 000011111222 2 3 000011111222222 4 11111000000222 5 6 7 111111111111122222222222 8 2211111111 9 112222222 10 1122 11 ## 删除所有空行命令 [root@~]## sed '/^$/d' /tmp/input.txt 000011111222 000011111222222 11111000000222 111111111111122222222222 2211111111 112222222 1122 ## 插入指定的字符 [root@~]## sed 's#\(11111\)#AAA\1BBB#g' /tmp/input.txt 0000AAA11111BBB222 0000AAA11111BBB222222 AAA11111BBB000000222 AAA11111BBBAAA11111BBB11122222222222 22AAA11111BBB111 112222222 1122
【面试系列】计算机网络(一)
【面试系列】计算机网络(二)
【面试系列】常考web安全问题总结
30道计网常考面试题总结
【面试系列】会持续更新,欢迎关注公众号“任冬学编程”,一起学习与进步!