shell 收纳

##命令集
##SCP命令
1、从本地将文件传输到服务器
scp【本地文件的路径】【服务器用户名】@【服务器地址】:【服务器上存放文件的路径】
scp /Users/mac_pc/Desktop/test.png root@192.168.1.1:/root

2、从本地将文件夹传输到服务器
scp -r【本地文件的路径】【服务器用户名】@【服务器地址】:【服务器上存放文件的路径】

scp -r /Users/mac_pc/Desktop/test root@192.168.1.1:/root

3、将服务器上的文件传输到本地
scp 【服务器用户名】@【服务器地址】:【服务器上存放文件的路径】【本地文件的路径】

scp root@192.168.1.1:/data/wwwroot/default/111.png /Users/mac_pc/Desktop

4、将服务器上的文件夹传输到本地
scp -r 【服务器用户名】@【服务器地址】:【服务器上存放文件的路径】【本地文件的路径】

scp -r root@192.168.1.1:/data/wwwroot/default/test /Users/mac_pc/Desktop

##Lunix文件权限
d 代表目录,相当于windows的文件夹
c 代表字符设备文件,例如鼠标,键盘

(2)第1-3位确定属主(该文件的所有者)拥有该文件的权限。—User
(3)第4-6位确定属组(所有者的同组用户)拥有该文件的权限,—Group
(4)第7-9位确定其他用户拥有该文件的权限 —Other

chmod 改变权限
第一种方式变更权限
chmod [{ugoa}{±=}{rwx}] 文件或目录
chmod u+x test.txt
chmod u-x,o+x test.txt

第二种方式变更权限
chmod [mode=421 ] [文件或目录]

chmod 777 test.txt

###@@@习题:
1、shell脚本分割文件,30个g,从clickhouse,mysql装不下30个g。
用split
-b size:对file进行切分,每个小文件大小为size。可以指定单位b、k、m。
-C size:与-b选项类似,但是切割时尽量维持每行的完整性。
-l lines:按行分割,每个文件有 lines行
-a num:以num个数字或字母做尾数
-d:添加数字后缀
prefix:分割后产生的文件名前缀。
如把 1111.txt 文件每2000行切割为一个文件,添加数字后缀,以2位数字做尾数,part:分割后的文件的前缀
split -l 2000 -d -a 2 1111.txt part
按照大小分割:
split -b 20m -d -a 2 1111.txt part
###升级版:在基础版的结果上,先执行ls命令,查找 part_ 开头的文件,然后逐个重命名为.txt
split -l 2000 1111.txt -d -a 2 part_&&ls|grep part_ | xargs -n1 -i {} mv {} {}.txt

2、写一个 bash 脚本以统计一个文本文件 words.txt 中每个单词出现的频率。
假设 words.txt 内容如下:
the day is sunny the the
the sunny is is

cat words.txt | tr -s ’ ’ ‘\n’|sort|uniq -c |sort -r|awk ‘{print $2" "$1}’

cat ——浏览文件
tr -s ——替换字符串(空格换为换行)保证了一行一个单词
sort ——默认ASCII值排序,排序号后还会有重复
uniq —— 去重,-c再输出重复次数。结果就是 ”4 abc“ abc出现了4次
sort -r —— 反向排序,也就是从大到小。得到按频率高低的结果
awk ——格式化输出,规定输出是先字符串再重复次数,所以先$2再$1,中间空格分隔

###tr
1、大小写转换
echo “MY NAME IS DELAV” | tr -t [A-Z] [a-z]
2、 删除指定字符
tr.txt
Python 2015.9 - 2018.11
Linux 2016.4 - 2018.11
C 2013.9 - 2014.9
Golang 2018.11 -
[0-9]表示所有数字,[.] [-] [ ] 分别表示 [点 横杠 空格 ] 三个字符,横杠需要添加转义符
cat tr.txt | tr -d “[0-9][.][-][ ]”
结果如下:
Python
Linux
C
Golang
3、字符补集替换
-c:用换行符替换掉除了字母外的所有字符;-s:删除多余的换行符
cat tr.txt | tr -cs “[a-z][A-Z]” “\n”
结果为:
Python
Linux
C
Golang

4、-s 去重 只是把字符串中连续出现的字符压缩,并不是把相同的字符都去掉
echo deeelaaave | tr -s [a-z]
结果为:
delave

####if 判断
if 判断目录、文件是否存在
myPath=“/var/log/httpd/”
myFile=“/var/log/httpd/access.log”

#这里的-x 参数判断$myPath是否存在并且是否具有可执行权限
if [ ! -x "$myPath"]; then
mkdir "$myPath"
fi

#这里的-d 参数判断$myPath是否存在
if [ ! -d "$myPath"]; then
mkdir "$myPath"
fi
# 判断当前目录下,是否有“logs”目录,没有则创建这目录
if [ ! -d "logs" ]; then mkdir "logs"; fi;

#这里的-f参数判断$myFile是否存在,如果不存在就创建这个文件
if [ ! -f "$myFile" ]; then
touch "$myFile"
fi

#其他参数还有-n,-n是判断一个变量是否是否有值
if [ ! -n "$myVar" ]; then
echo "$myVar is empty"
exit 0
fi

#两个变量判断是否相等
if [ "$var1" = "$var2" ]; then
echo '$var1 eq $var2'
else
echo '$var1 not eq $var2'
fi

tail -f run.log # 实时监控查看此文件
只查看文件的第六行
cat 20230102.txt |head -n 6 |tail -n 1
只查看文件的第五、六行
cat 20230102.txt |head -n 6 |tail -n 2
##find
查找文件并执行删除
find / -name 20230102.txt |xargs -exec rm
查找根目录权限为775的文件
find / -perm 775
当前目录下修改时间超过10天的文件
find ./ -mtime +10
当前目录下修改时间10天以内的文件
find ./ -mtime -10

###shell变量的数值计算
((i=i+1))将i+1赋值给i
但不可以写成 echo ((i=i+1)) 必须写成:echo ( ( i = i + 1 ) ) 才可以输出值或者 a = ((i=i+1))才可以输出值 或者a= ((i=i+1))才可以输出值或者a=((i=i+1))

[root@CDH171 script]# ((8>1&&5==5)) && echo “Yes”
Yes
[root@CDH171 script]# echo $((5<6))
1
//1表示结果的成立的,相反,0则表示结果不成立
KaTeX parse error: Expected 'EOF', got '#' at position 23: … [root@bogon ~]#̲ i=10 [root@bog…[i+10] && echo $i
20

expr
[root@bogon ~]# expr 2 * 2
4
[root@bogon ~]# i=expr $i + 5
//注意变量和数字两边要有空格
[root@bogon ~]# echo $i
10
//需要使用转义符“\”

##判断一个变量值或字符串是否为整数
#!/bin/bash
while true
do
read -p “Please input:” A
expr $A + 1 &>/dev/null
if [ KaTeX parse error: Expected 'EOF', got '#' at position 70: … [root@bogon ~]#̲ sh test1.sh Pl…a"
11

##awk实现计算
利用awk进行运算的效果也很好,适合小数和整数,特别是命令行计算,尤其是小数,运算很精确,好用。比如:
[root@bogon ~]# echo “1.2 1.3” | awk ‘{print $1+$2}’
2.5
[root@bogon ~]# echo “10 10” | awk ‘{print ($1+10)/$2}’
2

##shell 特殊变量 $# $* $@ $? $n $$
$0 当前脚本名字 $1 第一个参数 $? 上个命令的退出状态,或函数的返回值
$# 传递给脚本或函数的参数个数

$* 和 $@ 的区别
$* 和 $@ 都表示传递给函数或脚本的所有参数,不被双引号(" “)包含时,都以”KaTeX parse error: Expected 'EOF', got '&' at position 7: 1" “2 &̲quot; … &quot; …*” 会将所有的参数作为一个整体,以"$1 $2 … n " 的 形 式 输 出 所 有 参 数 ; " n"的形式输出所有参数;“n"的形式输出所有参数;”@" 会将各个参数分开,以"$1" “2 " … " 2" … “2”…"n” 的形式输出所有参数。

$$
当前Shell进程ID。对于 Shell 脚本,就是这些脚本所在的进程ID。

习题:
假设 file.txt 内容如下:
987-123-4567
123 456 7890
(123) 456-7890
你的脚本应当输出下列有效的电话号码:
987-123-4567
(123) 456-7890
处理代码:
grep -P ‘^(\d{3}-|(\d{3}) )\d{3}-\d{4} ′ f i l e . t x t e g r e p ′ [ 0 − 9 ] 3 − [ 0 − 9 ] 3 − [ 0 − 9 ] 4 ' file.txt egrep '^[0-9]{3}-[0-9]{3}-[0-9]{4} file.txtegrep[09]3[09]3[09]4|^([0-9]{3}) [0-9]{3}-[0-9]{4}KaTeX parse error: Got function '\(' with no arguments as superscript at position 32: … '^([0-9]{3}-|^\̲(̲[0-9]{3}\) )[0-…’ file.txt
sed -n -r ‘/^([0-9]{3}-|([0-9]{3}) )[0-9]{3}-[0-9]{4}KaTeX parse error: Can't use function '\(' in math mode at position 32: … '/^([0-9]{3}-|\̲(̲[0-9]{3}\) )[0-…/’ file.txt

习题:
假设 file.txt 文件内容如下:
name age
alice 21
ryan 30
应当输出:
name alice ryan
age 21 30

awk '{ #这个大括号里的代码是 对正文的处理
# NF表示列数,NR表示已读的行数
# 注意for中的i从1开始,i前没有类型
for (i=1; i<=NF; i++){#对每一列
if(NR==1){ #如果是第一行
#将第i列的值存入res[i],KaTeX parse error: Expected 'EOF', got '#' at position 39: …标, #̲数组不用定义可以直接使用 …i;
}
else{
#不是第一行时,将该行对应i列的值拼接到res[i]
res[i]=res[i] " " $i
}
}
}

BEGIN{} 文件进行扫描前要执行的操作;END{} 文件扫描结束后要执行的操作。

END{
#输出数组
for (i=1; i<=NF; i++){
print res[i]
}
}’ file.txt

第二种https://leetcode.cn/problems/transpose-file/solutions/906792/leetcodejie-ti-xi-lie-194-zhuan-zhi-wen-u4r72/
分析
文件内容为2行3列,每行列数相同,字段由 ’ ’ 分隔,需要将第一列转为第一行,第二列转为第二行。
xargs 多行变单行
很容易就想到了 xargs 这个命令,可以将单行或多行文本输入转换为其他格式,例如多行变单行,单行变多行。

columns=$(cat file.txt | head -n 1 | wc -w)
for i in $(seq 1 $columns)
do
awk ‘{print ′ " '" "i"’}’ file.txt | xargs
done
bash默认解释双引号的变量 awk解释单引号的变量 所以外面是单引号 里面是双引号

COLS=head -1 1.txt | wc -w

使用awk依次去输出文件的每一列的参数,然后用xargs做转置

for (( i = 1; i <= KaTeX parse error: Expected 'EOF', got '#' at position 22: …i++ )); do #̲ 这里col就是在代码里要替换…i
awk -v col=$i ‘{print $col}’ 1.txt | xargs
done

sed -n 参数后,则只有经过sed 特殊处理的那一行(或者动作)才会被列出来。
打 印    第 十 行 :sed -n ‘10p’ file.txt
打 印 一 到 十 行 :sed -n ‘1,10p’ file.txt
查 找 指 定 字 符 :grep -n ‘KeyWord’ file.txt
打印指定字符上下5行:grep -C 5 ‘KeyWord’ file.txt
打印指定字符上下N行:grep -A 100 -B 100 ‘KeyWord’ file.txt
(-A after 后面, -B before 前面)

查找指定字符出现次数: grep -o ‘KeyWord’ file.txt | wc -l

打 印     第 十 行 :sed -n ‘10p’ file.txt
打 印 一 到 十 行 :sed -n ‘1,10p’ file.txt
查 找 指 定 字 符 :grep -n ‘KeyWord’ file.txt
打印指定字符上下5行:grep -C 5 ‘KeyWord’ file.txt
打印指定字符上下N行:grep -A 100 -B 100 ‘KeyWord’ file.txt
(-A after 后面, -B before 前面)

查找指定字符出现次数: grep -o ‘KeyWord’ file.txt | wc -l

tail -n +10 file.txt | head -1
解析
本题如果先head在tail的话会导致[假如文件不到10行依然会显示某一个错误的行]。
所以先tail -n +10选出从第10行开始的所有行(保证了假如文件不到10行时,不应该有任何输出),
然后再用head -1输出筛选出的内容的第1行。

grep
1、在文件中查找f 所在行并显示行号。-n 为显示行号。
[root@CDH171 script]# cat 20230102.txt |grep -n “f”
2:##find
4:find / -name 20230102.txt |xargs -exec rm
6:find / -perm 775
8:find ./ -mtime +10
10:find ./ -mtime -10

文件中找到wall 或者是well 所在的所有行并显示
cat grep_file.txt|grep ‘w[ea]ll’
文件中找到”非well” 所在的所有行并显示
cat grep_file.txt|grep ‘w[^e]ll’
grep -i 忽略大小写
grep -n 显示行号

grep -E 表示过滤 多个参数
[root@CDH171 script]# cat 20230102.txt |grep -E “exec|10”
find / -name 20230102.txt |xargs -exec rm
当前目录下修改时间超过10天的文件
find ./ -mtime +10
当前目录下修改时间10天以内的文件
find ./ -mtime -10

awk : 以字段为单位进行处理(其实就是把一行的数据分割,然后进行处理)
1.$0 代表一整行的数据
2.$1 代表第一个字段,用人的话来说就是第一列的数据
3.$2 该行中的第2个列
4.NF 每一行拥有的字段总数 列总数
5.NR 目前处理的是第几行的数据
6.FS 目前的分隔字符
7.命令格式 :awk ‘条件{命令1} 条件{命令2}…’ file_name

[root@CDH171 script]# awk ‘{print “该行数据为:”$0 "该行列数为:“NF " 目前是第"NR"行”}’ grep_file.txt
该行数据为:well wall该行列数为:2 目前是第1行
该行数据为:waell weall该行列数为:2 目前是第2行
该行数据为:qaz wsx edc该行列数为:3 目前是第3行
该行数据为:qwedew rfcec该行列数为:2 目前是第4行
该行数据为:evhril该行列数为:1 目前是第5行
该行数据为:well该行列数为:1 目前是第6行
该行数据为:cewellcwekacvm该行列数为:1 目前是第7行
该行数据为:wwwellwwweall e WEFC rvea aerc eawc该行列数为:6 目前是第8行
该行数据为:wall wa ef aefcer freal efac该行列数为:6 目前是第9行

sed
sed编辑器会将所有命令作用到该地址区间内的所有行上。从第3行到最后一行
sed '3,${

s/brown/green/
s/lazy/active/
}’ data1.txt
The quick brown fox jumps over the lazy dog.
The quick brown fox jumps over the lazy dog.
The quick green fox jumps over the active dog.
The quick green fox jumps over the active dog.

sed -d 删除
删除第2 第3行
sed ‘2,3d’ data6.txt
删除第1 ~ 3行
sed ‘/1/,/3/d’ data6.txt

模式匹配删除含有number 1的这行。
sed ‘/number 1/d’ data6.txt
This is line number 2.
This is line number 3.
This is line number 4.

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值