Используйте debugfs на ext2/3/4. Сначала найдите индекс на основе блока:
debugfs -D -R "icheck $sda3block4096" /dev/sda3
затем используйте этот номер инода для запроса файла:
debugfs -D -R "ncheck $inode" /dev/sda3
Попробуйте это:
awk 'BEGIN{FS=OFS=","} f{skip} NF!=2||!length($1)||!length($2){f=1} END{if (f) {print "File contains malformed lines"; exit 1}}' file.csv
If будет устанавливать флаг f
каждый раз, когда файл не содержит двух,
-разделенных полей или любое из двух обязательных полей пусто. В конце он выводит сообщение, если флаг был установлен при анализе файла, и завершается с кодом ошибки 1 (в соответствии с вашим запросом ).
Первое правило пропускает синтаксический анализ строки, если флаг уже был установлен, чтобы ускорить процесс, так как вы хотите знать только, есть ли какая-либо искаженная строка -, поэтому, как только такая строка будет найдена, мы узнаем, что файл имеет неправильный формат и не требует рассмотрения остальной части файла.
Если вы хотите узнать, сколько строк было искажено, это небольшое изменение напечатает его:
awk 'BEGIN{FS=OFS=","} NF!=2||!length($1)||!length($2){f++} END{if (f) {printf("File contains %d malformed line(s)\n",f); exit 1}}' file.csv
Другой параметр awk:
awk 'BEGIN{FS=OFS=","}NF!=2||$1==""||$2==""{print "Not enough fields";exit 5}' file.csv
Он явно проверяет, пусто ли какое-либо из двух полей. Если это так, он печатает сообщение и немедленно завершает работу с кодом ошибки 5 (этот номер произвольный, выберите тот, который вам больше всего нравится ).
Я не уверен, но ДУМАЮ, что вы ищете:
awk -F',' 'NF!=2 || /^,|,$/{print "bad:", NR | "cat>&2"; exit 1}' file
, который можно улучшить, чтобы сообщать о конкретной ошибке (s )в строке:
awk -F',' '
NF<2 { err="too few fields" }
NF>2 { err="too many fields" }
/^,|,$/ { err=(err == "" ? "" : err " and ") "empty fields" }
err != "" { print err, "at line", NR | "cat>&2"; exit 1 }
' file
или если вы хотите найти все ошибки во всех строках сразу:
awk -F',' '
NF<2 { err="too few fields" }
NF>2 { err="too many fields" }
/^,|,$/ { err=(err == "" ? "" : err " and ") "empty fields" }
err != "" { print err, "at line", NR | "cat>&2"; err=""; f=1 }
END { exit f }
' file
Вот небольшая функция, использующая grep. Его код выхода будет равен 0, если нет недопустимых строк, и будет равен 1, если хотя бы 1 недопустимая строка (в этом случае печатается первая недопустимая строка и обработка прерывается -дальнейшие строки не проверяются ).
Используемое регулярное выражение означает в начале строки один или несколько символов, не являющихся запятыми, за которыми следует 1 запятая, а затем один или несколько символов, не являющихся запятыми. запятая, а дальше ничего .
lines_are_valid() {
grep -E -m1 -v '^[^,]+,[^,]+$' && return 1 || return 0
}
Как пользоваться:
cat myFile | lines_are_valid
Еще примеры:
echo 'this_is_caryze,log_low=53687091200
let_me_know_what_to_do,log_high=1073741824
look_on_the_room,' \
| lines_are_valid \
&& echo "All lines OK" \
|| echo "Invalid line found, see above"
look_on_the_room,
Invalid line found, see above
echo 'this_is_caryze,log_low=53687091200
let_me_know_what_to_do,log_high=1073741824
look_on_the_room,aaa' \
| lines_are_valid \
&& echo "All lines OK" \
|| echo "Invalid line found, see above"
All lines OK
echo 'this_is_caryze,log_low=53687091200
let_me_know_what_to_do,log_high=1073741824
look_on_the_room,,
also wrong,' \
| lines_are_valid \
&& echo "All lines OK" \
|| echo "Invalid line found, see above"
look_on_the_room,,
Invalid line found, see above
echo 'this_is_caryze,log_low=53687091200
let_me_know_what_to_do,log_high=1073741824
look_on_the_room,,asdfasdf
also wrong,' \
| lines_are_valid \
&& echo "All lines OK" \
|| echo "Invalid line found, see above"
look_on_the_room,,asdfasdf
Invalid line found, see above
Если вы хотите показать все недопустимые строки:
show_all_invalid_lines() {
grep -E -v '^[^,]+,[^,]+$' && return 1 || return 0
}
Входной файл
cat op.txt
why_we_need_help,log_low=53687091200
whats_is_going_on,log_high=1073741824
this_is_caryze,log_low=53687091200
let_me_know_what_to_do,log_high=1073741824
look_on_the_room,log_low=53687091200
look_on_the_room,
,ajay
Авк-команда
awk -F "," 'NF == "2" {print $0}' filename | sed "s/,/ /g"| sed -n '/\s\{2,\}/!p'| awk '{gsub(" ",",",$0);print}'
выход
why_we_need_help,log_low=53687091200
whats_is_going_on,log_high=1073741824
this_is_caryze,log_low=53687091200
let_me_know_what_to_do,log_high=1073741824
look_on_the_room,log_low=53687091200
Питон
#!/usr/bin/python
import re
u=re.compile(r' {2,}')
k=open('filename','r')
for i in k:
q=re.sub(","," ",i)
if not re.search (u,q):
print q.replace(" ",",").strip()
выход
why_we_need_help,log_low=53687091200
whats_is_going_on,log_high=1073741824
this_is_caryze,log_low=53687091200
let_me_know_what_to_do,log_high=1073741824
look_on_the_room,log_low=53687091200