从windows上传文件到linux,去除^M字符,sed -e ‘s/^M/\n/g’filename
sort:
sort -rg -t \t -k 7 4247779962374195861.txt
-g 按自然文本排序
-t 分隔符
-k 根据第几列排序
-r (默认从大到小排序,加-r表示小到大排)
-u 去重排序 (sort fname|uniq == sort -u fname)
sort -rg -t \t -k 7 total_result.csv > total_result.csv.sorted
sort -rg -t \t -k 7 total_result.csv.bak > total_result.csv.bak.sorted
diff:
diff total_result.csv.sorted total_result.csv.bak.sorted > total_result.diff
uniq:
-c 在目标文本的第一行显示该行内容出现的次数,用" "分割
-d 显示重复出现过的行
-u 显示只出现一次的行
awk:
#awk处理多个文件:
awk 'NR==FNR {a[$0]} NR>FNR&&!($0 in a) {print $0}' fa fb
awk -F "," '{if(ARGIND==1){f[$8]=1}else{if(!($8 in f)){print $0}}}' ../src_data/total_result.csv.bak ./inAoi_poiinfos > ./has_ps_before
#awk多字符分割,以及正则表达式匹配
awk -F"\",\"" '$13~/match_online/ && $23!~/d/ && $25!~/1/ && (0 + $14) < 100 {print }'
#awk的gsub函数实现字符串的替换
echo abc\",\"abcd |awk -F \",\" '{oriname=$1;shortname=$2;gsub(oriname,"",shortname);print shortname}'
vi模式:
1. 插入模式
2.命令模式:(命令中有字母的话,必须确保是英文输入法,要不然会怀疑人生)
查找单词:
光标移动至需查找的单词--》shift+3-->n/shift+n在查出的单词之间跳转
进入插入模式:
a :在光标后开始插入
A :在行尾开始插入
i :从光标所在位置前面开始插入
I :从光标所在列的第一个非空白字符前面开始插入
o :在光标所在列下新增一列并进入输入模式
O :在光标所在列上方新增一列并进入输入模式
光标移动:
光标换行移动:
换屏移动:
C-b 向上滚动一屏
C-f 向下滚动一屏
C-u 向上滚动半屏
C-d 向下滚动半屏
C-y 向上滚动一行
C-e 向下滚动一行
换行移动:
文件首尾移动:
G:光标移至最后一行
gg:光标移动至第一行
同页首位移动:
H :光标移至屏幕顶行
M :光标移至屏幕中间行
L :光标移至屏幕最后行
多行跳跃移动:
nG:光标移至第n行首
n+ --》enter:光标下移n行
n- --》enter:光标上移n行
同行移动:
首尾跳跃移动:
0 :光标移动至行首(物理意义的行首)
shift+6(注意必须是英文输入法):将光标移动到该行第一个字符处
shift+4(注意必须是英文输入法):将光标移动到该行最后
单词跳跃移动:
w :向前移动一个单词,将符号或标点当作单词处理
W :向前移动一个单词,不把符号或标点当作单词处理
b :向后移动一个单词,把符号或标点当作单词处理
B :向后移动一个单词,不把符号或标点当作单词处理
字符跳跃移动:
h :光标左移一格
l :光标右移一格
j :光标下移一行
k :光标上移一行
复制/粘贴:
yy: 复制当前行
yw: 复制一个单词
y$: 复制光标到结尾(包含光标)
y^: 复制行首到光标(不包含光标)
nyy: 复制n行
nyw: 复制n个单词
m,ny复制m到n行内容。
p: 粘贴在光标后(不包含光标),如果是整行,这粘贴在光标下一行。
P: 粘贴在光标前(不包含光标),如果是整行,这粘贴在光标上一行。
删除:
d^:删除从行首到当前光标所在位置的内容。
d$:删除从当前光标所在位置到行末的内容。
dw:删除从当前光标所在位置到字末的内容。
3dd:从当前光标所在位置向下删除3行。
3.末行模式:
vi查找:
/需查找单词-->n/shift+n在查出的单词之间跳转
vi文本替换:
:s/old/new (把当前行第一次出现的old字符串替换成new字符串)
:s/old/new/g (把当前行出现的所有old字符串替换陈gnew字符串)
:%s/old/new/g (把文件中出现的所有old字符串替换陈gnew字符串)
:10,20s/old/new/g (把文件中第10到20行出现的所有old字符串替换陈new字符串)
vi文本多行移动、复制添加、删除:
:n1,n2 m n3 移动n1-n2行(包括n1,n2)到n3行之下;
:n1,n2 co n3 复制n1-n2行(包括n1,n2)到n3行之下;
:n1,n2 d 删除n1-n2行(包括n1,n2)行;
:1,$y 复制全部字符
vi多行文本缩进:
:set sw = 4 设置每次缩进的空格数
:1,10>> 1->10行向后缩进一个word space
:1,10<< 1->10行向前缩进一个word space
shell 整型变量自增(加1)的几种方法
#!/bin/sh
a=1
a=$(($a+1))
a=$[$a+1]
a=`expr $a + 1`
let a++
let a+=1
((a++))
echo $a
整数运算
article_num=$[$num * 20 /100]; #`echo "num*0.2"|bc`;
浮点数运算
activity_num=`echo "scale=2;$num*0.01"|bc`;
当你 exit 0 的时候,在调用环境 echo $? 就返回0,也就是说调用环境就认为你的这个程序执行正确
当你 exit 1 的时候,一般是出错定义这个1,也可以是其他数字,很多系统程序这个错误编号是有约定的含义的。
但不为0 就表示程序运行出错。 调用环境就可以根据这个返回值判断 你这个程序运行是否ok。
引用配置文件:. $path/file 不支持正则表达式如 *或者 *.*
得到时间格式字符串
$`date +%Y%m%d%H%M%S`
20161016021612
shell用变量的值作为新的变量名
str=java
java_new="wo xiang yao de"
tmp=${str}_new
dest=`eval echo '$'$tmp`
echo ${dest} #wo xiang yao de
shell:数组
ip=(ip1 ip2 ip3) //数组
for i in ${ip[@]} //数组
do
echo ssh root@ $i
done
shell:关联数组
declare -A a # 声明关联数组(必须有此句)
a=(["apple"]="a1" ["banana"]="b2" ["carrot"]="c3") # 初始化关联数组
echo ${#a[*]} # 获取元素个数
echo ${a["carrot"]} # 获取元素值
a["durian"]="d4" # 插入或修改元素
echo ${!a[*]} # 获取所有的key
unset a["banana"] # 删除元素
# 遍历数组(仅value)
for i in ${a[*]}
do
echo ${i}
done
# 遍历数组(key和value)
for key in ${!a[*]}
do
echo "${key} ==> ${a[${key}]}"
done
unset a # 清空数组
给你几个题,抽时间做一下,不会的百度,,
就掌握linux文本处理的常用方式了,,
需要写shell代码
0. 一个文件aaa.txt有100000数据,
需求:
把aaa.txt中的数据倒序输出到bbb.txt
1. 前提条件:
dir下有文件,也有文件夹,
并且所有的文件里的数据,字符串之间是用制表符\t分割,
需求:
1.1把dir下所有的文件里的abc替换成cba
1.2把dir下所有的文件里的第二列中包含的abc,替换成cba
2. 有两个文件111.txt,222.txt
分别有三个字段id、name、desc 三个字段之间用制表符\t分割,
需求:
2.1 把111.txt中有,222.txt中没有的内容输出到333.txt,
2.2 把222.txt中的内容添加到111.txt后,并输出到444.txt
2.2 把111.txt,222.txt中共有的内容输出到555.txt
3. 一个文件中有三列数据,每列之间用制表符\t分割,
第二列表示用户名,有重复
需求:
3.1 输出文件中出现过的所有的用户名(一个用户名输出一次)