Linux
文章目录
文件处理
解压文件
tar -zxvf source_file -C target_file
搜索文件位置
- locate : 从文件索引数据库(系统自动维护,每天更新一次)中查找文件,查找速度快
- which / whereis : 前者查找已经安装好的命令,后者查找文件索引数据库中的内容。
- find : 用于查找指定目录的文件,可以设置时间等参数。
例如:
find /etc -name "ifg*"
在/etc目录下查找以ifg开头的文件
配置环境变量
vim ~/.bashrc
source ~/.bashrc
文件软链接
ln -s [源地址] [目的地址]
ext文件系统
ext4文件系统会把分区主要分为两大部分(暂时不提超级块):一小部分用于保存文件的inode(i节点)信息;剩余的大部分用于保存block信息。
- inode的默认大小为128 Byte,用来记录文件的权限(r、w、x)、文件的所有者和属组、文件的大小、文件的状态改变时间(ctime)、文件的最近一次读取时间(atime)、文件的最近一次修改时间(mtime)、文件的数据真正保存的block编号。每个文件需要占用一个inode。大家如果仔细查看,就会发现inode中是不记录文件名的,那是因为文件名记录在文件所在目录的block中。
- block的大小可以是1KB、2KB、4KB,默认为4KB。block用于实际的数据存储,如果一个block放不下数据,则可以占用多个block。例如,有一个10KB的文件需要存储,则会占用3个block,虽然最后一个block不能占满,但也不能再放入其他文件的数据。这3个block有可能是连续的,也有可能是分散的。
重定向
2>/dev/null
意思就是把错误输出到“黑洞”
>/dev/null 2>&1
默认情况是1,也就是等同于1>/dev/null 2>&1。意思就是把标准输出重定向到“黑洞”,还把错误输出2重定向到标准输出1,也就是标准输出和错误输出都进了“黑洞”
2>&1 >/dev/null
意思就是把错误输出2重定向到标准出书1,也就是屏幕,标准输出进了“黑洞”,也就是标准输出进了黑洞,错误输出打印到屏幕
设备文件
-
硬盘设备
sda
表示第一块硬盘sdb
表示第二块硬盘主分区从1开始,逻辑分区从5开始
文本处理
grep
- 参数
# 去除含 "this" 的行 cat $1 | grep -v "this"
awk
-
格式:
awk 动作 文件名
awk '{print $0}' demo.txt
-
特殊变量:
$0
表示当前行
$1
表示第一行(空格为默认分隔符)
$NF
表示最后一行
$NR
表示当前行
都为大写
-
特殊用法
-
输出以空格为分隔符且第一个字符为 root 或者 bin 的行
awk '$1 == "root" || $1 == "bin" {print $0} demo.txt
-
输出以空格为分隔符的奇数行的第一列的数据
awk -F ' ' 'NR % 2 == 1 {print $1}' demo.txt
-
以 : 为分隔符,当第一列的字典序大于等于 m 时输出该列内容,否则输出 —
awk -F ':' '{if ($1 > "m") print $0; else print "---"}' demo.txt
-
循环操作
awk '{ for(i = 1; i < NF; i++) { if(length($0) < 8) { print $0 } } }' ./nowcoder.txt
-
先循环,再操作
# 将每一行的第六个元素相加,最后输出 awk '{a+=$6}END{print a}'
-
求数组的平均值
# 输入的第一个数为数组的长度,后面的数为要求平均数的值 awk '{ if(NR == 1) { total = $1; } else { sum += $1 } } END{ printf("%.3f",sum / total); }' $1
-
sed
-
格式
sed [-hnV][-e<script>][-f<script文件>][文本文件]
-
参数
- a :新增, a 的后面可以接字串,而这些字串会在新的一行出现(目前的下一行)~
- c :取代, c 的后面可以接字串,这些字串可以取代 n1,n2 之间的行!
- d :删除,因为是删除啊,所以 d 后面通常不接任何咚咚;
- i :插入, i 的后面可以接字串,而这些字串会在新的一行出现(目前的上一行);
- p :打印,亦即将某个选择的数据印出。通常 p 会与参数 sed -n 一起运行~
- s :取代,可以直接进行取代的工作!通常这个 s 的动作可以搭配正规表示法!例如 1,20s/old/new/g 就是啦!
-
例子
# 在testfile文件的第四行后添加一行,并将结果输出到标准输出 sed -e '4a\newLine' testfile
cut
-
格式
cut OPTION... [FILE]...
-
参数
-f : 提取指定的字段,cut 命令使用 Tab 作为默认的分隔符。
-d : Tab 是默认的分隔符,使用这一选项可以指定自己的分隔符。
-b : 提取指定的字节,也可以指定一个范围。
-c : 提取指定的字符,可以是以逗号分隔的数字的列表,也可以是以连字符分隔的数字的范围。
–complement : 补充选中的部分,即反选。
–output-delimiter : 修改输出时使用的分隔符。
–only-delimited : 不输出不包含分隔符的列。 -
例子
#输出以 : 为分隔符,第 1,2,3,4,6,7行 grep "/bin/bash" /etc/passwd | cut -d':' -f 1-4,6,7
vim
文本处理
- 替换
i,j s /word1/word2/gc
在 i行 和 j行 之间用word2替换word1,s替换命令,g对范围内所有匹配字符串起作用(否则只),c表示每次替换前询问
命令模式
- 水平分割的shell
:vert term
使用etit
加:q
退出 - 创建标签页
:tabedit [filename]
或者:e filename
给定文件名,使用:tabn
和:tabp
或者number + gt
切换标签 - 将文件恢复到最开始的状态
:e!
- 将文件另存为
:w newfilename
- 将其他文件插入到现在操作的文件的末尾
:r filename
- 将进程挂起
ctrl + v
或者ctrl + c
,jobs
查看挂起进程,fg 1
把一号进程放到前台执行,bg 1
把一号进程放到后台执行 - 录制操作
qa
启动录制- 输入操作
q
结束录制10@a
将操作执行10次
系统中的重要文件
文件作用 | 保存路径 | 备注 |
---|---|---|
网络服务配置文件 | /etc/sysconfig/network-scripts/ifcfg-eth0 | |
主机名和IP的映射文件 | /etc/hosts | |
主机名称配置文件 | /etc/sysconfig/network | |
配置系统变量 或者 环境变量 或者 别名信息 | /etc/profile | |
开关机的启动 | /etc/init.d |
挂起进程的处理
jobs
查看所有挂起的进程
kill %1
杀死挂起的一号进程
jobs -l
可以查看到进程号,然后用 kill 进程号
的方式杀死进程
fg 1
把一号进程放到前台执行,bg 1
把一号进程放到后台执行
防火墙
- 查看防火墙状态
systemctl status firewalld.service
- 关闭防火墙
systemctl stop firewalld.service
- 永久关闭防火墙
systemctl disable firewalld.service
查看历史命令
history
显示最近1000条命令
- 可以使用上、下箭头调用以前的历史命令
- 使用“!n”重复执行第n条历史命令
- 使用“!!”重复执行上一条命令
- 使用“!字串”重复执行最后一条以该字串开头的命令
权限管理
修改用户权限
用户身份
u 表示“用户(user)”,即文件或目录的所有者。
g 表示“同组(group)用户”,即与文件属主有相同组ID的所有用户。
o 表示“其他(others)用户”。
a 表示“所有(all)用户”。它是系统默认值。
赋予权限
- ‘+’ 赋予权限
- ‘-’ 剥夺权限
- ‘=’ 设置权限
权限
- r 读权限(read)
- w 写权限(write)
- x 执行权限(execute)
- chmod : 修改文件的权限模式
- chgrp : 修改文件和目录的所属组
sudo chown -R [用户名] [路径]
chmod ug+w,o-x text
创建用户
useradd -m <UserName> -s /bin/bash
创建用户并设置用户目录和默认shellpasswd <UserName>
设置用户密码su <UserName>
切换用户
查看内存占用
-
top
-
参数
# -u 用来指定用户 # -p 用来指定进程号 # -H 以线程粒度来显示,即task_struct。
-
机器管理
关闭错误的下载进程
snap changes
sudo snap abort 5
关闭和重启
shutdown
shutdown -h 10 'notice' #10分钟后关机,ctrl + c取消
shutdown -h 1:00 #1:00关机
shutdown -h now #关机
shutdown -r #重启
shutdown -c #取消关机
reboot = shutdown -r now
half=shut -h now
poweroff=halt+关电
网络
监听端口
监听9870端口是否被占用
netstat -antup | grep 9870
查看端口对应的进程号
fuser -n tcp 5601
软件管理
更改镜像
-
vim /etc/apt/sources.list
进入配置文件 -
# 默认注释了源码镜像以提高 apt update 速度,如有需要可自行取消注释 deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic main restricted universe multiverse # deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic main restricted universe multiverse deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic-updates main restricted universe multiverse # deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic-updates main restricted universe multiverse deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic-backports main restricted universe multiverse # deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic-backports main restricted universe multiverse deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic-security main restricted universe multiverse # deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic-security main restricted universe multiverse
-
apt-get update
更新配置
大数据
HDFS
首次进入时初始化工作目录
hdfs dfs -mkdir -p /user/hadoop
操作文件系统
hdfs dfs -[命令]
hadoop fs -[命令]
创建文件和文件夹**
//在默认路径(家目录)创建一个input文件
hdfs dfs -mkdir input
//在默认路径(家目录)创建一个文件夹
hdfs dfs -mkdir /input
//在根目录下创建一个文件夹
hdfs dfs -mkdir
编写Jar包并运行
hadoop jar ./HadoopTest02_1-1.0-SNAPSHOT.jar
com.MaxTemperature /user/hadoop/input/sample.txt
/user/hadoop/output
Shell脚本
变量
定义变量
x=100
y=x
declare - z=100
read -p "Please input an integer number: " number
A=`ls` 反引号,执行里面的命令
A=$(ls) 等价于反引号
变量的引用
$x
${x}
$1 $2 #引用自己传入的参数
$((2*x+1)) #结果为2*x+1
${!y}
变量替换
${var:-value}
${var:=value}
${var:+value}
${var:?value}
算术运算
- let命令
x=100
let x++
echo x //101
- pxpr
x=100
y=100
`pxpr $x + $y` #用空格隔开
`pxpr x++`
echo x //101
- $(())
$((12 + 32))
- $[]
$[ 1 + 1 ]
特殊参数
$n # $1 代表命令本身、$1-$9 代表第1到9个参数,10以上参数用花括号,如 ${10}。
$* # 命令行中所有参数,且把所有参数看成一个整体。
$@ # 命令行中所有参数,且把每个参数区分对待。
$# # 所有参数个数。
$$ #当前进程的 PID 进程号。
$! #后台运行的最后一个进程的 PID 进程号。
$? #上一次命令的退出状态值
∗ 和 *和 ∗和@的比较
#!/bin/bash
for i in $*
do
echo "ban zhang love $i "
done
for j in $@
do
echo "ban zhang love $j"
done
bash for.sh cls xz bd
# 输出
ban zhang love cls
ban zhang love xz
ban zhang love bd
ban zhang love cls
ban zhang love xz
ban zhang love bd
#!/bin/bash
for i in "$*"
#$*中的所有参数看成是一个整体,所以这个for循环只会循环一次
do
echo "ban zhang love $i"
done
for j in "$@"
#$@中的每个参数都看成是独立的,所以“$@”中有几个参数,就会循环几次
do
echo "ban zhang love $j"
done
bash for.sh cls xz bd
#输出,当有双引号括起来的时候有区别
ban zhang love cls xz bd
ban zhang love cls
ban zhang love xz
ban zhang love bd
单引号和双引号的区别
#!/bin/bash
do_date=$1
echo '$do_date'
echo "$do_date"
echo "'$do_date'"
echo '"$do_date"'
echo `date`
# 输出的结果
[atguigu@hadoop102 bin]$ test.sh 2019-12-14
$do_date
2019-12-14
'2019-12-14'
"$do_date"
2019年 05月 02日 星期四 21:02:08 CST
# 总结
(1)单引号不取变量值
(2)双引号取变量值
(3)反引号,执行引号中命令
(4)双引号内部嵌套单引号,取出变量值
(5)单引号内部嵌套双引号,不取出变量值
分支
判断条件
判断语句
test-e /tmp/file.sh #判断文件是否存在
$? #取得判断的值
num=1
num1=1
if [ $num -eq $num1 ]; then
echo "equals"
else
echo "not equals"
fi
read -p "input an integer number: " num
read -p "input an integer number: " num1
if [ $num -gt $num1 ]; then
echo "great than"
elif [ $num -lt $num1 ]; then
echo "less than"
else
echo "equals"
fi
read -p "input an integer number: " num
case $num in
1) echo "equals 1";;
2) echo "equals 2";;
3) echo "equals 3";;
*) echo "unknown";;
esac
循环
#循环 (contunue 2 表示跳出的嵌套数)
for((i=1;i<10;i++))
do
echo "Hello world"
done
for num in {1..10}
do
echo "Hello world"
done
for i in `seq 1 2 100` #输出1~100之间所有奇数
do
echo $i
done
strings="s1 s2 s3 s4"
for str in $strings
do
echo $str
done
read -p "input a integer: " num
while [[ $num -gt 0 ]]
do
echo "num great than 0"
let "num--"
done
cat student.txt | while read line #按行输出文件
do
echo line
done
for((i=1;i<10;i++)) #九九乘法表
do
for((j=1;j<=$i;j++))
do
let "mult=$i*$j"
echo -n "$i*$j=$mult " //在一行输出
done
echo
done
函数
#函数
function func(){
echo "Hello world"
}
func #调用函数
function add(){
echo `expr $1 + $2`
}
add $1 $2 #传入参数
./script.sh 1 2
举例
#include <stdio.h>
#include <stdlib.h>
#define INT_MAX 2147483647
#define INT_MIN -2147483648
//将整数反转
int reverseInt(int x) {
int rev = 0;
while (x != 0) {
int pop = x % 10;
x /= 10;
if (rev > INT_MAX / 10 || (rev == INT_MAX / 10 && pop > 7))
return 0;
if (rev < INT_MIN / 10 || (rev == INT_MIN / 10 && pop < -8))
return 0;
rev = rev * 10 + pop;
}
return rev;
}
int main(int argc, char* argv[]) {
//将命令行参数转换为整数
long num = atol(argv[1]);
if (num < INT_MIN || num > INT_MAX)
printf("0");
else
printf("%d", reverseInt(num));
}
#!/bin/bash
print(){
echo ""
echo " ******************************"
echo " $1"
echo " ******************************"
echo ""
}
testReverseInt(){
vim reverseInt.c
gcc reverseInt.c -o reverseInt > /dev/null 2>&1
#判断编译是否出错
if [ $? -ne 0 ]; then
rm reverseInt > /dev/null 2>&1
print "Compile Error!"
return 1
fi
while read LINES
do
INPUT=`echo $LINES | cut -f1 -d' '`
USEROUTPUT=`./reverseInt $INPUT`
ANSWER=`echo $LINES | cut -f2 -d' '`
if [ $USEROUTPUT -ne $ANSWER ]; then
rm reverseInt > /dev/null 2>&1
print "Wrong Answer!"
return 1
fi
done < Examples
rm reverseInt > /dev/null 2>&1
print "Accepted!"
return 0
}
testReverseInt
刷题
-
WordCount
cat $1 | tr -s ' ' '\n' | sort | uniq -c | sort | awk '{print $2 $1}'
备注
命令行快捷键
-
最常用快捷键:
tab
补全命令,每补全一个字符至少两次。 -
移动光标快捷键:
Ctrl+A
光标回到命令行首。
Ctrl+E
光标回到命令行末。
Ctrl+F
光标向右移动一个字符。
Ctrl+B
光标向左移动一个字符。 -
复制快捷键:
Ctrl+Insert
复制命令(选中字符进行复制) -
粘贴快捷键:
Ctrl+Insert
粘贴命令 -
剪切命令:
Ctrl+K
剪切光标处到行尾处的字符。(有删除的作用)
Ctrl+U
剪切光标处到行首处的字符。(有删除的作用)
Ctrl+W
剪切光标前的一个单词(有删除的作用)
Ctrl+Y
粘贴之前剪切/删除的文本 -
中断命令:
Ctrl+C
中断正在执行的任务命令或者删除整行。 -
暂停命令:
Ctrl+Z
暂停正在运行行中的任务。 -
清除命令:
Ctrl+H
删除光标前一个字符,等同于Backspace
Del
删除光标后的一个字符。
Ctrl+L
清除屏幕上所有内容,并开始新的一行, -
锁定、 解锁命令:
Ctrl+S
锁定界面,使之无法输入内容。
Ctrl+Q
解开Ctrl+S
的锁定界面,进行输入 -
重复使用命令:
Ctrl+D
退出当前shell命令行,也可以直接关闭shell运行。
Ctrl+R
搜索命令行中使用过的命令记录。
Ctrl+G
从正在执行Ctrl+R
的搜索中退出。 -
Esc相关命令:
Esc+.
获取上一条命令的最后部分(空格分隔)
Esc+B
移动到当前单词的开头。
Esc+F
移动到当前单词的结尾。