我需要检查一个文件是否有多行。我试过这个:
if [ `wc -l file.txt` -ge "2" ]
then
echo "This has more than 1 line."
fi
if [ `wc -l file.txt` >= 2 ]
then
echo "This has more than 1 line."
fi
这些只是报告错误。如何在BASH条件中检查文件是否有多于1行?
答案 0 :(得分:31)
命令:
wc -l file.txt
将生成如下输出:
42 file.txt
wc
也有助于告诉您文件名。这样做可以防止您同时查看大量文件,并希望获得个人数据和总数据:
pax> wc -l *.txt
973 list_of_people_i_must_kill_if_i_find_out_i_have_cancer.txt
2 major_acheivements_of_my_life.txt
975 total
您可以通过在标准输入上提供数据来阻止wc
执行此操作,因此它不会知道文件名:
if [[ $(wc -l <file.txt) -ge 2 ]]
以下成绩单显示了这一点:
pax> wc -l qq.c
26 qq.c
pax> wc -l <qq.c
26
顺便说一句,您会注意到我已切换到使用[[ ]]
和$()
。
我更喜欢前者,因为它由于向后兼容性(主要与字符串拆分有关)而导致的问题较少,后者因为嵌套可执行文件要容易得多。
答案 1 :(得分:5)
使用mapfile
的纯粹bash(≥4)可能性:
#!/bin/bash
mapfile -n 2 < file.txt
if ((${#MAPFILE[@]}>1)); then
echo "This file has more than 1 line."
fi
mapfile
内置函数存储从数组stdin
中读取的内容(默认情况下为MAPFILE
),每个字段一行。使用-n 2
使其最多读取两行(为了提高效率)。之后,您只需要检查数组MAPFILE
是否包含多一个字段。这种方法非常有效。
作为副产品,文件的第一行存储在${MAPFILE[0]}
中,以备不时之需。你会发现尾部换行符没有被修剪。如果需要删除尾随换行符,请使用-t
选项:
mapfile -t -n 2 < file.txt
答案 2 :(得分:4)
怎么样:
if read -r && read -r
then
echo "This has more than 1 line."
fi < file.txt
需要-r
标记以确保换行字符不会将两行折叠成一行,这会导致以下文件仅报告一行:
This is a file with _two_ lines, \
but will be seen as one.
答案 3 :(得分:3)
if [ `wc -l file.txt | awk '{print $1}'` -ge "2" ]
...
您应该始终检查每个子命令返回的内容。命令wc -l file.txt
以下列格式返回输出:
12 file.txt
您需要第一列 - 您可以使用awk
或cut
或您选择的任何其他实用程序提取它。
答案 4 :(得分:1)
如果要处理大文件,此awk
命令比使用wc
快得多:
awk 'BEGIN{x=0}{if(NR>1){x=1;exit}}END{if(x>0){print FILENAME,"has more than one line"}else{print FILENAME,"has one or less lines"}}' file.txt
答案 5 :(得分:1)
更改
if [ `wc -l file.txt` -ge "2" ]
到
if [ `cat file.tex | wc -l` -ge "2" ]