曾经有一同事问我,在linux下如何输出一个文本文件的第二列,文本内容不限。我不假思索地说用 awk 啊。她追问只有这一种方式么?于是我仔细想了想,……
成都创新互联公司专注于中大型企业的成都做网站、网站建设和网站改版、网站营销服务,追求商业策划与数据分析、创意艺术与技术开发的融合,累计客户千余家,服务满意度达97%。帮助广大客户顺利对接上互联网浪潮,准确优选出符合自己需要的互联网运用,我们将一直专注成都品牌网站建设和互联网程序开发,在前进的路上,与客户一起成长!
既然内容不限,则可以自定义文件内容的格式,这样可以用的命令自然会多一些。
需求为输出文件第二列,则基本上有两种方式实现:
因而,任何能直接输出特定列的命令,以及能够截取或删除其它列的命令都满足此需求。
为了方便说明,列举几个示例文件:
awk自然是最容易想到的,它处理格式化的文本得心应手。
使用 -F 指定列(字段)分隔符。
如果文件只有两列,还可以使用 $NF ,如 awk '{print $NF}' test1.txt 。
awk还支持一些函数,同样可以将第二列提取出来,此处不再赘述。
cut命令的默认字段分隔符是 TAB ,可以使用 -d 重新指定。 -f 列出指定字段。
如果第二列的字符的起始和结束序号为固定值,如test2.txt,可以使用 -c 参数,截取特定的字符序列。
sed采用的是第二种实现方式,即将其它列删除掉,利用 后向引用 :
在test1.txt中,第二列的前面和后面分别为数字空格和空格数字,所以可以利用 正则表达式 将其输出出来。
同理:
colrm命令可以删除标准输入中的指定列,但 该命令中所定义的列指的是单个字符 ,这与常规对字段的定义不同,需注意。
格式如下:
如果只指定start,则大于等于start的列均被删除;如果指定了start和stop,则大于等于start,小于等于stop的列被删除。
因此,此命令可处理第二个字段起始位置为固定值的test2.txt文件。
read读取文件中的每行,将特定的列输出来。
shell支持命令替换,通过两次命令替换,得到第二列:
虽然不清楚她从哪里看到的这道题目,题目本身是何用意。但以一个问题,调动起了对linux多个命令及知识点的学习和总结,还是有价值的。
欢迎提出不同解法!
相关命令
可以。
cut -d" " -f2 filename
意思就是我以空格为列的分隔符,提取第二列
或者使用awk
awk '{print $2}' filename
awk默认以空格为分隔符,打印第二列
1. 如果你只想看文件的前100行,可以使用head命令,如
head -100 filename
2. 如果你想查看文件的后100行,可以使用tail命令,如:
tail -100 filename 或 tail -n 100 filename
3. 查看文件中间一段,你可以使用sed命令,如:
sed -n '100,200p' filename
这样你就可以只查看文件的第100行到第200行。
截取的文件可以用重定向输入到新的文件中:
head -100 filename a.txt
也可以在robot里面使用read 打印出来
使用命令:
ps -aux | grep tomcat/8080
方法二:直接使用 netstat -anp | grep portno
即:netstat –anp | grep 8080
查看端口命令
linux替换目录下所有文件中的某字符串
比如,要将目录/modules下面所有文件中的zhangsan都修改成lisi,这样做:
sed -i "s/zhangsan/lisi/g" `grep zhangsan -rl /modules`
解释一下:
-i 表示inplace edit,就地修改文件
-r 表示搜索子目录
-l 表示输出匹配的文件名
linux查找目录下的所有文件中是否含有某个字符串
查找目录下的所有文件中是否含有某个字符串
find .|xargs grep -ri "php"
查找目录下的所有文件中是否含有某个字符串,并且只打印出文件名
find .|xargs grep -ri "php" -l
ip addr 查看ip地址
我也给个思路吧 —— 用sed根据地址范围截取文件内容,用Here documents方法添加新的多行内容,然后重组文件。具体步骤如下:
1)截取test.xml文件起始行到abcdef行,保存到tmp文件;
2)将要添加的内容根据变量值展开,附加写入tmp文件;
3)截取test.xml文件/abcdef行到结束行,附加写入tmp文件。
4)移动tmp文件覆盖test.xml文件。
代码:
12345678910111213#!/bin/sh$hostnames="host1,host2,host3 ..."$paragraph="many_strings"sed -n '1,/^abcdef/p' test.xml tmpcat EOF tmpfor hname in `echo "$hostnames" | tr ',' ' '`do insert $hname insert $paragraphdoneEOFsed -n '/^\/abcdef/,$p' test.xml tmpmv tmp test.xml
注意:
1) for a in b 结构中,b集合里的内容必需要空格分隔。所以我这里做了转换,用tr命令将逗号分隔改为了空格分隔。
2)第二个EOF必需顶格写,前面不能有空格。
一、从第3000行开始,显示1000行。即显示3000~3999行
cat filename | tail -n +3000 | head -n 1000
二、显示1000行到3000行
cat filename| head -n 3000 | tail -n +1000
注意两种方法的顺序
分解:
tail -n 1000:显示最后1000行
tail -n +1000:从1000行开始显示,显示1000行以后的
head -n 1000:显示前面1000行
三、用sed命令
sed -n '5,10p' filename 这样就可以只查看文件的第5行到第10行。
命令:相关显示命令有sed,tail,cat.awk,head等,可以常看Linux命令大全,man命令或者help命令查看相关用法。我们只介绍其中的一部分。
一、sed命令
#sed --help;查看具体使用规则:
#sed -n 'xp' filename;显示文件X行命令:
#sed -n 'x,yp' filename;显示文件X行到Y行的内容: