如何在BASH条件中检查文件是否有多于1行?

时间:2014-09-20 08:57:15

标签: bash conditional

我需要检查一个文件是否有多行。我试过这个:

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行?

6 个答案:

答案 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

您需要第一列 - 您可以使用awkcut或您选择的任何其他实用程序提取它。

答案 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" ]